软件工程第六版全书总结笔记

软件工程

(!!!重在理解基本原理和概念,不要陷于工具的细节!!!)

第一章软件工程学概述

  • 软件工程诞生的背景为了更有效的开发与维护软件

  • 软件危机:计算机软件的开发维护过程中所遇到的一系列严重问题,主要表现如下

    • 软件成本不准确
    • 用户对结果不满意
    • 软件质量不行
    • 软件维护性差
    • 软件缺乏必要的文档资料
  • 软件工程:指导计算机软件开发维护的一门工程学科,包括开发技术开发管理两方面内容,中心课题是控制复杂性

    ​ 本质特性:1.软件工程关注于大型程序的构造 2.控制复杂性 3.软件经常变化 4.开发效率 5.团队合作

    ​ 6.支持的用户 7.一种文化背景替另一种文化背景的人创造产品

  • 简化结构化范形和面向对象范型的要点,并分析他们的优缺点

结构化范型:又称传统方法学。优点:把软件生命周期划分为多个阶段,每个阶段独立且简单,便于不同人员分工合作
缺点:当工程庞大时,或者对用户需求模糊时,开发往往不成功,且维护困难
对象范型:降低了软件复杂性,提高了软件可理解性,简化了维护和开发工作。

  • 软件过程:为了获取高质量软件所需要完成的一系列任务的框架。

  • 软件工程方法3要素:方法、工具和过程

  • 软件生命周期:软件定义、软件开发、运行维护

    ​ 详细的解说:问题定义-----可行性研究-----需求分析-------总体设计----详细设计----------编码---------单元测试-----------综合测试---------软件维护

  • 软件过程模型包括:瀑布模型、快速原型模型 、增量模型 、螺旋模型 、喷泉模型

瀑布模型:需求分析---->规格说明---->设计-------->编码------->综合测试------->维护
优点:它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导。虽然有不少缺陷但比在软件开发中随意的状态要好得多。
缺点:太理想,客户难以表达真正需求,并且要到开发后期才能看到程序测试,若出错,客户直接崩溃
快速原型模型:快速原型---->变化的需求----->规格分析---->设计------>编码------>综合测试----->维护
优点:快速搭建一个模型,让用户体验,通过实践来提出需求 缺点:可能因为先天性不足,开发者要不断折中。
增量模型:需求分析----->规格说明----->概要设计----->一个一个模块做功能----->维护 优点:一个构件一个构件的提交产品,使用户有充裕的时间学习和适应新产品。从而减少一个全新的软件给用户带来的冲击
缺点:自始至终和用户纠缠在一起,直到完全版本诞生
螺旋模型:快速原型(风险分析)---->变化的需求(风险分析)----->规格分析(风险分析)---->设计(风险分析)------>编码(风险分析)------>综合测试(风险分析)----->维护
优点:对于大型系统及软件的开发,这种模型是一个很好的方法。开发者和客户能够较好地对待和理解每一个演化级别上的风险
缺点:需要相应的风险评估技术,随着项目增大,风险也就越大,风险评估经费也就越大
喷泉模型:需求分析---->面向对象分析---->面向对象设计—>编码阶段---->集成和测试阶段----->运行阶段---->进一步开发或者维护
优点:提升项目开发效率,缩短研发周期,体现了面向对象开发过程迭代和无缝的特性。 缺点:难以管理,各个环节都是重叠的
Rational统一过程(PUR):在迭代的开发过程、管理需求、基于构件的体系结构、可视化建模、验证软件质量、控制软件变更等方面提供了必要准则,建立了简介和透明的过程结构,确保全体成员共享相同知识基础,描述了如何提取、组织系统的功能性需求和约束条件,并将他们文档化。
Rationnal统一过程主要适用于何种项目 ?-------大型的需求不断变化的复杂软件系统项目 缺点:RUP只是一个开发过程,并没有涵盖软件过程的全部内容
极限编程为代表的敏捷过程::广泛用于需求模糊且经常改变的场合,更快更敏捷。作为RUP的补充
微软过程:可以把微软看作一个精简的RUP,整个过程包含若干个生命周期的持续递进循环, 可以把微软过程看做敏捷过程的扩充版本,扩充了每个生命周期内的各个阶段的具体工作流程

  • 为什么说喷泉模型较好的体现了面向对象软件开发过程无缝和迭代的特性?

因为使用面向对象方法学开发软件时,各个阶段都使用统一的概念和表示符号,因此,整个开发过程都是吻合一致的,或者说是无缝连接的,这自然就很容易实现各个开发步骤的反复多次迭代,达到认识的逐步深化,而喷泉模型则很好的体现了面向对象软件开发过程迭代和无缝的特性。

  • 敏捷过程的适用范围:适用于商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束。

  • 微软过程的适用范围:适用于商业环境下具有有限资源和有限开发时间约束的项目的软件过程模式。

