软件设计设计
软件设计的目标及主要任务有哪些?
软件系统设计是把软件需求“变换”为用于构造软件的蓝图。
基本目标:
构造系统“怎么做”的模型描述。
主要任务:
总体设计,也称为概要设计,软件结构设计,或高层设计。
- 体系结构设计:定义软件模块(构件)及模块之间的关系。
- 接口设计:包括用户接口(界面)、外部接口、内部接口。
- 数据设计:软件涉及的数据结构、文件系统的结构、数据库的表结构等。
详细设计,也称为(模块)过程设计,或低层设计。
- 模块内部细节设计:包括模块所需的算法和数据结构等。
什么是模块(构件)化设计思想?
把一个大型软件系统的全部功能,按照一定的原则合理地划分为若干个模块(一个独立命名的,拥有明确定义的输入、输出和特性的程序实体),每个模块完成一个特定子功能,所有的这些模块以某种结构形式组成一个整体,这就是软件的模块化设计(Modular Design)。
模块独立性的两个度量标准是什么?
高内聚、低耦合
内聚和耦合的含义是什么?各有那些种类?请举例说明每一类型。
内聚(Cohesion):也称为块内联系,指一个模块内部元素彼此结合的紧密程度。内聚性是从功能的角度对模块内部聚合能力的量度。
内聚分类 | 定义 | 举例说明 |
---|---|---|
功能性内聚 | 模块各个成分结合在一起,完成一个特定的功能。 | 解析XML文档模块(解析XML元素, 解析XML属性,解析XML注释等) |
顺序性内聚 | 模块内的各个任务是顺序执行的。通常,上一个任务的输出是下一个任务的输入。数据流从一个处理单元流到另一个处理单元 | 规则引擎(一个任务读配置,输出执行计划。另一个任务以执行计划为输入,执行该计划)。通常,面向数据流的设计方法设计出的模块具有顺序性内聚。 |
通信性内聚(信息内聚) | 模块内部的各个任务靠公用数据联系在一起,即都使用同一个输入数据,或者产生同一个输出数据。 | 学生管理系统的数据库CRUD操作,都对学生信息进行增删查改操作。 |
过程性内聚 | 模块内的各个任务必须按照某一特定次序执行。控制流从一个动作流向另一个动作 | 在函数级别的模块比较常见。读/写文件操作:判断文件是否存在、判断文件是否有相应权限、打开文件、读(或写)文件。 |
时间性内聚 | 模块内的各个任务由相同的执行时间联系在一起。 | 初始化模块,异常处理模块。某个异常处理模块封装了“释放资源”、“记录日志”、“通知用户”几个任务。 |
逻辑性内聚 | 模块通常由若干个逻辑功能相似的任务组成,通过模块外引入的一个开关量选择其一执行.这种内聚增大了模块间的耦合。 一个输出设备模块将打印机类和显示器类封装到同一个包里,该包即输出设备模块。 | 打印机类和显示器类虽然都具有输出功能,但是具有不同的职责。 |
偶然性内聚 | 模块内的各个任务在功能上没有实质性联系,纯属“偶然”因素组合了块内各个互不相关的任务。 | 一个处理正方形的模块有两个功能:计算面积,画出这个正方形。 |
耦合(Coupling):也称为块间联系。耦合性是对一个软件结构内不同模块之间互连程度的度量。耦合性的强弱取决于模块间接口的复杂程度,以及通过接口的数据类型和数目。
耦合分类 | 定义 | 举例说明 |
---|---|---|
非直接耦合 | 同级模块相互之间没有信息传递,即没有耦合 非常底层的模块,自给自足,可以无耦合 较高层的模块,通常需要重用其他模块的功能,产生耦合 | 一个处理正方形的模块和一个处理三角形的模块 |
数据耦合 | 调用下属模块时,如果交换的都是简单变量,便构成数据耦合 | getName() |
特征耦合(数据结构耦合) | 调用下属模块时,如果交换的是数据结构,便构成特征耦合。由于传递的是数据结构,不仅数据量增加,而且会使模块的相关性增加。 | 绕过一个数据结构进行对模块的调用 |
控制耦合 | 模块间传递的信息不是一般的数据,而是作为控制信息的开关值或标志量 | 逻辑性内聚的模块调用就是典型的控制耦合 |
外部耦合 | 若允许一组模块访问同一个全局变量,可称它们为外部耦合 | 一个处理车票总数的静态变量 |
公共耦合 | 若允许一组模块访问同一个全局性的数据结构,则称它们为公共耦合。全局性的数据结构可以是共享的通信区、公共的内存区域、任何存储介质文件、物理设备等。 | |
内容耦合 | 若一个模块可以直接访问另一个模块中的内部数据,或者一个模块直接转到另一个模块的内部,或者一个模块有多个入口,则称为内容耦合。 | 将私有数据设为公有、将可以一步完成的模块分为多个模块 |
为什么要高内聚和低耦合?高内聚低耦合是否意味着内聚越高越好,耦合越低越好呢?
使用高内聚可以使得各个模块之间的联系更为紧密,使用低耦合可以降低接口的复杂程度。这样在代码编写的过程种才能使得各个模块之间的平衡得到很好的调控。高内聚低耦合并不意味着内聚越高越好、耦合越低越好,而是在能使得内聚高的情况下选择尽可能低耦合的设计、在耦合低的情况下选择尽可能高耦合的设计,两者相得益彰才是好的设计。