一、软件工程的框架
目标、过程、原则
1.目标:正确性、可用性、开销合宜
软件工程活动:
需求->设计->实现->确认->支持等活动
需求:问题分析:需求定义
需求分析:功能规约
设计:概要设计:整个软件体系结构
详细设计:程序员可用的模块说明
实现:得到可执行的程序代码
确认:贯穿于整个开发过程
支持:包括修改和完善
还有管理过程、支持过程、培训过程等
2.软件工程过程:
生产一个最终能满足需求 且 达到工程目标 的软件产品所需要的步骤。
开发过程、运作过程、维护过程
覆盖需求、设计、实现、确认、支持及维护等活动
3.软件工程的原则
围绕工程设计、工程支持、工程管理在软件开发过程中必须遵守的原则
1.选取适宜的开发范型
2.选取合适的设计方法
3.提供高质量的工程支持
4.重视开发过程的管理
二、开发模型
1.V模型:快速应用开发模型(RAD),开发和测试同时进行
需求分析:需求规格说明书
概要设计:搭建架构、表述各模块功能、模块接口、数据传递的实现等事务
详细设计:达到伪代码级别,包含数据库设计说明
软件编码
单元测试:主要测试程序代码,确保各个模块正确编译(具体到模块、类、函数)
集成测试:主要测试各模块间组合后功能实现情况,模块接口连接是否成功、数据传递是否正确,主要目的是检查软件单元之间的接口是否正确
系统测试:按照软件规格说明书中要求,测试功能性能是否符合需求,系统是否存在漏洞
验收测试:用户拿到软件时,在使用现场按规格说明书做相应测试确定软件达到效果
缺陷:
仅把测试过程当做编码之后的一个阶段,忽视了对需求分析、系统设计的验证,需求的满足情况到后期验收测试才被验证
解决思路:测试在软件做需求分析时就有测试用例的跟踪
适用范围:
适用于一些传统信息系统应用的开发,
而高风险高性能的系统、互联网软件或者难以具体模块化的系统不适用,需要更强调迭代的开发模型或敏捷开发模型
2.瀑布模型:
阶段间具有顺序性和依赖性:
前一阶段完成后一阶段才能开始
前一阶段输出文本为后一阶段的输入文本
推迟实现的观点
质量保证:每个阶段必须交付合格的文档;对文档进行审核
缺点:开始时必须把需求做到最全,惧怕用户测试中的反馈和需求变更
三、软件生命周期(SDLC)
软件的产生直到报废的生命周期
1.瀑布型生命周期:
包括可行性分析与开发项计划、需求分析、设计(概要和详细)、编码、测试、维护等阶段
典型六阶段:
1.问题的定义及规划:主要确定软件的开发目标及其可行性
2.需求分析:在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。必须制定需求变更计划来应对变化
3.软件设计:主要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计、数据库设计等
4.程序编码:将软件设计的结果转换成计算机可运行的程序代码。
5.软件测试:整个测试过程分为单元测试、组装测试、系统测试三阶段;测试方法有白盒测试、黑盒测试两种;应建立详细测试计划并按计划进行测试
6.运行维护:持续时间最长的阶段,包括纠错性维护和改进型维护两个方面
四、敏捷开发
以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。软件项目在构建初期被切分为多个子项目,并分别完成。此过程中软件一直处于可使用状态
宣言原则:
1.最重要,尽早、不断交付有价值的软件满足客户需求
2.能过驾驭变化,保持客户竞争优势
3.经常交付可以工作的软件
4.业务人员与开发者朝夕相处
5.给开发者提供适宜的环境满足他们的需要
6.相信开发者能够完成任务
7.开发小组最有效率的信息传达方式是面对面交流
8.可以工作的软件是主要度量尺度
9.提倡可持续开发,各方应维持不变的节奏
10.对卓越技术与良好设计的不断追求有助于提高敏捷性
11.尽可能减少工作量的艺术至关重要
12.最好的架构、需求和设计都源自于自我组织的团队
13.每隔一段时间都要进行总结
五、高内聚低耦合
1.定义
内聚:描述模块内的功能联系,一个好的内聚模块应当恰好做一件事
耦合:描述软件结构中各模块之间相互联系的关系,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据
2.概念
耦合性(块间联系):模块间的联系越紧密,其耦合性越强,模块间相互独立性越差。模块间相互独立性取决于模块间接口的复杂性、调用的方式及传递的信息
内聚性(块内联系):模块功能强度的度量,模块内部各个元素彼此结合的紧密程度。模块内各元素联系越紧密,内聚性越高。
高内聚:单一责任原则,一个模块由相关性很强的代码组成,只负责一项任务
低耦合:一个完整的系统,模块与模块之间尽可能的独立存在
3.分类:
a.内容耦合:一个模块直接访问另个模块的内容
b.公共耦合:一组模块都访问同一个全局数据结构
较松散的:模块只是向公共数据环境输入或取出数据
较紧密的:既输入,又取出
c.外部耦合:一组模块都访问同一全局简单变量,而不通过参数列表传递
d.控制耦合:模块之间传递的不是数据信息而是控制信息,如标志、开关量等
e.标记耦合:调用模块和被调用模块之间传递数据结构而不是简单数据,又称特征耦合。参数名为标记,实际传递的地址
f.数据耦合:调用模块和被调用模块之间只传递简单的数据项参数。相当于高级语言中的值传递
g.非直接耦合:两个模块之间没有直接关系,他们之间的联系完全是通过主模块的控制和调用实现。耦合度最低
*设计原则:若模块间必须存在耦合,应尽量使用数据耦合,少用控制耦合,慎用公共耦合并限制公共耦合的范围,尽量避免内容耦合
内聚度由弱到强:
a.偶然内聚:一个模块间各处理元素之间没有任何联系,只是偶然被凑到一起,又称巧合内聚
b.逻辑内聚:把几种相关的功能组合在一起,每次被调用时,由参数决定该模块完成哪种功能
c.时间内聚:需要同时执行的动作组合到一起形成的模块
d.过程内聚:模块内处理元素是相关的,且必须按特定次序执行
e.通信内聚:模块内各个组成部分都是用相同的数据结构或者产生相同的数据结构
f.顺序内聚:模块内前一个处理元素的输出是后一个处理元素的输入
g.功能内聚:模块内各个组成部分全部都为完成同一个功能而存在,共同完成一个单一的功能,模块不可再分。
*模块划分原则:一个模块一个功能