软件模块化设计

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 软件的总体结构主要要回答的问题

  • 软件的组成部分
  • 软件的层次关系
  • 模块的内部处理逻辑
  • 模块之间的界面

2. 软件设计方法

  • 结构化设计方法(SD)
  • 面向数据结构的设计方法(JSD)
  • 面向对象的设计方法(OOD)

3. 软件设计分为两个阶段

  1. 概要设计(总体设计)
    确定软件的结构以及各组成成分(子系统或模块)
  2. 详细设计
    确定模块内部的算法和数据结构,产生描述各模块程序过程的详细文档

软件设计的基本概念

  1. 模块化
  2. 抽象与细化
  3. 信息隐蔽
  4. 软件复用
1. 模块化
模块化: 把程序划分成若干个模块, 每个模块完成一个子功能, 把这些模块集总起来组成一个整体,可以完成指定的功能,满足问题的功能.
模块: 一个拥有明确定义的输入、输出和特性的程序实体。

  • 将系统划分成模块
  • 决定每个模块的功能
  • 决定模块的调用关系
  • 决定模块的界面, 即模块间传递的数据
2. 抽象(Abstraction)与细化
抽象:解决问题时只考虑与问题有关的方面,不考虑与问题无关的方法。即抽出事物的本质特性而不考虑细节。
细化:即分解。在逐步细化中,特别强调这种分解的“逐步”性质,即每一部分仅较其前一步增加“少量”的细节。这样,在相信的两步之间就只有变化, 不难验证它们的内容是否等效。

3. 信息隐蔽
信息隐蔽的含义: 有效的模块化可以通过定义一级独立的模块来实现,这些模块相互之间只交流软件功能必需的信息。
换句话说:模块所包含的信息,不允许 其它不需要这些信息的模块访问,独立的模块间仅仅交换为完成系统功能而必须交换的信息。
信息隐蔽的基本原则:功能独立,高内聚且低耦合

模块化设计

模块化是好的软件设计的一个基本准则,可减小钥匙所需要的总工作
分解                  分解
    高层模块 =======> 分解复杂问题  ========> 较小问题

1. 分解

若C(p1) > C(p2), 则E(p1) > E(p2)
其中p1和p2是两个问题,C(x)是由X问题决定的复杂性, E(X)是解决X问题所需要的工作量。
试验发现:
C(p1 + p2) > C(p1) + C(p2)
E(p1 + p2) > E(p1) + E(p2)
越小成本越低,但是集成成本却随着越小成功越高。如何确定模块划分的最小成本区,并保证模块的最佳性能,量设计活动中的主要任务之一。

2. 模块独立 性

1)模块独立性的概念:
  • 模块完成独立的功能
  • 符合信息隐蔽和信息局部化原则
  • 模块间卷边和依赖程度尽量小
2)模块独立性的度量
    模块独立性取决于模块的内部和外部特征。
    SD方法提出的定性的度量标准:
  • 模块自身的内聚性
  • 模块之间的耦合性
模块独立性的度量之一:内聚性
一个模块内部各成分之间相互关联的强度。
设计目标:高内聚(一个模块的所有成分都直接参与 并县城对于完成同一功能来说都是最基本的)
内聚性越高,模块独立性越强,由低向高的内聚方式为:
  1. 巧合内聚
  2. 逻辑内聚
  3. 时间内聚
  4. 过程内聚
  5. 通信内聚
  6. 信息内聚
  7. 功能内聚
(1)巧合内聚
模块内各分部间无联系, 例:
MOVE O TO R
READ FILE F
MOVE S TO T

模块中的三个语句没有任何联系,
缺点:可理解性差, 可修改性差。

(2)逻辑内聚
把几种相关功能(逻辑上相似的功能)组合在一模块内, 每次调用由传给模块的参数确定执行哪种功能。
软件模块化设计_第1张图片
缺点:增强了耦合程序(控制耦合),不易修改,效率低

(3)时间内聚
模块完成的功能必须在同一时间内执行,这些功能只因时间因素关联在一起。如
  • 初始化系统模块
  • 系统结束模块
  • 紧急故障处理模块
(4)过程内聚
模块内各处理成分相关,且必须以特定次序执行
软件模块化设计_第2张图片

(5)通信内聚
模块内各部分使用相同的输入数据,或产生相同的输出结果
软件模块化设计_第3张图片

(6)信息内聚

信息内聚指模块写成多个功能,各个功能都在同一数据结构上操作,每个功能有唯一入口。如对同一个数据库的查找-添加-删除-修改模块

(7)功能内聚
模块仅包括为完成某个功能所必须的所有成分(模块所有成分共同完成一个功能,缺一不可)

模块独立性的度量之二
耦合性是模块间相互依赖程度的度量,耦合的强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据
耦合性越高,模块独立性越弱, 耦合强度依赖的因素:
  • 一模块对另一模块的引用 
  • 一模块向另一模块传递的数据量
  • 一模块施加到另一模块的控制数量
  • 模块间接口的复杂度
软件模块化设计_第4张图片

(1)非直接耦合
两个模块没有直接关系,模块独立性最强。
(2)数据耦合
一个模块调用另一模块时,被调用模块的输入输出都是简单的数据,性松散耦合
软件模块化设计_第5张图片
(3)标记耦合
如两个模块通过传递数据结构(不是简单的数据,而是记录,数组等)加以联系,或都与一个数据结构有关系,则称这两个模块间存在标记耦合
软件模块化设计_第6张图片
信息情况是一个数据结构,图中模块都与此数据结构产生依赖关系,它们之间也是标记耦合

(4)控制耦合
一模块通过开关量、标志、名字等控制信息,明显地控制另一模块
软件模块化设计_第7张图片
控制耦合增加了理解和编程的复杂性,调用模块必须知道被调用模块的内部逻辑,增加了相互依赖

去除模块间控制耦合的方法:
1)将被调用模块内的判定上移到调用模块中进行
2)被调用模块分解成若干单一功能模块。

(5)外部耦合
一组模块均与同一外部环境关联(例如: I/O模块与特定的设备、模式和通信 协议关联),它们之间便存在外部耦合。
外部耦合必不可少,但是这种模块数目应尽量少。

(6)公共耦合
一组模块引用同一个共用数据区(也称全局数据区,公共数据环境)
公共数据区指:
  • 全局数据结构
  • 共享通讯区
  • 内存公共覆盖区等
软件模块化设计_第8张图片
公共耦合存在的问题:
  1. 软件可理解性降低: 模块间存在错综复杂的联系
  2. 软件可维护性差: 修改变量名或属性困难
  3. 软件可靠性差: 公共数据区及全程变量无保护措施
慎用公共数据区和全程变量

(7)内容耦合
一模块直接访问另一模块的内部信息(程序代码或数据),最不好的内容耦合形式

发生内容耦合的情形:
  1. 一模块直接访问另一模块的内部数据
  2. 一模块不通过正常入口转到另一模块内
  3. 两模块有一部分代码重叠
  4. 一模块有多个入口

如何降低耦合度?
1)如模块必须存在耦合,选择适当的耦合类型
原则:
尽量使用数据耦合
少用控制耦合
限制公共耦合的范围
坚决避免使用内容耦合

2)降低模块间接口的复杂性
软件模块化设计_第9张图片

转载于:https://my.oschina.net/hotleave/blog/73769

你可能感兴趣的:(软件模块化设计)