总结: 对软件工程的基本原理和方法由了概括的本质认识,通过把软件生命周期分为若干个独立阶段,每个阶段分配一些确定任务,在完成每个阶段的任务时采用结构化技术和适当软件工具,在每个结束之前都要进行技术审查和管理复审。但是,当软件规模庞大需求模糊时,生命周期法往往不成功,被面向对象法取代。软件过程是为了获得高质量产品的框架,规定了完成各项任务的工作步骤,提出了8个模型,即瀑布模型、…、微软过程。


第二章可行性研究

  • 可行性研究目的:用最小的代价在尽可能短的时间判断问题是否能够解决,只是判断能否解决,不是解决!
  • 研究可行性的三个方面:技术可行性、经济可行性、操作可行性。
  • 掌握:会根据题目通过可行性3个方面进行判断可行性即可,还要会画数据流图进行分析,找出可行性方案。

总结:可行性研究进一步谈论问题定义阶段所确定的问题是否有可行解,在对问题正确的定义基础上,通过分析问题,导出试探性的解,然后复查并修改,反复这个过程,最终提出一个符合系统目标的高层次的逻辑模型。然后根据系统的这个逻辑模型设想可能的物理系统,并分析物理系统的可行性,最后提交负责人批准。在分析过程中,系统流程图是一个很好的工具,实际上就是数据流图(常和数据字典共存)。还要分析成本效益问题。


第三章 需求分析

  • 背景:虽然在可行性研究阶段已经粗略地了解了用户的需求,甚至还提出了一些可行方案,但是,还有很多细节被忽略。

  • 需求分析:是软件定义时期的最后一个阶段,确定系统必须完成哪些工作【注意:不是确定系统怎样完成它的工作】

    任务:1.问题识别 2.分析与综合,导出软件的逻辑模型 3.编写文档

  • 实体-联系图(ER图),包含实体、关系、属性3基本成分。

  • 通常用范式来定义消除数据冗余的程度。第一范式(1NF)数据冗余程度最大,第五范式数据冗余程度最小,因为,范式级别越高,存储同样数据就需要分解成更多张表,因此存储自身的过程也就越复杂。大多数情况都选用第三范式。

  • 需求分析对系统的要求:1.性能2.可靠性3.出错处理需求4.接口需求5.约束6.未来可能提出的要求

  • 怎么和用户沟通获取需求:1.访谈 2。快速建立软件原型 3…

  • 3种图形工具:层次方框图(树形图) 、Warnier(大括号树型分类图)、IPO(表单图) 用途:辅助描绘系统中的数据结构

  • 从哪些方面验证软件需求的正确性?

    1.一致性 2.完整性 3.现实性 4.有效性

  • PSL/PSA系统:对应用进行文档描述,减少管理和维护费用,让数据存放在数据库中.

总结:传统软件工程方法学使用结构化分析技术,完成分析用户需求的工作,第一步是了解用户所处情况,深入交流,对用户基本要求反复细化逐步求精,得到对目标系统的完整准确需求,并预测系统的发展前景。访谈是与用户通信的历史悠久的技术,从可行性研究阶段得到的数据流图出发,在用户协助下面向数据流自顶向下逐步求精。快速建立软件模型是最准备、最有效、最强大的需求分析技术。为了更好的理解问题,人们常采用建立模型的方法,即结构化分析实质上就是建模活动,在需求分析阶段通常建立数据模型、功能模型、行为模型。多数人习惯用实体联系图(ER图)建立数据模型,使用数据流图建立功能模型,使用状态图建立行为模型。数据字典是这三种模型的粘合剂,提供可理解性。


第四章 形式化说明技术

  • 非形式化方法:用自然语言描述需求规格说明(可能存在抽象层次混乱、矛盾等问题)

  • 半形式化方法:实体-联系图建立模型描述需求规格说明

  • 形式化方法:利用数学来描述需求规格说明

  • 形式化的三种方法:有穷状态机、Petri网、Z语言

  • 有穷状态机:状态+事件+谓语=>下一个状态

  • Petri网:系统中隐含的定时问题。(定时问题:同步问题、竞争条件、死锁等问题,可能因为设计不合理造成)

  • Z语言:描述形式化的一种语言。

  • 对比形式化和非形式化的优缺点

形式化:1.简述准确的描述物理现象,对象获取动作的结果
2.可以在不同软件工程活动之间平滑的过度
3.提供了高层确认的手段 缺点:主要关注系统的功能和数据,而时序的问题,控制和行为等方面的需求难于表示
非形式化:难度低 缺点: 存在矛盾、二义性、不完整、抽象层次混乱等问题

总结:形式化方法目前没有广泛应用,但是与其他方法比较,确实有实质性优点,消除了二义性,鼓励在软件工程早期就使用更严格的方法,减少差错,但是方法很难学习,且主要关注系统的功能和数据,而时序的问题,控制和行为等方面的需求难于表示。


