高内聚与低耦合

高内聚低耦合的来源?

“高内聚低耦合”是软件工程中的概念,是判断软件系统设计好坏的标准。好的系统设计一定是具有“高内聚”和“低耦合”的。

为什么要高内聚低耦合?
高内聚低耦合的目标是实现系统的重用性,维护性,扩展性。当然它不仅仅只有这三个好处。但是我们在追求高内聚低耦合的同时要记住万事万物之间都是有矛盾性的,越高的内聚性,必然也会增加耦合性。越低的耦合性也会降低内聚性,所以我们要根据业务需求找到设计的平衡点,当然这也是系统设计最难的地方。

什么是内聚,为什么要高内聚?
内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能的联系。
如果模块中各元素具有高度相关的职责,除了这些职责内的任务,没有其它过多的工作,那么该元素就具有高内聚性,反之则为低内聚性。
高的内聚是指系统模块中各个元素紧密的联系,每个元素都能起到作用,很少或没有闲置资源。

拿我们住的房子来说,如果我们把房子看作模块,房子中的物品看作模块中的元素,如果房子中每个元素都能对我们有用,不管是使用或是欣赏,那么这个房子就是具有高内聚性的房子。

什么是耦合,为什么要低耦合?
耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。
我们用电脑举例,老式的电脑连接各种外设很多时候每种外设都有一个接口例如打印机,投影仪等,但是现在最新设计的电脑通常只有一个USB接口就可以和其他外设关联了。这就是低耦合的设计,降低接口复杂性。

内聚分为哪几类?耦合分为哪几类?

内聚有如下的种类,它们之间的内聚度由弱到强排列如下:
(1) 偶然内聚。模块中的代码无法定义其不同功能的调用。但它使该模块能执行不同的功能,这种模块称为巧合强度模块。
(2) 逻辑内聚。这种模块把几种相关的功能组合在一起, 每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能
(3) 时间内聚:把需要同时执行的动作组合在一起形成的模块为时间内聚模块。
(4) 过程内聚:构件或者操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递。
(5) 通信内聚:指模块内所有处理元素都在同一个数据结构上操作(有时称之为信息内聚),或者指各处理使用相同的输入数据或者产生相同的输出数据
(6) 顺序内聚:指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素输出就是下一功能元素的输入。
(7) 功能内聚:这是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可。

耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:
(1)  内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过不正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
(2) 公共耦合:若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
(3) 外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
(4) 控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合
(5) 标记耦合:一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。其实传递的是这个数据结构的地址;也就是地址传递。
(6) 数据耦合:指两个模块之间有调用关系,传递的是简单的数据值,一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的,相当于高级语言的值传递。
(7) 非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。
总结:耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。

综合上述,我们知道了高内聚和低耦合,也知道了它们在软件设计中的重要性。但是我更想说的是,其实不只是在软件工程中要强调高内聚低耦合。在现实生活中的其他领域,它也是非常重要的,很多行业和很多设计都体现了它的思想。我们来想想你现在做的事情,想想你现在做的行业,加入高内聚和低耦合。让我们一起来做的更好吧。

 

分享到: 更多
不允许评论