3.信息隐蔽
$ R9 t. {; B' R; p信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。在设计时首先列出一些可能发生变化的因素,在划分模块时将一个可能发生变化的因素隐蔽在某个模块的内部,使其他模块与这个因素无关。在这个因素发生变化时,我们只需修改含有这个因素的模块,而与其他模块无关。隐蔽的对象可以有:什么的决策,可能修改的决策,数据结构的内部连接以及对它所做的操作细节,内部特征码,与计算机硬件有关的细节等。信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。) A8 e( g# j: Z! b
4.模块独立
1 b7 D* V% X# q2 R4 ~模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程序的度量标准有两个:耦合和内聚。耦合是指模块之间联系的紧密程度。耦合度越高则模块的独立性越差。内聚是指模块内部各元素之间联系的紧密程度。例如一个完成多个功能的模块的内聚度就比完成单一功能的模块的内聚度低。内聚度越低模块的独立性越差。因此,模块独立就是希望每个模块都是高内聚低耦合的。
) N. Y. T/ r _, R(1)耦合# {6 e, ^$ I0 T
两个模块之间的耦合方式通常有如下7种,下面按它们的耦合度从低到高的次序依次作介绍。5 e+ v: y# \+ p. d0 j
① 非直接耦合:非直接耦合是指两个模块没有直接的联系,它们中的任一个都能不依赖于对方而独立地工作。
4 |% X! g* o4 u6 Q2 ~② 数据耦合:数据耦合是指两个模块借助于参数表传递简单数据。. {, n4 H- L% p
③ 标记耦合(stamp coupling):当一个数据结构的一部分(如记录的一部分)借助于模块接口被传递时就发生标记耦合。' j( m4 q% n! h- w
④ 控制耦合:控制耦合指两个模块间传递的信息中包含用于控制模块内部逻辑的控制信息。
' q" t( D5 p# S8 W; ?# u⑤ 外部耦合:当模块与软件以外的环境有关时就发生外部耦合。例如,输入/输出把一个模块与特定的设备、格式、通信协议耦合在一起。
2 i3 C3 A, V6 ^! l⑥ 公共耦合:多个模块引用一全局数据区的模式称为公共耦合。例如FORTRAN语言中的COMMON语句,C语言中的external数据类型,一个磁盘文件等都是全局数据区。
; J" s y. s. [; h1 d# C k) r⑦内容耦合:内容耦合指两上模块之间出现了下列情况之一:% ^# @: q8 k2 v" Z# k: d# M5 o
一个模块访问另一个模块的内部数据;( C- A: B! Y4 n& h& v! G5 \, a
一个模块不通过正常入口转到另一模块的内部;
6 h" S( h5 ?' l1 \$ k9 ~4 ^两个模块有一部分程序代码重叠;1 O$ G8 Y& d Y
一个模块有多个入口。
4 g9 w0 |) @: D F4 M(2)内聚
- c+ @( L4 K [1 l7 F7 A模块的内聚种类通常可分成7种,下面按内聚度从低到高的次序依次作介绍。; y" M2 ~ O7 ^
①偶然内聚:如果一个模块完成一组任务,这组任务彼此间即使有关系,其关系也是很松散的,这个模块属于偶然内聚。
1 T' q( F* K- T; K0 C- z& |②逻辑内聚:如果一个模块完成逻辑上相关的一组任务,这个模块是逻辑内聚的。例如,产生与类型无关的全部输出的模块。
7 A1 i y$ y& \/ d# r! h! f③瞬时内聚(temporal cohesion):如果一个模块所包含的任务必须在同一时间间隔内执行,这个模块属于瞬时内聚。例如初始化模块。0 S# [7 H( [, l" W
④过程内聚:如果一个模块的处理元素是相关的,而且必须按特定的次序执行,这个模块属于过程内聚。
3 y; ]1 F! U4 Q⑤通信内聚:如果一个模块的所有处理元素集中在一个数据结构的区域上,该模块属于通信内聚。例如,一个模块中的所有处理元素使用同一输入数据。5 M& U/ ^: X( }1 ?
⑥顺序内聚:如果一个模块的处理元素是相关的,而且必须顺序执行,这个模块属于顺序内聚。! l/ s* W& R8 D. [# r7 U! Z! o
⑦功能内聚:如果一个模块完成一个单一的功能,模块中的各部分在此目标下协同工作,而且都是为完成这一功能而不可缺少的,那么这个模块是功能内聚的。 |