第五章 总体设计

  • 背景:经过需求分析阶段的工作,系统必须“做什么”已经清楚了,现在是决定“怎么做”的时候了。

  • 总体设计通常有两个主要阶段组成:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构。

  • 总体设计的9个步骤:

    1.设想供选择的方案 2.选取合理的方案 3.推荐最佳方案 4.功能分解 5.设计软件结构 6。设计数据库

    7.制定测试计划 8.书写文档 9.审查和复审

  • 设计原理模块化、抽象、逐步求精、信息隐藏和局部化、模块独立

  • **模块化:**就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成制定的功能满足用户的需求。

  • 抽象:认识复杂现象所使用的工具,只考虑事物本质的共同特性,忽略细节和其他因素

  • 信息隐藏:将模块实现自身功能的细节与数据隐藏起来,模块间仅交换与完成系统功能所必须的信息。

  • 理解:软件工程过程的每一步都是对软件解法的抽象层次的一次精化。在可行性研究阶段,软件作为系统的一个完整部件;在需求分析阶段,软件解法是使用在问题环境内熟悉的方式描述的;当总体设计向详细设计过渡时,抽象的程序也就随之减少了;最后,当源程序写出来以后,也就到达了抽象的最低层。

  • 逐步求精:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。作用:帮助软件工程师把精力集中在与当前开发阶段最相关的那些方面,忽略那些虽然重要,但是目前还不需要考虑的细节。

  • 模块独立:将一个工程分成多个模块功能,各司其职。

  • 衡量模块独立程度的两个标准:内聚和耦合

  • 耦合:对一个软件结构内不同模块之间互连程度的度量,耦合强弱取决于模块间接口的复杂程度

数据耦合是低耦合:系统中必须存在这种耦合
控制耦合是中耦合:传递信息中有控制信息,但是继续把模块适当分解之后通常久可以用数据耦合代替它了
特征耦合:被调用的模块可以使用的数据多余它确实需要的数据,会导致对数据的访问失去控制。
公共环境耦合:当两个或多个模块通过一个公共数据环境相互作用时
内容耦合是高耦合:坚决避免使用内容耦合。内容耦合的条件:1.一个模块访问另一个模块的内部数据。2.一个模块不通过正常入口而转到另一个模块的内部。3.两个模块有一部分代码重叠.4.一个模块有多个入口。
规则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共耦合范围,不用内容耦合

  • 内聚:标志着一个模块内各个元素彼此结合的紧密程度,力求高内聚

低内聚包括偶然内聚,逻辑内聚,时间内聚 中内聚包括过程内聚,通信内聚 高内聚包括顺序内聚,功能内聚
偶然内聚:一个模块完成一组任务,这些任务彼此间即使有关系,关系也松散,各种元素之间没有实际关系,错误率高于其他模块(0分) 逻辑内聚:一个模块完成的任务在逻辑上属于相同或相似的一类,不同功能混在一起,修改会影响全局。(1分)
时间内聚:一个模块包含的任务必须在同一时间内执行(3分)
过程内聚:一个模块内的处理元素是相关的,而且必须以特定次序执行(5分) 通信内聚:所有元素都是用同一个输入数据和产生同一个输出数据(7分)
顺序内聚:一个模块内的处理元素和同一个功能密切相关,且必须顺序执行。(9分) 功能内聚:所有处理元素属于一个整体,完成一个单一的功能。(10分)

  • 描述软件结构的图形工具:层次图、HIPO图(比层次图多了编号这个功能,编号有利于追踪了解模块的位置)、结构图(箭头)

  • 数据流图分为:事务流和交换流

    交换流:由输入输出变换三部分组成,是顺序结构

    事务流:它的某个加工,分离成多个发散的数据流,形成许多加工路径,并且根据输入值选择其中一个路径来执行

**总结:**总体设计主要目的是用比较抽象的方式确定系统如何完成预定的任务。主要分为两个小阶段,首先需要进行系统设计,从数据量图出发设想完成系统功能的若干种物理方案。然后进行软件结构设计,确定软件由哪些模块组成以及这些模块之间的动态调用关系(层次图和结构图是描绘软件结构的常用工具)。在进行软件结构设计最主要的原理是模块独立原理。自顶向下逐步求精是进行软件结构设计的常用途径,但是,如果已经有了详细的数据流图,也可以使用面向数据流的设计方法,用形式化的方法由数据流图映射出软件结构。记住,这样映射出来的只是软件的初步结构,还需要设计并改进,得到更合理的结构。在进行详细的过程设计和编写程序之前,首先进行结构设计,其好处正在与可以在软件开发的早期站在全局高度对软件结构进行优化。


第六章 详细设计

  • 详细设计阶段的根本目标:确定怎样具体实现所要求的系统,经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。
  • 结构程序设计:如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
  • 设计问题:系统响应时间、用户帮助设施、出错信息处理和命令交互。
  • 过程设计的工具:程序流程图、盒图、PAD图(二维树形结构)、判定表(多重嵌套条件)、判定树、过程设计语言
  • 面向数据结构的设计方法:Jackson方法
  • 程序复杂程度的定量度量:McCabe方法

