浅谈高内聚低耦合

sisophon 2019-11-29 PM 21℃ 0条

一、概念:

1.内聚性概念:

内聚性,又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。
内聚性是对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。模块中组成元素结合的越紧密,模块的内聚性就越高,模块的独立性也就越高。理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事情。模块的内聚性和耦合性是两个相互对立且又密切相关的概念。
所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。

2.耦合性概念:

耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。

3.高内聚低耦合

(1)模块粒度来看:

高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合)   
低耦合:减少类内部,一个成员方法调用另一个成员方法。  

(2)类角度来看:

高内聚低耦合:减少类内部,对其他类的调用.

(3)功能块来看:

高内聚低耦合:减少模块之间的交互复杂度(接口数量,参数数据)
横向:类与类之间、模块与模块之间。
纵向:层次之间;尽可能,内容内聚,数据耦合。

二、分类:

1.内聚性分类

内聚性是一种非量化的量测,可利用评量规准来确认待确认源代码的内聚性的分类。内聚性的分类如下,由低到高排列:
(1)偶然内聚性:偶然内聚性是指模块中的机能只是刚好放在一起,模块中各机能之间唯一的关系是其位在同一个模块中(例如:“工具”模块)。
(2)逻辑内聚性:逻辑内聚性是只要机能只要在逻辑上分为同一类,不论各机能的本质是否有很大差异,就将这些机能放在同一模块中(例如将所有的鼠标和键盘都放在输入处理副程序中)。模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
(3)时间性内聚性:时间性内聚性是指将相近时间点运行的程序,放在同一个模块中(例如在捕捉到一个异常后调用一函数,在函数中关闭已打开的文件、产生错误日志、并告知用户)。
(4)程序内聚性:程序内聚性是指依一组会依照固定顺序运行的程序放在同一个模块中(例如一个函数检查文件的权限,之后打开文件)。
(5)联系内聚性/信息内聚/通信内聚:联系内聚性是指模块中的机能因为处理相同的数据或者指各处理使用相同的输入数据或者产生相同的输出数据,因此放在同一个模块中(例如一个模块中的许多机能都访问同一个记录)。
(6)依序内聚性/顺序内聚:依序内聚性是指模块中的各机能彼此的输入及输出数据相关,一模块的输出数据是另一个模块的输入,类似工厂的生产线(例如一个模块先读取文件中的数据,之后再处理数据)。
(7)功能内聚性:功能内聚性是指模块中的各机能是因为它们都对模块中单一明确定义的任务有贡献(例如XML字符串的词法分析)。

2.耦合性分类

耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:
(1)内容耦合:当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
(2)公共耦合:两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
(3)外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
(4)控制耦合:一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。
(5)标记耦合:若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。
(6)数据耦合:模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。
(7)非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。
总结:耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。

三、高内聚、低耦合的方法:

1.降低耦合度的方法

(1)少使用类的继承,多用接口隐藏实现的细节。 Java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。  
(2)模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。(其实这是高内聚的一种说法,高内聚低耦合一般同时出现)。  
(3)遵循一个定义只在一个地方出现。  
(4)少使用全局变量。  
(5)类属性和方法的声明少用public,多用private关键字。  
(6)多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。  
(7)尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库。  
(8)最后当然就是避免直接操作或调用其它模块或类(内容耦合);如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。  

2.增强内聚度方法

(1)模块只对外暴露最小限度的接口,形成最低的依赖关系。  
(2)只要对外接口不变,模块内部的修改,就不得影响其他模块。  
(3)删除一个模块,应当只影响有依赖关系的其他模块,而不应该影响其他无关部分。  

最后放两张图片:
低内聚,高耦合:
123.jpg
高内聚,低耦合:
456.jpg

标签: PHP

非特殊说明,本博所有文章均为博主原创。

评论啦~