1. 总体设计与详细设计
- 关系:总体设计与详细设计是全局和局部的关系。不是抽象与具体,也不是整体与部分。
- 衔接工具:软件结构图是总体设计与详细设计之间的衔接工具。
- 分工:总体设计(结构设计)主要确定系统由哪些模块组成以及它们之间的关系。详细设计(过程设计)主要确定每个模块的处理过程。
2. 总体设计的必要性
- 必要性在于可以在一个全局的高度、以较低的成本,从较抽象的层次 分析、对比各种系统实现方案和软件结构。
- 从中选取最优解(最佳方案和最合理的软件结构),从而以较低的成本开发出较高质量的软件系统。
3. 总体设计过程
大体分为两个阶段:
- 系统设计阶段:主要用来确定实现方案。
- 结构设计阶段:主要用来确定软件结构。
详细过程(九个步骤):
设想供选择的方案:常用方法是以需求分析阶段得到的数据流图作为出发点。设想将数据流图中的处理进行分组的各种可能。
选取合理方案:一般选取低成本、中成本、高成本至少三种方案。每种方案需配备资料,包括系统流程图、物理部件清单、成本效益分析、实现系统进度计划。
推荐最佳方案:分析对比各种可能方案的利弊,选取最佳方案,制定详细实现计划。
- (步骤 1-3 属于系统设计阶段)。
功能分解:确定系统由哪些模块组成及模块间的关系(结构设计)。
设计软件结构:通常一个模块完成一个适当的子功能。将模块组织成良好的层次系统。层次结构是常见的考点,上层调用下层。顶层模块功能最抽象(发送调用命令),下层功能具体。可用层次图或结构图描绘。
设计数据库:本章不详细赘述,后续章节更新。
制定测试计划:本章不详细讨论,将在第七章展开。结合测试目的设计测试方案。注意:测试计划很早就在总体设计阶段实现。
书写文档:记录总体设计结果。文档包括:系统说明(含系统流程图、系统构成方案)、用户手册(根据总体设计结果修改需求阶段得到的初步手册)、测试计划、详细实现计划、数据库设计结果。
审查和复审:进行详细的技术审查和管理复审。
4. 设计原理
设计原理是软件设计过程应遵循的基本原理和概念。考试高频考点。
模块化:
模块:程序的基本构件。由边界元素限定、有总体标识符代表的相邻元素序列。
模块化:将程序划分为独立命名、独立访问的模块。每个模块完成一个子功能。
优点:
- 使软件结构清晰,易于设计、阅读和理解。
- 使软件易于测试和调试(错误局限在模块及接口),有助于提高可靠性。
- 提高软件的可修改性(变动通常只涉及少数模块),避免修改引入错误影响过多程序。
- 有助于软件开发的组织管理(分工合作)。
抽象:将相似方面集中概括起来,暂时忽略差异。抽象出事物的本质特征,暂时不考虑细节。
逐步求精:尽量推迟对问题细节的考虑,集中精力解决主要问题。有助于工程师集中精力于当前开发阶段最相关的方面。
信息隐藏与局部化:与封装(第九章后)非常相像。
- 信息隐藏:模块内包含的信息(过程和数据)对于不需要这些信息的模块不能访问。
- 局部化:将关系密切的软件元素物理地彼此靠近。局部化有利于信息隐藏。
- 优点:绝大多数部分被隐藏,修改期间引入的错误很少能传播到软件其他部分。
模块独立性:
- 概念:模块化、抽象、信息隐藏、局部化概念的直接结果和集大成者。开发具有独立功能、与其他模块之间没有过多相互作用的模块。
- 重要性:
- 有效的模块化更容易开发(分割功能、接口简化)。多人合作开发时尤其重要(与模块化优点相似)。
- 模块比较容易测试和维护(所需工作量小,错误传播范围小)(与抽象、信息隐藏优点相似)。
- 衡量尺度:内聚和耦合。模块独立是好设计的关键,设计决定软件质量。
5. 衡量模块独立性的尺度:耦合与内聚
二者相反。低耦合对应高内聚,高耦合对应低内聚。
耦合 (Coupling):标志着一个软件结构内
不同模块之间相互关联的程度。
- 越弱越好(松散耦合系统更好)。
- 弱耦合优点:易于研究、测试、维护任一模块,不需了解其他部分。联系简单,错误传播可能性小。强烈影响系统的可理解性、可测试性、可靠性和可维护性。
- 类型(由低到高):
- 数据耦合 (Data Coupling):通过参数交换信息(最好)。
- 控制耦合 (Control Coupling):传递信息包含控制信息(如开关量)。
- 特征耦合 (Stamp Coupling):将整个数据结构作为参数传递,调用模块只需要一部分(给多了)。
- 公共环境耦合 (Common Coupling):通过公共环境相互作用(如全局变量、共享通信区等)。
- 内容耦合 (Content Coupling):最高程度的耦合(最差)。如:模块访问另一模块内部数据、不通过正常入口转入内部、有部分程序代码重叠、模块有多个入口。
- 设计原则:尽量使用数据耦合,少用控制/特征耦合,限制公共耦合范围,完全不用内容耦合。
内聚 (Cohesion):标志着一个模块内
各个元素彼此结合的紧密程度。
- 越高越好(高内聚、强内聚、紧内聚更好)。
- 类型(由低到高):
- 偶然内聚 (Coincidental Cohesion):模块完成一组任务,彼此关系松散(如为节省空间把重复语句放一起)。最低。
- 逻辑内聚 (Logical Cohesion):任务在逻辑上属于相同或相似一类(如产生各种类型的全部输出)。
- 时间内聚 (Temporal Cohesion):任务必须在同一时间段内执行(如初始化工作)。
- 过程内聚 (Procedural Cohesion):处理元素相关,必须以特定次序执行。
- 通信内聚 (Communicational Cohesion):所有元素使用同一个输入数据,产生同一个输出数据。
- 顺序内聚 (Sequential Cohesion):处理元素与同一功能密切相关,必须顺序执行(前一元素输出是后一元素输入)。高内聚。
- 功能内聚 (Functional Cohesion):所有元素同属于一个整体,完成单一的功能。最高程度的内聚(最好)。
6. 启发规则(设计经验)
软件设计中应注意和遵循的经验。
提高模块的独立性(低耦合、高内聚)。
模块的规模应适中。过大分解不充分,独立性低;过小开销大于操作,接口复杂。
深度、宽度、扇入、扇出
都应适当。
- 深度 (Depth):软件结构中控制的层数。粗略标志系统大小复杂程度。
- 宽度 (Width):同一层次上模块总数的最大值。
- 扇出 (Fan-out):一个模块直接调用的模块数。
- 扇入 (Fan-in):有多少个上级模块直接调用它。
模块的作用域 (Scope of Effect)和控制域 (Scope of Control)。
- 作用域:受模块内一个判定影响的所有集合。
- 控制域:模块本身及所有直接或间接从属于它的模块。
力争降低模块的接口复杂度。
设计单入口、单出口的模块。易于理解和维护。
模块的功能应该可以预测,防止过分局限。
7. 描绘软件结构的图形工具
- 层次图 (Hierarchy Diagram):描绘软件的层次结构。矩形框代表模块,联系表示调用关系(与层次方框图、JASON图表示的组成关系不同)。适用于自顶向下设计。
- HIPO图 (Hierarchy plus Input-Process-Output):层次图 + 输入处理输出图 (IPO)。IPO图用于描述算法。特点是可追踪性(非顶层方框有编号)。
- 结构图 (Structure Chart):与层次图类似,都用于描绘软件结构。框之间表示调用关系。
8. 面向数据流的设计方法
- 通常也称为结构化设计方法。
- 基于数据流来设计软件结构。
- 数据流的类型决定映射方法。
- 两种数据流类型:
- 变换流 (Transform Flow):信息沿输入通路进入(外部转内部),经变换中心处理,沿输出通路离开(内部转外部)。
- 事物流 (Transaction Flow):数据流到达事务中心(处理器),事务中心根据类型选取若干动作序列之一执行。