**总结:**详细设计阶段的关键任务是确定怎样具体地实现用户需要的软件系统,也就是要设计出程序的蓝图。除了应该保证软件的可靠性外,使将来编写的程序可读性好、容易理解、容易测试、容易修改和维护,是详细设计阶段的最重要目标。结构程序设计技术是实现上述目标的基本保障,是进行详细设计的逻辑基础。人机界面设计是接口设计的一个重要的组成部分,对于交互系统来说,人机界面设计和数据设计、体系结构设计及过程设计一样重要。人机界面的质量直接影响用户对软件产品的接受程度,因此,对人机界面设计必须给予足够重视。


第七章 实现

  • 通常将编码测试统称为实现

  • 编码:把软件设计结果翻译成用某种程序设计语言书写的程序,

  • 测试:为了发现程序中的错误而执行程序的过程

  • 软件测试在软件生命周期中横跨两个阶段。第一个阶段是编写出每个模块之后就对它进行必要的单元测试,由编写者承担这个工作;第二个阶段是综合测试,由专门测试人员承担这项工作。

  • 调试的目的:发现错误,诊断并且纠正错误。调试是测试阶段最困难的阶段。

  • 编码的风格:1.程序内部的文档 2.数据说明 3.语句构造 4.输入输出 5.效率

  • 软件测试准则:1.所有测试都应该能追溯到用户需求 2.应该远在测试开始之前就制定出测试计划 3.把Pateto原理应用到软件测试中

    ​ 4.应该从小测试开始,逐步进行大测试。 5.穷举测试是不可能的。 6.为了达到最佳测试效果,应该由独立的第三方从

    ​ 事测试工作

  • 测试方法:黑盒测试、白盒测试

  • 测试步骤:1.模块测试:每个模块完成一个定义清晰的子功能,并且这个子功能和同级其他模块的功能之间没有相互依赖关系

    ​ 在这个步骤中发现的往往是编码和详细设计的错误。

    ​ 2.子系统测试:经过单元测试的模块放在一起形成一个子系统来测试,模块互相间的协调和通信是这个测试过程中的主要 问题。

    ​ 3.系统测试:把测试的子系统装配成一个完整系统来测试。在这个过程中发现的往往是软件设计中的错误。

    【无论子系统还是系统测试,都具备检测和组装两重含义,通常成为集成测试】

    ​ 4.验收测试:验收测试把软件系统作为单一的实体进行测试,它是在用户积极参与下进行的,而且主要使用实际数据来进行测试。

    ​ 5.平行运行:关系重大的软件在验收之后往往不立即投入生产运行,而是经过一段平行运行时间的考验。平行运行就是同时运行新开发出来的系统和将被他取代的旧系统,比较两者处理结果。

  • 测试阶段的信息流有两类:1.软件配置(需求说明书、设计说明书、源程序清单等) 2.测试配置,包括测试计划和测试方案

  • 单元测试:单元测试集中检测软件设计的最小单元--------------模块。单元测试主要使用白盒测试技术,而且对多个模块的测试可以并行地进行

  • 单元测试重点:1.模块接口:对通过模块接口的数据流进行测试,如果数据不能正常进出,那么所有测试都是不切实际的

    ​ 2.局部数据结构:局部数据结构是最常见的错误来源,比如局部数据说明、初始化、默认值等。

    ​ 3.重要的执行通路。选择测试期间最具有代表性、最可能发现错误的通路测试

    ​ 4.出错处理通路:好的设计应该能够预见出现错误的条件,并设置适当的处理错误的通路。

    ​ 5.边界条件:软件常常在边界失效

  • 集成测试:测试和组装软件的系统化技术,主要目标是发现与接口有关的问题。

  • 由模块组装成程序时有两种方法:一种方法是先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序,这种方法成为非渐增式测试;另一种方法是把下一个要测试的模块结合进来测试,测试完以后再把下一个应该测试的模块结合进来测试,成为渐增式测试(分为自顶向下集成和自底向上集成)

  • 自顶向下测试方法的优点是不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,而且能在早期发现上层模块的接口错误。自顶向下测试方法的主要缺点是需要存根程序,可能遇到与此相联系的测试困难,底层关键模块中的错误发现比较晚,早期不能充分展开人力。自底向上刚好相反。

  • 验收测试(确认测试):验证一个软件功能和性能如同用户所合理期望的那样。

  • 软件测试的步骤:单元测试----集成测试-----确认测试-------系统测试。

  • 回归测试:重新执行已经做过的测试的某个子集,以保证上述这些变化没有带来非预期的副作用。

  • Alpha和Beta测试

共同点:都是为许多客户开发的软件进行测试 不同:
Alpha测试由用户在开发者的场所下进行,在开发者对用户的“指导”下进行测试,开发者负责记录发现的错误和使用中遇到的问题,在受控的环境中进行。
Beta测试由软件的最终用户们在一个或者多个客户场所进行,开发者不能控制环境。用户记录在Beta测试过程中遇到的一切问题,并且定期把这些问题报告给开发者,由开发者修改,并重新发布产品。

  • 白盒子测试法:把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否能按预定要求正常工作。白盒子又称结构测试。包含基本路径测试法、逻辑覆盖。

