第四章 总体设计

怎样实现目标系统

【考核内容】

总体设计的概念、设计步骤;模块化的概念、作用,模块化程度与软件开发工作量的关系;Miller法则,模块独立性的重要性,模块耦合及其分类,模块内聚及其分类,模块设计的几条启发式规则及与之相关的概念(深度、宽度、扇出、扇入、作用域);结构图的符号及其意义。

【考核要求】

1. 掌握总体设计的概念与设计步骤;
  • 总体设计的概念
    1. 基本目的是回答“概括地说,系统应该如何实现”这个问题;
    2. 设计软件的结构,确定软件的程序有哪些模块组成,以及这些模块的关系
  • 总体设计的步骤:系统设计阶段,确定系统的实现方案;结构设计阶段,确定软件结构
    1. 设想供选择的方案;
    2. 选取合理的方案;
    3. 推荐最佳方案;
    4. 功能分解;
    5. 设计软件结构;
    6. 设计数据库;
    7. 制定测试计划;
    8. 书写文档;
    9. 审查和复查。
2. 理解软件总体设计中模块化的作用,模块化程度与软件开发工作量的关系;
  • 模块:可以用一个名字调用的相邻程序序列
  • 模块化:把程序分成独立命名且可以独立访问的模块,每一个模块完成一个子功能,这些模块所构成的整体,可以满足用户的需求。
  • 模块化的作用
    • 可以使软件结构清晰,不仅容易设计也容易阅读和理解
    • 提高软件的可靠性:因为程序错误往往出现在模块或模块之间的接口中,所以模块化使软件容易测试和调试;
    • 提高软件的可修改性
    • 有助于软件开发的组织管理:可以由不同的开发人员编写不同的模块。
  • 模块化程度与软件开发工作量的关系
    • 当模块数量增加时每个模块的规模将减小,开发单个模块的工作量确实减少了;但是,随着模块数目增加,设计模块间的接口所需要的工作量也将增加。
3. 掌握Miller法则;
  • Miller法则image-20240403155658083
  • 模块独立:是模块化,抽象,信息隐藏,局部化的直接结果。每个模块完成一个相对独立的功能,和其它模块关系简单,没有过多相互作用关系。
    • 重要性:
      • 具有独立功能的模块容易开发
      • 独立功能的模块容易测试和维护
  • 抽象:抽出事物的本质特性而不考虑他们的细节;
  • 信息隐藏:一个模块包含的信息,对不需要这些信息的模块来说,是不可访问的;
  • 局部化:把一些关系密切的软件元素物理地放得彼此接近;
4. 理解5种模块耦合形式:数据耦合、控制耦合、特征耦合、公共耦合、内容耦合;
  • 耦合:软件结构中不同模块间互联程度度量;
  • 非直接耦合:模块可以独立工作,没关系;
  • 数据耦合:模块之间通过参数交换数据信息
  • 控制耦合:通过参数交换控制信息
  • 特征耦合:给被调用模块传入整个数据结构作为参数,而只使用了数据结构的一部分数据
  • 公共耦合:通过以公共数据环境作用;
  • 内容耦合(相当紧密):访问内部数据,多个入口,非正常进入
  • 原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合,完全不用内容耦合;
5. 理解7中模块内聚形式:功能内聚、顺序内聚、通信内聚、过程内聚、时间内聚、逻辑内聚、偶然内聚;
  • 内聚:模块内部各个元素的连接紧密程度;
  • 功能内聚:模块各个元素完成的是某个功能必不可少的部分,eg:矩阵乘法;
  • 顺序内聚:模块内各个元素同某功能密切相关,且按顺序执行,eg:修改信息,先查后改;
  • 通信内聚:模块各个部分使用相同的输入数据,产生相同的输出数据;
  • 过程内聚:模块内部处理元素相关,特定次序执行;
  • 时间内聚:模块内各个处理元素在同一时间段内完成,eg:初始化工作;
  • 逻辑内聚:模块完成功能在逻辑上相同或相似;.
  • 偶然内聚:模块内部各部分没有联系
6. 掌握模块设计的启发式规则及相关概念。
  • 启发式规则

    1. 改进软件结构提高模块独立性:初步结构分解或合并,降低耦合提高内聚;

    2. 软件规模应该适中:过大分解不充分,但分解不应降低模块独立性;过小开销大于优先操作,接口复杂;

    3. 深度、宽度、扇出和扇入应适当;

      • 深度:软件结构控制层数,标志大小和复杂程度;

      • 宽度:软件结构同一层规模数最大值,越大越复杂;

      • 扇入:多少上级模块调用该模块;

      • 扇出:一模块直接控制调用的模块数,大,复杂,小,不好。3~9;

    4. 模块作用域应在控制域内;

      • 作用域:受该模块内判定影响的所有模块集合;
      • 控制欲:模块本身及所有直接间接从属它的模块集合;
    5. 降低模块接口复杂程度;

    6. 设计单入口、单出口模块:防止内容耦合;

    7. 模块功能可预测:可预测输出结果;