软件工程复习(四)

结构化设计(Structured Design, SD) (整体understanding)

结构化设计工作通常划分为概要设计和详细设计两个阶段

  • 概要设计又称总体设计初步设计
  • 概要设计的主要任务:分析软件规格说明(来自需求分析的输出),对软件进行功能分解,划分为模块,设计出模块结构
  • 详细设计阶段:详细设计每个模块,确定每个模块功能的算法数据结构

设计过程

总体设计过程通常由两个主要阶段组成:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构。

  • 设想供选择的方案
  • 选择合理的方案
  • 推荐最佳方案
  • 功能分解
  • 设计软件结构
  • 设计数据库
  • 制定测试计划
  • 书写文档
  • 复查和复审

设计原理

  • 模块化

    • 概念

      • 模块是由边界元素限定的相邻的程序元素的序列,而且有一个总体标识符来代表。
      • 面向对象范型中的对象是模块,对象内的方法也是模块。模块是构成程序的基本构件
      • 每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求
    • 模块化和软件成本

      • 每一个程序都相应地有一个最适当的模块书目M,使系统的开发成本最小
    • 优点

      • 结构清晰
      • 容易阅读和理解
      • 容易测试和调试
      • 有助于提高软件的可靠性
      • 可修改性
      • 便于组织和管理
  • 抽象

    • 把事物、状态或过程之间存在的共性集中概括起来,暂时忽略他们之间的差异,这就是抽象
  • 逐步求精

    • 为了能集中精力解决主要问题而尽量推迟对问题细节的考虑
    • 求精实际上就是细化的过程

      抽象与求精是一对互补的概念

      • 抽象使得设计者能够说明过程和数据,同时却忽略低层细节。
      • 抽象是一种通过忽略多余的细节同时强调有关的细节,而实现逐步求精的方法。
      • 求精则帮助设计者在设计过程中揭示出低层细节。
      • 这两个概念都有助于设计者在设计演化过程中创造出完整的设计模型。
  • 信息隐藏和局部化

    • 一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的
  • 模块独立 (master)

    “模块独立”概念是模块化、抽象、逐步求精和信息隐藏等概念的直接结果,也是完成有效的模块设计的基本标准。可以由两个定性标准来度量,这两个标准分别称为内聚耦合

    • 耦合:耦合衡量不同模块彼此互相依赖(连接)紧密程度
    • 内聚:内聚衡量一个模块内部各个元素彼此结合的紧密程度


    对于模块设计,我们一般追求:模块内部高内聚,模块之间低耦合

    • 耦合

      • 非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,非直接耦合的模块独立性最强,模块间的耦合程度最低

      • 数据耦合:通过简单的数据参数传递产生的耦合,是一种低耦合

      • 标记(特征)耦合:

        • 传递参数表记录信息,如文件、数组、指针等。
        • 当把整个数据结构当做参数传入模块,但是模块实际上只需要其中的一部分元素
      • 控制耦合:

        • 传递的信息中有控制信息,有可能是一个简单变量,但可能改变程序流程
        • 它是中等程度的耦合,增加了系统的复杂程度,适当分解可以用数据耦合替代它。
      • 外部耦合:一组模块都访问同一全局简单变量

      • 公共环境耦合:一组模块访问同一个公共数据环境

      • 内容耦合:

        • 一组模块使用另一模块内部数据;模块通过非正常渠道进入另一模块执行
        • 这是最高程度的耦合
      • 使用原则:尽量使用数据耦合,少用控制耦合,限制公共环境耦合的范围,完全不用内容耦合。

    • 内聚

      理想内聚的模块只做一件事情,设计模块时,通常追求模块内部是高内聚

      内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合

      • 低内聚:
        • 偶然内聚
        • 逻辑内聚
        • 时间内聚
      • 中内聚
        • 过程内聚
        • 通信内聚
      • 高内聚
        • 顺序内聚(信息内聚)
        • 功能内聚

启发规则

长期实践经验所得,有助于实现有效的模块化

  • 改进软件结构提高模块独立性

  • 模块规模应该适中

  • 深度、宽度、扇出和扇入都应适当

    • 深度:树高
    • 宽度:某层最大模块数
    • 扇出:直接控制的模块数
    • 扇入:有多少个上机的模块直接指向它
  • 模块的作用域应该在控制域之内

    • 如图所示,A的控制域就包括BCDEF
    • 如果G也在A的作用域之内,则就不是一个合理的设计
    • 应该把G下放一层,放在A的控制域之内
  • 力争降低模块接口的复杂程度

  • 设计单入口单出口的模块

  • 模块功能应该可以预测

    • 相同输入,得到可预测的想通过输出

描绘软件结构的图形工具 (master)

层次图HIPO图结构图

  • 层次图

    • 层次图也称H图
    • 在层次图中一个矩形框代表一个模块,框间的连线表示调用关系(位于上方的矩形框所代表的模块调用位于下方的矩形框所代表的模块)。
  • HIPO图

    • HIPO图是美国IBM公司发明的“层次图加输入/处理/输出图”的英文缩写。
    • 为了使HIPO图具有可追踪性,在H图(即层次图)里除了顶层的方框之外每个方框都加了编号
    • 然后每个方框对应用一张IPO图来描述,IPO图中应该明显的标出其在上述改进的H图中的编号
  • 结构图(了解)

    • 结构图和层次图类似,也是描绘软件结构的图形工具
    • 结构图中带注释的箭头表示模块调用过程中来回传递的信息
    • 尾部是空心圆表示传递的是数据实心圆表示传递的是控制信息
    • 其它符号
      • 判定为真时调用A,为假时调用B
      • 模块M循环调用模块A,B,C

面向数据流的设计方法 (understanding)

面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。它定义了一些不同的“映射”,利用这些映射可以把数据流图变换成软件结构

  • 概念

    • 变换流

      • 信息通常以“外部世界”的形式进入软件系统,经过处理以后再以“外部世界”的形式离开系统
    • 事物流

      • 接收输入数据(输入数据又称为事物
      • 分析每个事物,以确定它的类型
      • 根据事务类型选取一条活动的通路
    • 设计过程

  • 变换分析

    • 复查基本系统模型
    • 复查并精化数据流图
    • 确定数据流图具有变换特性还是事务特性
    • 确定输入流和输出流的边界,从而孤立出变换中心
    • 完成“第一级分解”
    • 完成“第二级分解”
      • 未精化的输入结构
      • 未精化的变换结构
      • 未精化的输出结构
    • 使用设计度量和启发规则对第一次分割得到的软件结构进一步精化
  • 事务分析

    • 虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。
    • 事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同。
    • 对于一个大系统,常常把变换分析和事务分析应用到同一个数据流图的不同部分,由此得到的子结构形成“构件”,可以利用它们构造完整的软件结构
    • 事务分析的映射方法:
  • 设计优化(refactoring)

    • P112
坚持原创技术分享,您的支持将鼓励我继续创作!