逻辑覆盖(8种) 语句覆盖:选择足够多的测试数据,使被测程序每个语句至少执行一次
判定覆盖:不仅每个语句必须执行一次,而且每个判定的每种可能的结果都应该至少执行一次。(比上一个强)
条件覆盖:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都去到各种可能的结果(比上一个强)
判定/条件覆盖:选取足够多的测试数据,使得判定表达式中的每一个条件都取到各种可能的值,而且每个判定表达式也都能取到各种可能的结果。(比上一个强)
条件组合覆盖:选取足够多的数据,使得每个判定表达式中条件的各种可能组合都至少出现一次(比上一个强)
点覆盖:选取足够多的测试数据,使得程序执行路径至少经过流图的每个节点一次。
边覆盖:选取足够多的数据,使得程序执行路径至少经过流图中每条边一次 路径覆盖:选取足够多测试数据,使程序的每条可能路径都至少执行一次
基本路径测试(白盒子测试技术)对有关路径分析,完成路径覆盖。步骤:首先计算程序的唤醒复杂度,并用该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真假两种值。
条件测试:能检查程序模块中包含的逻辑条件(比如布尔变量、关系表达式)
循环测试:专注于测试循环结构的有效性(简单循环、串接循环、嵌套循环)

  • 黑盒子测试技术:把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据并产生正确地输出信息,程序运行过程中是否保持外部信息的完整性。黑盒子测试又称为功能测试。包括等价类划分法、边界值法、错误推测法等。

黑盒子致力发现下面类型的错误:
1.功能不正确或者遗漏功能 2.界面错误 3.数据结构错误或者外部数据库访问错误 4.性能错误
5.初始化和终止错误 应用黑盒子技术,能够设计出满足下述标准的测试用例集
1.所设计出的测试用例能够减少未达到合理测试所需要设计的测试用例的总数
2.所设计的测试用例能够告诉人们,是否存在某些类型的错误,而不仅仅指出与特定测试相关的错误是否存在。
等价类划分法:这种技术把程序的输入域划分成若干个数据类,据此到处测试用例。(划分为有效等价类和无效等价类)
划分出等价类以后,根据等价类设计测试方案时主要使用下面两个步骤:
1.设计一个新的测试方案以尽可能多的覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止。
2.设计一个新的测试方案,使它覆盖一个而且之覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被 覆盖为止。 边界值分析:选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。
错误推测:例举出程序中可能又的错误和容易发生错误的特殊情况,并且根据他们选择测试方案,很大程度上靠直觉和经验。

【注意:白盒子测试过程在早期阶段,黑盒子用于后期】

  • 调试:调试作为成功测试的后果出现,也就是说,调试是在测试发现错误之后排除错误的过程。

  • 调试过程总会有以下两种结果:1.找到了问题的原因并把问题改正和排除掉 2.没能找到问题原因,在后一种情况下,调试人员可以猜想一个原因,并设计测试用例来验证这个假设,重复此过程直到找到原因并改正了错误。

  • 调试的途径:1.蛮干法 2.回溯法 3.原因排除法

  • 软件可靠性和可用性:主要差别是 可靠性意味着在0到t这段时间间隔内系统没有失效;而可用性只意味着在时刻t,系统是正常运行的,

**总结:**实现包括编码和测试两个阶段,编码是对软件设计的结果翻译成某种程序设计语言,高级程序设计语言有很多优点。程序内部的良好文档资料,有规律的数据说明格式,简单清晰的语句构造都对提高程序的可读性有很大作用,也在相当大的程度上改进了程序的可维护性。目前软件测试仍然是保证软件可靠性的主要手段,大型软件测试通常分为单元测试、集成测试、验收测试3个基本阶段。测试不仅仅指利用计算机进行的测试,还包括人工进行的测试。白盒黑盒是软件测试的两种基本方法,各有所长,相互补充。在测试过程中发现的软件错误必须及时纠正,这就是调试的任务,必须确定错误的准确位置,这是最困难的工作。测试和调试是软件测试中两个关系非常密切的过程, 往往交替进行。程序中隐藏的错误的数目,直接决定了软件的可靠性。


第八章 维护

  • 维护的任务:保证软件在一个相当长的时期能够正常运行

  • 软件工程的主要目的:提高软件的可维护性,减少软件维护所需要的工作量,降低软件系统的总成本。

  • 软件维护的4项维护活动:1.改正性维护:用户必须会发现程序错误,并且把他们遇到的问题报告给维护人员。(占17-21%)

    ​ 2.适应性维护:为了和变化了的环境适当地配合而进行的修改软件的活动。(占18-25%)

    ​ 3.完善性维护:用户提出新功能或修改已有功能的建议,还可能提出一般性的改进意见。(占50-60%)

    ​ 4.预防性维护:为了改进未来的可维护性或可靠性

  • 结构化维护和非结构化维护:

    非结构化维护:如果软件配置的唯一成分是程序代码,那么维护活动从艰苦的评价程序代码开始,而且常常由于程序内部文档不足而使评价更困难,需要付出很大代价。

    结构化维护:如果有一个完整的软件配置存在,那么维护工作从评价设计文档开始,确定软件的结构、性能、接口。减少了精力的浪费,提高了维护的总体质量。

  • 软件维护过程:1.维护组织 2.维护报告 3.维护的事件流 4.保存维护记录 5.评价维护活动、

  • 决定软件可维护性的因素:1.可理解性 2.可测试性 3.可修改性 4.可移植性 5.可重用性

  • 文档:影响软件可维护性的决定因素,可分为用户文档和系统文档。

