一般模块之间可能的连接方式有七种,构成耦合性的七种类型.它们之间的关系为(由弱到强)
非直接耦合(Nondirect Coupling)
如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合.这种耦合的模块独立性最强..
数据耦合(Data Coupling)
如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合.由于限制了只通过参数表传递数据,按数据耦合开发的程序界面简单、安全可靠.因此,数据耦合是松散的耦合,模块之间的独立性比较强.在软件程序结构中至少必须有这类耦合.
印记耦合(Stamp Coupling)
如果一组模块通过参数表传递记录信息,就是标记耦合.事实上,这组模块共享了这个记录,它是某一数据结构的子结构,而不是简单变量.这要求这些模块都必须清楚该记录的结构,并按结构要求对此记录进行 *** 作.在设计中应尽量避免这种耦合,它使在数据结构上的 *** 作复杂化了.如果采取“信息隐蔽”的方法,把在数据结构上的 *** 作全部集中在一个模块中,就可以消除这种耦合.
控制耦合(control Coupling)
如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合.耦合的实质是在单一接口上选择多功能模块中的某项功能.因此,对所控制模块的任何修改,都会影响控制模块.另外,控制耦合也意味着控制模块必须知道所控制模块内部的一些逻辑关系,这些都会降低模块的独立性.
外部耦合(External Coupling)
一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合.例如C语言程序中各个模块都访问被说明为extern类型的外部变量.外部耦合引起的问题类似于公共耦合,区别在于在外部耦合中不存在依赖于一个数据结构内部各项的物理安排.
公共耦合(Common Coupling)
若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合.公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等.这种耦合会引起下列问题:1)所有公共耦合模块都与某一个公共数据环境内部各项的物理安排有关,若修改某个数据的大小,将会影响到所有的模块.2)无法控制各个模块对公共数据的存取,严重影响软件模块的可靠性和适应性.3)公共数据名的使用,明显降低了程序的可读性.[Page] 公共耦合的复杂程度随耦合模块的个数增加而显著增加.如图4.14所示,若只是两个模块之间有公共数据环境,则公共耦合有两种情况.若一个模块只是往公共数据环境里传送数据,而另一个模块只是从公共数据环境中取数据,则这种公共耦合叫做松散公共耦合.若两个模块都从公共数据环境中取数据,又都向公共数据环境里送数据,则这种公共耦合叫做紧密公共耦合.只有在模块之间共享的数据很多,且通过参数表传递不方便时,才使用公共耦合.否则,还是使用模块独立性比较高的数据耦合好些.
内容耦合(Content Coupling)
又称病态耦合.如果发生下列情形,两个模块之间就发生了内容耦合.1)一个模块直接访问另一个模块的内部数据; 2)一个模块不通过正常入口转到另一模块内部; 3)两个模块有一部分程序代码重叠(只可能出现在汇编语言中); 4)一个模块有多个入口.在内容耦合的情形,所访问模块的任何变更,或者用不同的编译器对它再编译,都会造成程序出错.好在大多数高级程序设计语言已经设计成不允许出现内容耦合.它一般出现在汇编语言程序中.这种耦合是模块独立性最弱的耦合.
耦合是对一个软件结构内不同模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度, 进入或访问某一模块的点,以及通过接口的数据,一般模块之间可能的连接方式有7种,构成耦合的7种类型,它们之间的关系为: 低 耦合性 高非直接耦合
数据耦合
标记耦合
控制耦合
外部耦合
公共耦合
内容耦合
强独立性 弱
下面举例说明以上各种耦合:
a.非直接耦合(Nondirect Coupling)在这种情况下,两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。例如在实数的运算中,有两个模块分别完成几个实数的求和,求乘积功能,这两个模块之间没有直接联系,只有在主模块调用中有执行的前后顺序而已,这个例子即属于非直接耦合。
b.数据耦合(Data Coupling)即一个模块访问另一个模块时,彼此之间是通过数据参数来交换输入,输出信息的,这种耦合为数据输入,输出信息的这种耦合为数据耦合。如有两个模块,其中A完成两个烽的比较,求出其中最大的并返回该值,模块B是完成了个数的比较,求出其中最大的并返回该最大值,为完成四个数的比较,模块B调用模块A即可完成,在这种调用关系中,模块A的运算结果作为一个参烽参加B的运算,这两个模块之间即发生数据耦合。数据耦合是松散的耦合,模块间的独立性比较强。
c.标记耦合(Stamp Coupling),即一组模块通过参数传递记录信息,这就是标记耦合。事实上,这组模块共享了这个记录,它是某一数据结构的子结构,而不是简单变量。
d.控制耦合(Control Coupling)即一个模块通过开关标志,名字等控制住处明显的控制,选择另一模块的功能,这就是控制耦合,如下 图所示,这一种耦合实质是在单一接口上实现选择多功能模块中的某项功能,如程序设计中用到多路选择结构即是最好的例子。
Switch (x)
A
B
C
e.外部耦合(External Coupling)即一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递全局数据结构,而且不是通过参数表传递全局变量的信息。如C语言中都访问被说明为extern类型的外部变量的各个模块之间即发生外部耦合。外部耦合引起的问题类似于下面要介绍的公共耦合,区别在于外部耦合中不存在依赖于一个数据结构内部各项的物理安排。
f.公共耦合(Common Coupling)若一组模块都访问同一个公共数据环境,则它们之间的耦合就是公共耦合。公共的数据环境可以是全局的数据结构,共享的通信区,内存的公共覆盖区等。如几个模块对同一个数据库的查询就属于这种耦合。公共耦合可以分为松散的公共耦合和紧密的公共耦合,其中松散的公共耦合是单向 *** 作,如两个或多个模块对同一个文件的读 *** 作;而紧密的公共耦合是双向的 *** 作,如两个或多个模块对同一文件的读写 *** 作。下面用图表示松散的和紧密的公共耦合。
公共数据公共数据
模块A模块B模块A模块B
松散的数据耦合紧密的数据耦合
g.内容耦合。即有下列情况时即出现内容耦合。 (1)一个模块访问另一个模块数据;
(2)一个模块不通过正常入口而转到另一个模块的内部; (3)两个模块有一部分代码重叠; (4)一个模块有多个入口。
模块a
模块b
a. 一个模块访问另一个模块数据
b. 两个模块有一部分代码重叠
c. 一个模块有多个入口
2、 为每种类型的模块内聚
低耦合,高内聚。。。程序不需要耦合。。。
面向对象不是针对解决问题编程。。。
低耦合:程序增加需求了,那么如果我只添加一个类就能完成,而不用想以前面向过程时那样重写整个的修改程序。。。
高内聚:类结构内部需要高内聚,联系紧密。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)