4.2 软件设计的基本原理 软件设计中最重要的一个问题就是软件质量问题,用什么
标准对软件设计的技术进行衡量呢?本节介绍几种基本原理。
4.2.1 模块化 何为模块?模块在程序中是数据说明、可执行语句等程序对象的集合,或者是单独命名和编址的元素,如高级语言中的过程、函数、子程序等等。模块是可组合、分解和更新的单元。模块有以下基本属性:
接口:指模块的输入与输出。
功能:指模块实现什么功能。
逻辑:描述内部如何实现要求的功能及所需的数据。
状态:该模块的运行环境,即模块的调用与被调用关系。
功能、状态与接口反映模块的外在特性,逻辑反映它的内在特性。
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。
例如,设问题x,表示它的复杂性函数为C(x),解决它所需的工作量函数为E(x)。对于问题P1和P2,如果 C(P1)>C(P2)即Pl比P2复杂,
那么 E(P1)>E(P2)即问题越复杂,所需要的工作量越大。
根据解决一般问题的经验,规律是:
C(P1十P2)>C(P1)十C(P2)
即一个问题由两个问题组合而成的复杂度大于分别考虑每个问题的复杂度之和。这样可以推出:
E(Pl十P2)>E(P1)十E(P2)
由此可知,开发一个大而复杂的软件系统,将它进行适当的分解,不但可降低其复杂性,还可减少开发工作量,从而降低开发成本,提高软件生产率,但是模块划分越多,块内的工作量减少,模块之间接口的工作量增加了,如图4—l所示。因此在划分模块时,应减少接口的代价,提高模块的独立性。
4.2.2 抽象 抽象是认识复杂现象过程中使用的思维工具,即抽出事物本质的共同性而暂不考虑它的细节,不考虑其他因素。抽象的概念被广泛应用于计算机软件领域,在
软件工程学中更是如此。软件工程过程中的每一步都可以看作是对软件解决方法的抽象层次的一次细化。
4.2.3 信息隐蔽 通过抽象,可以确定组成软件的过程实体。通过信息隐蔽,可以定义和实现对模块的过程细节和局
数据结构的存取限制。信息隐蔽指在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说,是不能访问的。
4.2.4 模块独立性 为了降低软件系统的复杂性,提高可理解性、可维护性,必须把系统划分成为多个模块,模块不能任意划分,应尽量保持其独立性。模块独立性指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。
如何衡量软件的独立性呢?根据模块的外部特征和内部特征,提出了两个定性的度量标准--耦合性和内聚性。
1.耦合性
也称快间联系,指软件
系统结构中各模块间相互联系紧密程度的一种度量。模块之间系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。模块的耦合性有以下几种类型,分为:
(1)无直接耦合
指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此模块间耦合性最弱,模块独立性最高。
(2)数据耦合
指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。
(3)标记耦合
指两个模块传递的是数据结构,如:高级语言中的数组名、记录名、文件名等这些名字即为标记,其实传递的是这个数据结构的地址。
(4)控制耦合
指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行块内某些功能。
(5)公共耦合
指通过一个公共数据环境相互作用的那些模块间的耦合。公共数据环境可以是全程变量或数据结构、共享的通信区、内存的公共覆盖区及任何
存储介质上的文件、物理设备等。
(6)内容耦合
这是最高程度的耦合,也是最差的耦合。当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部,这种模块之间的耦合为内容耦合,这种情况往往出现在汇编程序设计中。
2 内聚性
又称块内联系,指模块的功能强度的度量。若一个模块内各元素(语句之间、程序段之间)联系的越紧密,则它的内聚性就越高,内聚性有以下几种类型:
(1)偶然内聚
指一个模块内的各处理元素之间没有任何联系。
(2)逻辑内聚
指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
(3)时间内聚
把需要同时执行的动作组合在一起形成的模块为时间内聚模块。
(4)通信内聚
指模块内所有处理元素都在同一个数据结构上操作(有时称之为信息内聚),或者指各处理使用相同的输人数据或者产生相同的输出数据。
(5)顺序内聚
指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。
(6)功能内聚
这是最强的内聚;指模块内所有元素共同完成一个功能,缺一不可。
耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。