软件文档应该满足下述要求:
1.必须描述如何使用这个系统 2.必须描述怎样安装和管理这个系统 3.必须描述系统需求和设计 4。必须描述系统的实现和测试
用户文档:主要描述系统功能的使用方法,并不关心这些功能是怎样实现的。应具备以下功能:
1.功能描述 2.安装文档 3.使用手册 4.参考手册 5.操作员指南
系统文档:描述系统设计、实现和测试等各方面内容

  • 在每个阶段结束前的技术审查和管理审查中,应该着重对可维护性进行复审

  • 怎么做到预防性维护?

    1.反复多次的修改程序,硬改硬尝试 2.再仔细分析程序内部工作细节,有效修改

    3.深入理解原有设计,重新设计、编码、测试 那些需要变更的部分

    4.对程序重新设计、编码、测试。

  • 软件再工程过程:1.库存目录分析 2.文件重构 3.逆向工程 4.代码重构 5.数据重构 6.正向工程

**总结:**维护是生命周期的最后一个阶段,也是最长、代价最大的阶段,主要目的是提高软件的维护度、降低维护代价。软件维护通常包括4类活动…,决定软件可维护的要素…。软件生命周期每个阶段的工作都和软件可维护性有密切关系,文档是影响软件可维护性的决定因素。预防性维护实质上是软件再工程。


第九章 面向对象方法学引论

  • 面向对象方法学的出发点和基本原则:尽可能模拟人类习惯的思维方式,使开发软件的方法和过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(问题域)与实现解法的解空间(求解域)在结构上尽可能一致。

  • 面向对象的4个要点:

    1.认识客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。

    【面向对象方法用对象分解取代了传统方法的功能分解】

    2.把所有对象都划分成各种类对象(class),每个对象类都定义了一组数据和一组方法。数据表示对象的状态信息;方法是允许施加于该类对象上的操作,是该类所有对象共享的。

    3.按照子类和父类的关系,把若干个对象类组成一个层次结构的新系统,这个现象出现了继承,即下层派生类自动具有和上层的基类相同的特性(数据和方法)。

    4.对象彼此之间仅能通过传递消息互相联系。不能被动地等待外界对他施加操作。

    【总结:面向对象:对象+类+继承+传递消息】

  • 理解:在面向对象的设计方法中,计算机的观点是不重要的,现实世界的模型才是最重要的。面向对象的软件开发过程从始至终都是围绕着建立问题领域的对象模型来进行,对问题领域进行自然的分解,确定需要使用的对象和类。****

  • 面向对象的优点: 1,与人类习惯的思维方法一致 2.稳定性好 3.可重用性好 4.较易开发大型软件产品 5.可维护性好

  • 对象的定义:1,对象是具有相同状态下的一组操作的集合 2.对象是对问题域中某个对象的抽象,即对属性的封装

    ​ 3.对象=<ID,MS,DS,MI>,ID是对象的名字,MS是对象的操作集合 ,DS是对象的数据结构,MI是对象受理的消息名集合

  • 对象的特点:1.以数据为中心 2.对象是主动的 3.实现了数据封装 4.本质上具有并行性 5.模块独立性好

  • 重要概念

    • 拿一个圆做例子,有半径、周长、颜色、位置,我们现在有3个不同的圆,每个圆就是一个不同的的对象。但是他们都有相同的数据(半径、周长…)和相同的操作(显示自己、缩小半径等),因此他们是同一类事物,用Circle类来定义,而3个不同的圆可以声明为circle1,circle2,circle3,是具体的对象

    • 实例就是由某个特定的类所描述的一个具体的对象,类是抽象的,并不是真是存在的,谁也没有见过抽象的圆。换句话来说,类就是建立对象时使用的**”样板“,按照这个样本所建立的一个个具体的对象,就是类的实际例子,成为实例**。

    • 消息是某个操作的规格说明,比如MyCircle.show(GREEN),MyCircle就是对象的名字,show就是消息名,GREEN就是消息的变元。

    • 方法就是对象所执行的操作,响应消息的方法。

    • 属性就是类中所定义的数据

    • 封装就是包装一个事务,使外界不知道该事物的具体内容。

    • 继承就是能够直接获得已有的性质和特征,不必重复定义他们,子类自动地共享基类中定义的数据和方法的机制。

      举个例子:现在有两个类,A类和B类,让B类继承A类,B类除了自己的特性(数据和操作)之外,还从父类A继承特性。当创建A类a1时,a1以A类为样板创建实例变量(在内存中分配所需要的空间),但它并不从A类中福之所一定的方法。

      当创建 B类的实例b1时,b1既要以B类为样版创建实例变量,又要以A类为样版创建实例变量,b1所能执行的操作既有B类中定义的方法,又有A类中定义的方法,这就是继承。如果B类中又定义了和A类中同名的数据或操作,则b1仅使用B类中定义的这个数据或操作,除非采用特别措施,否则A类中与之同名的数据或操作在b1就不能使用。

    • 多态本意是”有许多形态“,希腊语。指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。也就是说,在类等级的不同层次中可以共享一个行为的名字,然而不同的层次中的每个类却各自按自己的需要来实现这个行为。当对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。

      举个例子:A a=new B(); a.show(); 这就是多态 //show必须是继承的方法。

      多态使用的细节:

      1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
      2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
      3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
      4. 多态情况下,不能访问子类特有的成员。

      多态的前提:必须存在继承或者实现关系。

    • 重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。注意和重写的区别。

  • 面向对象建模的三种模型:描述系统数据结构的对象模型、描述系统控制结构的动态模型和描述系统功能的功能模型

    3中模型相互补充,相互配合,使得人们对系统的认识更加全面:功能模型指明了系统应该做什么,动态模型明确规定了什么时候做,对象模型定义了做事情的实体。

