目录
第1章 软件工程学概述
软件工程方法学
软件生命周期
软件过程
第2章 可行性研究
可行性研究的任务
数据流图(DFD)
第3章 需求分析
第5章 总体设计
设计过程
模块独立
第6章 详细设计
程序复杂程度的定量度量
第7章 实现
编码
白盒测试
黑盒测试
调试和测试
第8章 维护
软件维护的特点
第9章 面向对象方法学引论
面向对象建模(知道)
第10章 面向对象分析
面向对象分析的基本过程
建立动态模型
第11章 面向对象设计
第12章 面向对象实现
第13章 软件项目管理
进度计划
人员组织
能力成熟度模型(CMM)
第1章 软件工程学概述
软件工程方法学
软件工程方法学包含3个要素:方法、工具和过程。
方法是完成软件开发的各项任务的技术方法,回答“怎样做”的问题;
工具是为运用方法而提供的自动的或半自动的软件工程支撑环境;
过程是为了获得高质量的软件所需要的完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
目前使用得最广泛的软件工程方法学,分别是传统方法学和面向对象方法学。
两种方法学优缺点比较
传统方法学–又称生命周期方法学或结构化范型
优点:
- 降低了整个软件开发工程的困难程度。
- 保证了软件的质量,提高了软件的可维护性。
- 大大提高软件开发的成功率,软件开发的生产率明显提高。
缺点:
- 当软件规模庞大,用户难以在系统分析阶段准确定义,每阶段成果进行控制的时候不能适应事物变化的要求时,使用传统方法学开发软件往往不成功。
- 传统方法学开发出的软件开发周期长,难以维护。
- 结构化范型没有既面向数据又面向行为的结构化技术,把数据和操作人为地分离成两个独立的部分,会增加软件开发与维护的难度。
面向对象方法学
优点:
- 降低了软件产品了复杂性,提高了软件的可理解性,简化了软件的开发和维护工作。
- 特有的继承性和多态性,提高面向对象软件的可重用性。
软件生命周期
–明确8个阶段都在做什么
软件定义时期:问题定义、可行性研究、需求分析;
开发时期:总体设计、详细设计、编码和单元测试、综合测试;
维护时期:软件维护。
1、问题定义
“要解决的问题是什么”
明确要解决的问题,写出关于问题性质、工程目标和工程规划的书面 告,经过讨论和必要的修改之后得到客户的确认。
2、可行性研究
“对于上一个阶段所确定的问题有行得通的解决办法吗”
研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。
3、需求分析
“为了解决这个问题,目标系统必须做什么”
确定目标系统必须具备哪些功能。
4、总体设计
“概括地说,应该怎样实现目标系统”
又称概要设计。确定了解决问题的策略及目标系统中应包含的程序,确定程序由哪些模块组成以及模块间的联系。以比较抽象概括的方式提出了解决问题的办法。
5、详细设计
“应该怎样具体地实现这个系统呢”
又称模块设计。详细设计每个模块,确定实现模块功能所需要的算法和数据结构。
6、编码和单元测试
写出正确的容易理解、容易维护的程序模块。
7、综合测试
通过各种类型的测试(及相应的调试)使软件达到预定的要求。
8、软件维护
通过各种必要的维护活动使系统持久地满足用户的需要。
- 改正性维护:诊断和改正在使用过程中发现的软件错误;
- 适应性维护:修改软件以适应环境的变化;
- 完善性维护:根据用户的要求改进或扩充软件使它更完善;
- 预防性维护:修改软件,为将来的维护活动预先做准备;
软件过程
瀑布模型
早期的瀑布模型是不可逆的,后期改良的瀑布模型是可逆的、可迭代、有反馈环。
瀑布模型是一种文档驱动的模型,几乎完全依赖于书面的规格说明。
特点:
1、阶段间具有顺序性和依赖性
①前一阶段工作完成后开始后一阶段工作;
②前一阶段的输出文档就是后一阶段的输入文档;
2、推迟实现的观点 –不过早编程
3、质量保证的观点
①交出合格文档;
②每阶段结束都对文档进行评审
适用:
传统软件工程方法学的软件过程,基本上可以用瀑布模型来描述。
快速原型模型
用户需求作为驱动力,是用户和设计交换最频繁的方法。
快速原型模型是不带反馈环的,软件产品的开发基本上是线性顺序进行的。
原型系统必须迅速构建原型然后根据用户意见迅速地修改原型。–第四代语言(4GL)
螺旋模型
基本思想:使用原型及其他方法来尽量降低风险。
螺旋模型的主要优势在于,它是风险驱动的。
适用:
螺旋模型主要适用于内部开发的大规模软件项目。
敏捷编程与极限编程
敏捷软件开发宣言:
- 个体和交互胜过过程和工具;
- 可以工作的软件胜过面面俱到的文档;
- 客户合作胜过合同谈判;
- 响应变化胜过遵循计划;
适用:
敏捷编程适合中小型项目开发。
–敏捷过程中最重要的是极限编程–
极限编程广泛应用与需求模糊且经常改变的场合。
结对编程
结对编程是两个程序员在同一计算机上共同编写解决同一问题,一个人编码另一个人对代码进行审查与测试,定期交换角色。
第2章 可行性研究
目的:用最小的代价在尽可能短的时间内确定问题是否能够解决。
可行性研究的任务
技术可行性 –使用现有的技术能实现这个系统吗/span>
经济可行性 –这个系统的经济经济效益能超过它的开发成本吗/span>
操作可行性 –系统的操作方式在这个用户组织内行得通吗/span>
数据流图(DFD)
数据的源点或终点:通常是人或部门; –正方形(或立方体)
变换数据的处理:代表一系列程序,单个程序或程序的一个模块; –圆角矩形(圆形)
数据存储:一个文件、文件的一部分、数据库元素或记录的一部分; –开口矩形(或两条平行横线)
数据流:所有可能的数据流向,是运动中的数据; –箭头
更详细的讲解和画法参考下面博主的文章:
数据流图 –super晓权
第3章 需求分析
需求分析是软件定义时期的最后一个阶段,基本任务是准确回答“系统必须做什么”。
第5章 总体设计
基本目的:回答“概括地说,系统应该如何实现”。
总体设计的另一项重要任务是设计软件的结构。
设计过程
两个主要阶段
- 系统设计阶段:确定系统的具体实现方案;
- 结构化设计阶段:确定软件结构;
1、设想供选择的方案
2、选取合理的方案
3、推荐最佳方案
4、功能分解
5、设计软件结构
层次图、结构图、数据流图
6、设计数据库
在需求分析阶段所确定的数据需求的基础上进一步设计数据库。
7、制定测试计划
在软件开发的早期阶段考虑测试问题,提高软件的可测试性。
8、书写文档
9、审查和复审
模块独立
低耦合、高内聚
耦合:
最希望的、最弱耦合:数据耦合
最不希望、最高程度耦合:内容耦合
数据耦合(低耦合):两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据。
控制耦合(中耦合):传递的信息中有控制信息。
特征耦合:把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素。(A和B相互传数据,A需要的数据少,B传多了)
公共耦合:两个或多个模块通过一个公共数据环境相互作用。
(①公共部分的改动将影响所有调用它的模块;②公共部分的数据存取无法控制;③公共环境耦合的复杂成都随耦合的模块个数而变化)
内容耦合:
- 一个模块访问另一个模块的内部数据。
- 一个模块不通过正常入口而转到另一个模块的内部。
- 两个模块有一部分程序代码重叠(只可能出现在汇编程序中)。
- 一个模块有多个入口(这意味着一个模块有几种功能)。
内聚:
最希望:功能内聚
最不希望:偶然内聚
低内聚
偶然内聚:一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的。(模块功能不连贯、不紧密,基本没有关系、没有意义)
逻辑内聚:一个模块完成的任务在逻辑上属于相同或相似的一类(例如一个模块产生各种类型的全部输出)
时间内聚:一个模块包含的任务必须在同一段时间内执行如模块完成各种初始化工作。(同一时间段、时间点完成的工作放在一起)
中内聚
过程内聚:一个模块内的处理元素是相关的,而且必须以特定次序执行。
通信内聚:模块中所有的元素都使用同一个输入数据和(或)产生同一个输出数据。(相同输入或相同输出)
高内聚
顺序内聚:一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个元素的输入数据)。
功能内聚:模块内所有处理元素属于一个整体,完成一个单一的功能。
第6章 详细设计
程序复杂程度的定量度量
McCabe方法:
根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。
计算环形复杂度V(G)的方法
- V(G) = 流图中线性无关的区域数
- V(G) = 边数-结点数+2
- V(G) = 判定结点(该节点分支数-1)+1
重点记忆书本P139的图6.16和6.17
第7章 实现
编码
白盒测试
逻辑覆盖
语句覆盖:被测程序中每个语句至少执行一次;
判定覆盖(分支覆盖):每个判定的分支都至少执行一次;
条件覆盖:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种结果;
覆盖率
黑盒测试
主要研究需求规格说明和概要设计说明,着重测试软件功能。
等价划分
等价类 = 有效等价类 +无效等价类
每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同,因此可以从每个等价类中只取一组数据作为测试数据。
边界值分析
取6或4个值
例:[-32,32]
6值:
刚好(左):-32 刚小于(左):-33
刚好(右):32 刚大于(右):33
4值:
刚好(左):-32 刚小于(左):-33 刚大于(左):-31
刚好(右):32 刚小于(右):31 刚大于(右):33
调试和测试
调试(也称为纠错)作为成功测试的后果出现,调试是在测试发现错误之后排除错误的过程。
第8章 维护
软件维护的特点
非结构化维护:
软件配置的唯一成分是程序代码,从评价程序代码开始,常由于程序内部文档不足而使评价更困难,对于软件结构、全程数据结构、系统接口、性能和设计约束常产生误解,对程序代码的改动后果难于估量;没有测试方面文档,不可能进行回归测试(为了保证所做的修改没有在以前可以正常使用的软件功能中引入错误而重复过去做过的测试)。
结构化维护:
有一个完整的软件配置在,从评价设计文档开始,确定软件重要的结构特点、性能特点以及借口特点;估量要求的改动将带来的影响,并且计划实施途径。然后首先修改设计并且对所做的修改进行仔细复查,接下来编写相应的源程序代码;进行回归测试;最后再次交付使用。
第9章 面向对象方法学引论
面向对象开发方法将面向对象的思想应用于软件开发过程中,指导开发活动,是建立在“对象”概念基础上的方法学,简称OO( Object-Oriented)方法。
面向对象方法学要点:
- 认为客观世界是由各种对象组成的;
- 把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法;
- 把若干个对象类组成一个层次结构的系统;
- 对象彼此之间仅能通过传递消息互相联系。
面向对象方法学的优点
- 与人类习惯的思维方法一致;
- 稳定性好;
- 可重用性好;
- 较易开发大型软件产品;
- 可维护性好;
面向对象建模(知道)
对象模型、动态模型、功能模型
对象模型 —类图
表示关系的符
关联、泛化(继承)、依赖、细化
P218
动态模型 –状态图
功能模型 –用例图
第10章 面向对象分析
面向对象分析的基本过程
面对对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程。
复杂问题的对象模型的5个层次:主题层、类与对象层、结构层、属性层和服务层。
建立动态模型
- 编写典型交互行为的脚本。虽然脚本中不可能包括每个偶然事件,但是至少必须保证不遗漏常见的交互行为;
- 从脚本中提取出事件,确定触发每个事件的动作对象以及接受事件的目标对象;
- 排列事件发生的次序,确定每个对象可能有的状态及状态间的转换关系,并用状态图描绘它们。
编写脚本的时候要考虑正常、异常和特殊情况。
第11章 面向对象设计
任务:
把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。从面向对象分析到面向对象设计(OOD)。
第12章 面向对象实现
P294-295
第13章 软件项目管理
软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对人员(People)、产品(Product)、过程(Process)和项目 (Project)进行分析和管理的活动。 软件项目管理的根本目的是为了让软件项目尤其是 大型项目 的整个软件生命周期(从分析、设计、 编码 到测试、维护全过程)都能在管理者的控制之下,以预定成本按期,按质的完成软件交付用户使用。
效益、利润不在里面
进度计划
Gantt图、工程 络
人员组织
民主制程序员组
重要特点:
小组成员完全平等,享有充分民主,通过协商作出技术决策。
若有n个成员则可能有n(n-1)/2条通信信道。
主程序员组
优点考虑:
- 软件开发人员多数比较缺乏经验;
- 程序设计过程中有许多事务性的工作,例如大量信息的存储和更新;
- 多渠道通信很费时间,将降低程序员的生产率;
重要特征:
- 专业化。该组每名成员仅完成他们受过专业训练的那些工作。
- 层次性。主刀大夫指挥每名组员工作,并对手术全面负责。
现代程序员组
能力成熟度模型(CMM)
用于评价软件机构的软件过程能力成熟度模型,为大型软件项目的招投标活动提供一种全面而客官的评审依据。
5个级别:初始级-可重复级-已定义级-已管理级-优化级
参考课本:软件工程导论(第六版) –清华大学出版
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!