0%

第五章 总体设计

1. 总体设计与详细设计

  • 关系:总体设计与详细设计是全局局部的关系。不是抽象与具体,也不是整体与部分。
  • 衔接工具软件结构图是总体设计与详细设计之间的衔接工具。
  • 分工:总体设计(结构设计)主要确定系统由哪些模块组成以及它们之间的关系。详细设计(过程设计)主要确定每个模块的处理过程

2. 总体设计的必要性

  • 必要性在于可以在一个全局的高度、以较低的成本,从较抽象的层次 分析、对比各种系统实现方案和软件结构。
  • 从中选取最优解(最佳方案和最合理的软件结构),从而以较低的成本开发出较高质量的软件系统

3. 总体设计过程

  • 大体分为两个阶段:

    • 系统设计阶段:主要用来确定实现方案。
    • 结构设计阶段:主要用来确定软件结构。
  • 详细过程(九个步骤):

    1. 设想供选择的方案:常用方法是以需求分析阶段得到的数据流图作为出发点。设想将数据流图中的处理进行分组的各种可能。

    2. 选取合理方案:一般选取低成本、中成本、高成本至少三种方案。每种方案需配备资料,包括系统流程图、物理部件清单、成本效益分析、实现系统进度计划。

    3. 推荐最佳方案:分析对比各种可能方案的利弊,选取最佳方案,制定详细实现计划。

      • (步骤 1-3 属于系统设计阶段)
    4. 功能分解:确定系统由哪些模块组成及模块间的关系(结构设计)。

    5. 设计软件结构:通常一个模块完成一个适当的子功能。将模块组织成良好的层次系统。层次结构是常见的考点,上层调用下层。顶层模块功能最抽象(发送调用命令),下层功能具体。可用层次图结构图描绘。

    6. 设计数据库本章不详细赘述,后续章节更新。

    7. 制定测试计划本章不详细讨论,将在第七章展开。结合测试目的设计测试方案。注意:测试计划很早就在总体设计阶段实现

    8. 书写文档:记录总体设计结果。文档包括:系统说明(含系统流程图、系统构成方案)、用户手册(根据总体设计结果修改需求阶段得到的初步手册)、测试计划、详细实现计划、数据库设计结果。

    9. 审查和复审:进行详细的技术审查和管理复审。

4. 设计原理

  • 设计原理是软件设计过程应遵循的基本原理和概念。考试高频考点。

    1. 模块化:

      • 模块:程序的基本构件。由边界元素限定、有总体标识符代表的相邻元素序列。

      • 模块化:将程序划分为独立命名、独立访问的模块。每个模块完成一个子功能。

      • 优点:

        • 使软件结构清晰,易于设计、阅读和理解。
        • 使软件易于测试和调试(错误局限在模块及接口),有助于提高可靠性。
        • 提高软件的可修改性(变动通常只涉及少数模块),避免修改引入错误影响过多程序。
        • 有助于软件开发的组织管理(分工合作)。
    2. 抽象:将相似方面集中概括起来,暂时忽略差异。抽象出事物的本质特征,暂时不考虑细节。

    3. 逐步求精尽量推迟对问题细节的考虑,集中精力解决主要问题。有助于工程师集中精力于当前开发阶段最相关的方面。

    4. 信息隐藏与局部化:与封装(第九章后)非常相像。

      • 信息隐藏:模块内包含的信息(过程和数据)对于不需要这些信息的模块不能访问
      • 局部化:将关系密切的软件元素物理地彼此靠近。局部化有利于信息隐藏。
      • 优点:绝大多数部分被隐藏,修改期间引入的错误很少能传播到软件其他部分
    5. 模块独立性:

      • 概念:模块化、抽象、信息隐藏、局部化概念的直接结果集大成者。开发具有独立功能、与其他模块之间没有过多相互作用的模块。
      • 重要性:
        • 有效的模块化更容易开发(分割功能、接口简化)。多人合作开发时尤其重要(与模块化优点相似)。
        • 模块比较容易测试和维护(所需工作量小,错误传播范围小)(与抽象、信息隐藏优点相似)。
      • 衡量尺度:内聚耦合。模块独立是好设计的关键,设计决定软件质量。