对象模型:表示静态的、结构化的系统的”数据“性质,它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。在建立对象模型时,诞生了一种建模语言叫UML,UML中类的图形符号为长方形,分为上中下三个区域,分别存放名字、属性和服务。
泛化关系就是通常所说的继承关系。
动态模型:表示瞬时的、行为化的系统的”控制“性质,规定了对象模型中的对象的合法变化序列。用UML中的状态图描述生命周期中对象的状态。
功能模型:表示变化的系统的”功能“性质,它指明了系统应该”做什么“,因此更直接地反映了用户对目标系统的需求。由数据流图组成,工具可以使用UML提供的用例图。

  • **总结:**面向对象方法学比较自然的模拟了人类认识客观世界的思维方式,用面向对象观点建立系统模型,能够加深对系统的理解,开发出更容易理解、维护的软件。对象模型是最重要的。


第十章 面向对象分析

  • 面向对象分析(OOA)关键是识别出问题域内的类和对象,并分析它们相互间的关系,最终建立起问题域的简介、精确、可理解的正确模型。
  • 面向对象建模的3个子模型和5个层次:模型{对象模型、动态模型、功能模型}; 分析复杂问题的对象模型的5层次{主题层、类与对象层、结构层、属性层、服务层}
  • 建立对象模型的步骤
    • 首先要建立对象模型,因为静态数据结构相对来说比较稳定,所以首先要建立对象模型,然后在建立另外两个模型。
    • 5个层次的步骤,首先确定对象类和关联(因为他们影响系统整体结构和解决问题的方法),对于大型复杂问题还要划出若干个主题;然后给类和关联添加属性,进一步描述它们,利用适当的继承关系进一步合并、组织类,而对于类中操作的最后确定,则需等到建立了动态模型和功能模型之后,因为这两个子模型更准确地描述了对类中提供的服务的需求。
    • 建立动态模型,对于仅存储静态数据的系统(如数据库)来说,没必要建立动态模型,然而在开发交互式系统时,动态模型却起着很重要的作用。步骤:第一步,编写典型交互行为的脚本。虽然脚本中不可能包括偶然事件,但是,至少必须保证不遗漏常见的交互行为。第二步,从脚本中提取出时间,确定出发每个时间的动作对象以及接受事件的目标对象。第三步,排列事件发生的次数,确定每个对象可能有的状态及状态间的转换关系,并用状态图描绘他们。最后,比较各个对象的装态度,检查它们之间的一致性,确保事件之间的匹配。
    • 建立功能模型。步骤:画出基本系统模型图、画出功能级数据流图、描述处理框功能。
    • 定义服务。步骤:考虑常规行为、从事件导出的操作、与数据流图中处理框对应的操作、利用继承减少冗余操作。
  • 总结:分析就是提取系统需求并建立问题域精确模型的过程,它包括理解、表达和验证3项主要工作内容,面向对象分析的关键工作,是分析、确定问题域中的对象及对象间的关系,并建立起问题域的对象模型。大型复杂系统对象模型通常由5个层次组成…,大多数分析模型都不是一次完成的,必须反复多次进行分析。一个好的问题分析模型应该正确完整地反应问题的本质属性。

