笔记内容大部分来源于课本《软件工程导论》,侵删
5.1设计过程
总体设计过程由两个主要阶段组成:系统设计阶段、结构设计阶段
典型的设计过程包括9个步骤:
- *设想、选取、推荐方案(前三个)
- 功能分解
- 设计软件结构
- 设计数据库
- *制定计划
- *书写文档
- *审查、复审
5.2设计原理
模块化
模块:由边界元素限定的相邻程序元素的序列,有一个标识符代表它(类似'{}')
模块定位:构成程序的基本构件
模块化的目的:使一个大型程序能被人的智力所管理
模块化思想:把复杂的问题分解成许多容易解决的小问题(但不是分越细越好)
(图)
抽象
抽象的定义:把相似方面集中概括起来,暂时忽略差异(抽出本质忽略细节)
逐步求精
采用自顶向下的设计策略
信息隐藏和局部化
信息隐藏:无关信息其他模块不能访问
局部化:把关系密切的软件元素物理地放近些
模块独立
模块独立的优点:软件容易开发、测试、维护
模块独立程度的两个定性标准测量:内聚、耦合
耦合:衡量不同模块间依赖的紧密程度
不同的耦合(上从往下耦合度升高)
- 数据耦合
*模块间交换信息只有数据 - 控制耦合
*模块间交换信息包含控制信息 - 特征耦合
*传了整个数据结构,但只要其中的部分数据 - 公共环境耦合
*两个模块通过一个公共数据环境相互作用 - 内容耦合
原则:
尽量使用数据耦合,少用控制、特征耦合,限制公共环境耦合的范围,禁用内容耦合
内聚:衡量模块内部元素间结合的紧密程度
理想的内聚只做一件事
不同的耦合(上从往下内聚程度降低)
- 功能内聚
- 顺序内聚
- 通信内聚
- 过程内聚
- 时间内聚
- 逻辑内聚
- 偶然内聚
5.3启发规则
包括:
- 提高模块独立性
高内聚低耦合 - 模块规模适中
模块代码不超过60行 - 深度、宽度、扇入、扇出恰当
深度:软件结构中控制的层数
宽度:同一层上模块总数的最大值
扇入:模块直接控制(调用)的模块数目
扇出:有多少个上级模块直接调用它 -
将模块的作用域置于控制域内
将判定点上移或将被调用模块下移
模块的作用域和控制域 - 降低模块接口的复杂度
- 设置单入口单出口的模块
- 模块功能可预测
见名知意
5.4描绘软件结构的图形工具
层次图和HIPO图
层次图:用来描绘软件的层次结构
层次图适用于自顶向下设计软件的过程
HIPO图:层次图加输入/处理/输出图
HIPO图具有可追踪性(除了顶层的方框外的方框都加了编号)
结构图
结构图:与层次图类似,用来面糊软件结构的图形工具
包含的符号:
- 方框:
代表一个模块
里面注明了模块名或主要功能 - 方框间的箭头
表示模块的调用关系
可以直接用直线代替箭头(上调用下) - 箭头尾部
空心圆:传递数据
实心圆:传递控制信息 - 附加符号:
菱形:选择判断
弯箭头:循环调用
5.5面向数据流的设计方法
目的:定义一些不同的“映射”,利用这些映射完成数据流图到软件结构的变换
概念
信息流的两种类型:
- 变换流:
信息以“外部世界”的形式进入软件系统,经过处理以后再以“外部世界”的形式离开系统
变换型数据流图:具有较明确的输入、处理、输出界面的数据流图 -
事务流:
以事务为中心
处理根据输入数据的类型在若干个动作序列中选出一个来执行
是一类特殊的数据流
变换流和事务流
变换分析
变换分析:把具有变换流特点的数据流图按预先确定的模式映射成软件结构
设计步骤:(详细过程参考书上P106~111)
- 复查并精化数据流图
- 确定数据流图具有变换特性还是事务特性
- 确定输入流和输出流的边界,孤立出变换中心
- 完成“第一级分解”
分配控制,将顶层控制模块Cm分成Ca、Ct、Ce三个控制模块
Ca:输入信息处理控制模块
Ct:变换中心控制模块
Ce:输出信息处理控制模块 - 完成“第二级分解”
把数据流图中的每个处理映射成软件结构中的一个适当的模块
方法:
Ca:从变换中心边界逆向输入通路移动,把输入通路中每个处理映射成Ca控制下的低层模块
Ct:将变换中心的每个处理映射成Ct控制下的低层模块
Ce:从变换中心边界顺向输出通路移动,把输出通路中每个处理映射成Ce控制下的低层模块 -
使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化
第一级分解
事务分析
若数据流不具有显著的事务分析的特点用变换分析,反之,若有明显的事务中心则应该采用事务分析
事务分析与变换分析大体类似,差别主要在由数据流图到软件结构的映射方法不同
事务分析的发送分支结构包含一个调度模块,它控制下层的所有活动模块