5. 衡量模块独立性的尺度:耦合与内聚

  • 二者相反。低耦合对应高内聚,高耦合对应低内聚。

  • 耦合 (Coupling):标志着一个软件结构内

    不同模块之间相互关联的程度。

    • 越弱越好(松散耦合系统更好)。
    • 弱耦合优点:易于研究、测试、维护任一模块,不需了解其他部分。联系简单,错误传播可能性小。强烈影响系统的可理解性、可测试性、可靠性和可维护性
    • 类型(由低到高):
      1. 数据耦合 (Data Coupling):通过参数交换信息(最好)。
      2. 控制耦合 (Control Coupling):传递信息包含控制信息(如开关量)。
      3. 特征耦合 (Stamp Coupling):将整个数据结构作为参数传递,调用模块只需要一部分(给多了)。
      4. 公共环境耦合 (Common Coupling):通过公共环境相互作用(如全局变量、共享通信区等)。
      5. 内容耦合 (Content Coupling):最高程度的耦合(最差)。如:模块访问另一模块内部数据、不通过正常入口转入内部、有部分程序代码重叠、模块有多个入口。
    • 设计原则:尽量使用数据耦合,少用控制/特征耦合,限制公共耦合范围,完全不用内容耦合
  • 内聚 (Cohesion):标志着一个模块内

    各个元素彼此结合的紧密程度。

    • 越高越好(高内聚、强内聚、紧内聚更好)。
    • 类型(由低到高):
      1. 偶然内聚 (Coincidental Cohesion):模块完成一组任务,彼此关系松散(如为节省空间把重复语句放一起)。最低。
      2. 逻辑内聚 (Logical Cohesion):任务在逻辑上属于相同或相似一类(如产生各种类型的全部输出)。
      3. 时间内聚 (Temporal Cohesion):任务必须在同一时间段内执行(如初始化工作)。
      4. 过程内聚 (Procedural Cohesion):处理元素相关,必须以特定次序执行。
      5. 通信内聚 (Communicational Cohesion):所有元素使用同一个输入数据,产生同一个输出数据
      6. 顺序内聚 (Sequential Cohesion):处理元素与同一功能密切相关,必须顺序执行(前一元素输出是后一元素输入)。高内聚。
      7. 功能内聚 (Functional Cohesion):所有元素同属于一个整体,完成单一的功能。最高程度的内聚(最好)。

6. 启发规则(设计经验)

  • 软件设计中应注意和遵循的经验。

    1. 提高模块的独立性(低耦合、高内聚)。

    2. 模块的规模应适中。过大分解不充分,独立性低;过小开销大于操作,接口复杂。

    3. 深度、宽度、扇入、扇出

      都应适当。

      • 深度 (Depth):软件结构中控制的层数。粗略标志系统大小复杂程度。
      • 宽度 (Width):同一层次上模块总数的最大值
      • 扇出 (Fan-out):一个模块直接调用的模块数。
      • 扇入 (Fan-in):有多少个上级模块直接调用它。
    4. 模块的作用域 (Scope of Effect)和控制域 (Scope of Control)。

      • 作用域:受模块内一个判定影响的所有集合。
      • 控制域:模块本身及所有直接或间接从属于它的模块。
  1. 力争降低模块的接口复杂度

  2. 设计单入口、单出口的模块。易于理解和维护。

  3. 模块的功能应该可以预测,防止过分局限。

7. 描绘软件结构的图形工具

    1. 层次图 (Hierarchy Diagram):描绘软件的层次结构。矩形框代表模块,联系表示调用关系(与层次方框图、JASON图表示的组成关系不同)。适用于自顶向下设计。
      1. HIPO图 (Hierarchy plus Input-Process-Output):层次图 + 输入处理输出图 (IPO)。IPO图用于描述算法。特点是可追踪性(非顶层方框有编号)。
      1. 结构图 (Structure Chart):与层次图类似,都用于描绘软件结构。框之间表示调用关系

8. 面向数据流的设计方法

  • 通常也称为结构化设计方法
  • 基于数据流来设计软件结构。
  • 数据流的类型决定映射方法
  • 两种数据流类型:
    1. 变换流 (Transform Flow):信息沿输入通路进入(外部转内部),经变换中心处理,沿输出通路离开(内部转外部)。
    2. 事物流 (Transaction Flow):数据流到达事务中心(处理器),事务中心根据类型选取若干动作序列之一执行。