第十一章 面向对象设计

  • 面向对象设计的准则:1.模块化 2.抽象 3.信息隐藏 4.弱耦合 5.强内聚 6.可重用

  • 启发规则:1.设计结果应该清晰易懂 2.一般-特殊结构的深度应适当 3.设计简单的类 4.使用简单的协议 5.使用简单的服务

    ​ 6.把设计变动减至最小

  • 重用:也叫再用或复用,指同一事物不做修改或稍加改动就多次重复使用。

  • 软件重用分为3个层次:1.知识重用2.方法和标准重用3.软件成分重用

  • 软件成分的重用级别:1.代码复用 2.设计结果重用 3.分析结果重用

  • 可重用的软件成分:项目设计、成本估计、体系结构、需求模型和规格说明、设计、源代码、用户文档和技术文档、用户界面、数据、测试用例。

  • 类构件:利用面向对象技术,更方便更有效实现软件重用,面向对象技术中的“类”,是比较理想的可重用软构件,不妨称之为类构件。类构件有3种重用方式,分别是实例重用、继承重用、多态重用

  • 可重用软构件的特点:1.模块独立性强 2.具有高度可塑性 3.接口清晰、简明、可靠

  • 软件重用的效率:质量、生产率、成本。

  • 大多数求解空间模型,在逻辑上由4大部分组成,分别是问题域子系统、人机交互子系统、任务管理子系统、数据管理子系统


    第十二章 面向对象实现

  • 面向对象实现主要包括两项工作:面向对象设计结果翻译成用某种程序语言书写的面向对象程序(OOP);测试并调试面向对象的程序

  • 面向对象语言的优点:1,一致的表示方法(OOA—OOD----OOP) 2.可重用性 3.可维护性

  • 面向对象语言的技术特点:1.支持类和对象概念的机制 2.实现整体-部分(即聚集)结构的机制 3.实现一般–特殊(即泛化)结构的机制 4.实现属性和服务的机制 5。类型检查 6.类库 7.效率 8.持久保存对象 9.参数化类 10.开发环境

  • 面向对象语言的选择:1.将来是否占主导地位 2.可重用性 3.类库和开发环境 4。其他因素

  • 程序设计风格:1.提高可重用性 2.提高可扩充性 3.提高健壮性

  • 测试对象策略:1.面向对象的单元测试 2.面向对象的集成测试(基于线程的测试、基于使用的测试) 3.面向对象的确认测试

  • 测试类的方法:1.随机测试 2.划分测试 (基于状态的划分、基于属性的划分、基于功能的划分) 3.基于故障的测试


第十三章 软件项目管理

  • 估算软件规模:1.代码行技术 2.功能点技术

  • 工作量估计:1.静态单变量模型(面向KLOC的估算模型,面向FP的估算模型)2.动态多变量模型 3.COCOMO2模型

  • Gantt图是历史永久、应用广泛的制定进度计划的工具。

  • 工程网络:指定计划的另一种工具,加强:描绘任务分解情况以及每项工作的和结束时间,显式的描绘各个作业彼此间依赖关系

  • 技术复审:较早发现软件错误,防止错误被传播到软件过程的后续阶段。

  • 软件配置管理:定义:在软件的整个生命期间内管理变化的一组活动

    区别:不同于软件维护,维护是在软件交付给用户后才发生的,而配置管理是在软件启动时就开始,并且一直持续到软件退役后才终止的一组跟踪和控制活动。

    目的:使变化更正确且更容易被适应,在必须变化时减少所需要花费的工作量。

  • 软件配置:1.软件配置项(计算机程序、描述计算机程序的文档、数据) 2.基线(已经通过了正式复审的规格说明或中间产品,它可以作为进一步开发的基础,并且只有通过正式的变化控制过程才能改变它)

  • 能力成熟度模型:由于问题是由人们管理软件过程的方法不当引起的,所以新软件技术的运用并不会自动提高软件的生产率和质量。

    能力成熟度模型有助于软件开发机构建立一个有规律、成熟的软件过程。

软件工程导论是考研电子信息专业的一门重要课程。根据引用和引用的内容,软件工程导论的学习可以通过以下步骤进行: 1. 下载和学习资料:可以下载引用中提到的xmind脑图和引用中提到的复试笔记。这些资料可以帮助你整理和理解软件工程导论的知识点。 2. 重点整理知识点:根据引用[1]中提到的xmind脑图,可以将软件工程导论的知识点进行整理和分类。可以根据复试笔记中的内容,将知识点分为不同的模块,如软件工程导论的基本概念、软件开发过程、软件项目管理等。 3. 学习管理信息系统和其他相关课程:引用中提到了管理信息系统和其他课程的知识点。这些课程与软件工程导论有一定的关联,学习这些课程可以帮助你更好地理解和应用软件工程导论的知识。 4. 复习编译原理、计算机网络和数据库:引用中提到了编译原理、计算机网络和数据库的知识点。这些知识点在软件工程导论中也是重要的内容,复习这些知识可以加深对软件工程导论的理解。 总之,软件工程导论的考研学习可以通过下载和学习相关资料,整理知识点,学习相关课程,并复习相关知识点来进行。这样可以帮助你更好地准备考研,掌握软件工程导论的重要知识。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [【考研整理】软件工程导论.zip](https://download.csdn.net/download/weixin_40908748/12424518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [电子信息专业 - 考研复试笔记分享(软件工程导论-第六版 + 管理信息系统-马慧).rar](https://download.csdn.net/download/weixin_41731475/12454588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于弋gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值