本文总结于《软件工程——原理、方法与应用》第三版
第七章 面向对象设计
1. 软件设计的目标
设计的目标,是细化解决方案的可视化设计模型,确保设计模型最终能平滑地过渡到程序代码。关键是构造解决问题的方案,并在决定实施细节的基础上获得该方案的设计模型。
2. 设计模型和分析模型
分析模型强调的是软件“应该做什么”,并不给出解决问题的方案,也不涉及具体的技术和平台。
设计模式要回答“该怎么做”的问题,而且要提供解决问题的全部方案,包括软件如何实现、如何适应特定的实施环境等。
分析=内容;设计=方式
分析VS设计
分析
关注问题的理解
理想化设计
行为
系统结构
功能需求
一个小的模型
设计
关注解决方案的理解
操作和属性
性能
接近实际的代码
对象的生命周期
非功能需求
一个大的模型
3. 软件设计的概念及基本原则
模块与构件、抽象与细化、信息隐藏、软件复用
4. 软件设计的任务
·把分析阶段产生的分析模型转换为用适当手段表示的软件设计模型;
·软件设计一般包括数据设计、体系结构设计、过程设计、接口设计
- 数据设计将分析阶段创建的信息模型转变成实现软件所需的数据结构;
- 体系结构设计定义软件主要组成部件之间的关系;
- 接口设计描述软件内部、软件和接口系统直接以及软件与人直接是如何通信的(包括数据流和控制流);
·过程设计将软件体系结构的组成部件转变为对软件组件的过程性描述
数据和过程被封装为类/对象的属性和操作;接口被封装成对象间的消息;体系结构的设计则表现为系统的技术基础设计和具有控制流程的对象间的协作
5. 模块化设计
·分解
·模块独立性
·自顶向下
·自底向上
模块是一个拥有明确定义的输入、输出和特性的程序实体。模块的所有输入都是事先功能必不可少的,所有输出都有动作产生。
在软件的体系结构中,模块是可组合、分解和更换的单元。
-
模块的基本属性:
接口:指模块的输入与输出;
功能:指模块实现什么功能;
逻辑:描述内部如何实现要求的功能即所需的数据。 -
模块化设计
目的是按照规定的原则把大型软件划分为一个较小的、相对独立但相互关联的模块。
依据:开发一个大而复杂的软件系统,将它进行适当的分解,不但可降低其复杂性,还可减少开发工作量,从而降低开发成本,提高软件生产率,这就是模块化的依据。 -
模块的独立性
模块的独立性是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他模块的接口是简单的。 -
模块独立的含义:
·模块完成独立的功能
·符合信息隐蔽和信息局部化的原则
·模块间关联和依赖程度尽量小 -
模块独立程度可由两个定性标准度量:内聚、耦合
内聚:指模块内部各个成分之间的联系,也称为块内联系或模块强度;
耦合:指一个模块与其他模块间的联系,也称为块间联系。
模块的独立性愈高,则块内联系越强,块间联系越弱。
内聚
(1)内聚是从功能的角度对模块内部聚合能力的量度,按照由弱到强的顺序,内聚可分为7类,从小到大内聚强度逐步增强:
- 低内聚:
①偶然性内聚 ②逻辑性内聚 ③时间性内聚 - 中内聚
①过程性内聚 ②通信性内聚 - 高内聚
①顺序性内聚 ②功能性内聚
1、偶然性内聚:当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散,则称这种模块为偶然性内聚或巧合内聚模块,是内聚程度最低的模块。
2、逻辑内聚:把几种相关功能(逻辑上相似的功能)组合在一模块内,每次调用由传给模块的参数确定执行哪种功能。
例:由参数决定执行读操作还是写操作:
3、时间内聚:又称经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。
例如初始化模块和终止模块,系统结束模块、紧急故障处理模块等均是时间性内聚模块。
4、过程内聚:一个模块中包含的一组任务必须按照某一特定的次序执行时,就称为过程性模块。
5、通信内聚:模块内部的各个成分都使用同一种输入数据,或者产生同一个输出数据。
6、顺序性内聚:模块中的各组成成分是顺序执行的。通常情况下,上一个处理框的输出就是下一个处理框的输入。
7、功能性内聚:一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。是内聚性最强的模块。
耦合
耦合性是程序结构中各个模块之间相互关联的度量,它取决于各个模块之间接口的复杂程度、调用模块的方式以及哪些信息通过接口。
-
非直接耦合:两个模块之间没有直接关系,模块独立性最强
-
数据耦合:一模块调用另一模块时,被调用模块的输入、输出都是简单的数据(若干参数),属松散耦合。
-
特征耦合(标记耦合)
两个模块通过传递数据结构,(不是简单数据,而是记录、数组等)加以联系,或都与一个数据结构有关系,则称这两个模块间存在特征耦合。
-
控制耦合
如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。
去除模块间控制耦合的方法:
- 将被调用模块内的判定上移到调用模块中进行;
- 被调用模块分解成若干单一功能模块
-
外部耦合
一组模块均与同一外部环境关联(例如, I/O模块与特定的设备、格式和通信协议相关联),它们之间便存在外部耦合。
外部偶合必不可少,但这种模块数目应尽量少 -
公共环境耦合
-
内容耦合
耦合最强。如果一个模块可以直接调用另一模块中的数据,或者允许一个模块直接转移到另一个模块中去,就称内容耦合。
·耦合是影响软件复杂程度的一个重要因素,应该采取下述设计原则:
尽量使用数据耦合,少用控制耦合和特征耦合;
限制公共环境耦合的范围,完全不用内容耦合
·内聚和耦合关系密切,与其他模块直接强耦合的模块意味着弱内聚,强内聚模块意味着与其它模块间松散耦合。
设计目标:高内聚、低耦合
耦合、内聚与模块独立性关系:
耦合与内聚都是模块独立性的定性标准,都反映模块独立性的良好程度,但耦合是直接的主导因素,内聚则辅助耦合共同对模块独立性进行衡量。
6. 面向对象设计建模
面向对象设计模型:
·系统架构层(系统架构层描述了整个系统的总体结构)
·类和对象层包含类层次信息,同时包含了每个对象的设计表示)
·消息层(对象间的消息模型,建立了系统的内部和外部接口)
·责任层(每个对象的所有属性和操作的数据结构和算法)
- 面向对象设计的任务
·系统架构设计
·系统元素设计 - 模式的应用
·模式是解决某一类问题的方法论,也是对通用问题的通用解决方案;
·软件模式可以分为架构模式、设计模式和习惯用法三种
7. 子系统VS包
- 子系统:
·提供行为
·完全封装实现细节
·容易替换 - 包:
·不提供行为
·不完全封装实现细节
·难以替换
子系统的主要用途:子系统可以将系统划分成独立的部分,将被实现为独立的构件,这些构件在保持结构不变的情况下,可以
- 独立地开发和部署
- 适应变更,而不影响其他系统
子系统也可用于 - 将系统划分成若干单元
- 表示设计中的既存产品或外部系统