个人觉得软件耦合,是用来判断一个模块(功能,野可以简单理解为一个xx.c文件)与其他模块之间的耦合联系的,通过理论分析我们可以确定出两个模块之间的必须耦合元素有哪些,然后由于C语言@jonah_king的灵活性,我们必须选择出最合适的耦合方式。
耦合按照标准的定义一共分为以下7个类别:
1、内容耦合
内容耦合是最高程度的耦合
如果出现下列情况之一,两个模块间就发生了内容耦合:
1.1、一个模块A访问另一个模块B的内部数据@jonah_king(不是全局变量);
缺点:模块A的运行会被模块B内部的数据修改影响(甚至是被修改的时间)。
(1)模块A依赖模块B的内部运作,要想了解A,必须先了解模块B的内部变量,降低了可读性。
(2)模块B很有可能不知道模块A的存在,若更改模块B,很可能导致A的动作,但是B却不知道。
更改建议:
程序中不允许存在内容耦合,如果必须耦合的话,设计相应访问借口。
1.2、一个模块不通过正常入口转到另一个模块的内部@jonah_king(C语言)
goto语句会造成此现象。
更改建议:
程序中禁止使用goto语句,此语句会严重增加代码的复杂度和可读性。
1.3、两个模块有一部分程序代码重叠;汇编
1.4、一个模块有多个入口。 汇编
2、公共耦合
两个或两个以上的模块共同引用一个全局数据项(不是单独的变量,也不是通过函数参数传递),这种耦合被称为公共耦合。
公共耦合的可以是数据结构,共享通讯区,公共覆盖区…….
2.1、公共耦合的必要性
首先需要说明的是,公共耦合是必定要存在的,我还没有见过那么一个工程,不用全局结构体的。前面我们已经提到过如何计算一个模块的耦合度,
如果好多个模块都需要使用一个结构体,那么将这个结构体设置为全局数据项还是很有必要的。
2.2、公共耦合的缺点
(1)任意一个模块,对于公共数据的修改,都会影响其他模块的运行。
(2)不同模块对于公共数据的修改,可能会产生冲突。
(3) 公共耦合会降低程序可读性。
对于这条说法,我是邮电意见的,公共耦合是增加了程序的复杂度,不利用程序分析。但是其实并没有降低可读性。
补充一点:不同模块对于公共数据的操作权限可能不同,只读,只写或者读写。
一般来说,当模块之间共享数据较多且不具有统一性时,我们选择使用公共耦合
3、外部耦合
一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合
外部耦合和公共耦合是相似的,只不过一个是数据结构,一个是简单变量,其本质是一样的,详细说明见公共耦合
4、控制耦合
如果一个模块通过传递控制信息,明显地控制选择另一模块的功能,就是控制耦合。
这种耦合的实质是在单一接口上选择多功能模块中的某项功能。
缺点:
(1) 调用函数必须了解被调用函数的内部处理机制或者所有能够执行的功能,然后选择控制被调函数执行相应功能。
(2) 被调用函数的其中一部分需改,会导致整个函数的改变,所以所有调用者(即使调用其他控制功能)都可能受影响。
建议: 省去控制信息,将函数分为多个接口,每个接口执行不同的功能。
5、标记耦合
如果一组模块通过参数表传递记录信息,就是标记耦合。
事实上,这组模块共享了这个记录,它是某一数据结构的子结构,而不是简单变量。这要求这些模块都必须清楚该记录的结构,并按结构要求对此记录进行操作。在设计中应尽量避免这种耦合,它使在数据结构上的操作复杂化了。如果采取“信息隐蔽”的方法,把在数据结构上的操作全部集中在一个模块中,就可以消除这种耦合
6、数据耦合
如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合
7、非直接耦合
如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强
模块之间的耦合关系,按照操作权限进行以下分类:
1、读权限0x01
模块需要读取其他模块数据的状态。
其中读取的数据根据耦合计算公式可知,包括输入参数(数据和控制)、全局变量(数据和控制)。
2、写权限0x02
模块需要修改其他模块数据的状态。
其中读取的数据根据耦合计算公式可知,包括输出参数(数据和控制)、全局变量(数据和控制)。
3、执行权限0x04
模块需要调用其他模块内的功能(调用)。
其中读取的数据根据耦合计算公式可知,包括调用函数、被调用函数。
模块之间的耦合关系可能是上述三者中的一个,也可能是上述三者中的或组合,其全部耦合关系如下:
数值 | 权限 | 耦合严重度 |
001 | 读 | 1 |
010 | 写 | 1 |
011 | 读写 | 2 |
100 | 执行 | 1 |
101 | 读+执行 | 2 |
110 | 写+执行 | 2 |
111 | 读+写+执行 | 3 |
我们总得找出一种计算方法来计算模块耦合的程度,一般采用以下的公式:
(1)di: 输入数据参数的个数
(2)ci: 输入控制参数的个数
(3)do: 输出数据参数的个数
(4)co: 输出控制参数的个数 全局耦合:?
(5)gd: 用来存储数据的全局变量
(6)gc: 用来控制的全局变量 环境耦合:?
(7)w: 此模块调用的模块个数(扇出)
(8)r: 调用此模块的模块个数(扇入)
若Coupling(C)数值越大,表示模块耦合的情形越严重,@jonah_king数值一般会界于0.67(低度耦合)到1.0(高度耦合)之间。?
举例,若一模块只有一个输入数据参数,一个输出数据参数:?
若一模块的输入数据参数、输入控制参数、输出数据参数及输出控制参数都是5个,访问10个全局变量,扇出和扇入的模块个数别是3个及4个:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!