一、模块
模块指能完成某一功能的代码单元,可以是方法,类,系统等等
二、耦合
-
释义:耦合指的是模块间的关系,联系越紧密,相互影响越大,耦合度越高;反之则耦合度越低。耦合度越高对模块的修改产生的影响范围越大。所以模块设计应该尽量降低耦合度
-
耦合的种类和耦合度:耦合的种类根据模块间的关系来划分,种类包括无直接耦合,数据耦合,标记耦合,控制耦合,公共耦合,内容耦合,耦合度由低到高。有一点需要注意,并不是耦合度越低越好,仍然要具体情况具体分析。没有绝对的,只有适合的。
-
常见的耦合介绍
-
无直接耦合
一般的情况就是在模块间引入一个间接模块来做中转,虽然,此时两个模块都会和该间接模块产生耦合,但是这种耦合程度是很低的。举个例子,像设计模式中的工厂模式、外观模式,都是采取次方式。无直接耦合的两个模块修改不会相互影响 -
数据耦合
指两个模块之间传递的是简单的数据值,这种数据值不会影响模块内部的逻辑,举例说,模块A做加法运算,模块B传递给模块A两个数 1和2,结果一定是3。即使A模块调用100次结果也是3,或者A模块用任何数调用结果都应该是相加。 -
标记耦合
和数据耦合类似,只不过传递的不是简单数值,而是对象等结构。之所以耦合度比数据耦合高,是因为对象被两个模块共享,一个模块修改对象,会对另一个产生影响 -
控制耦合
模块A可以通过传递数据(简单数据,对象等结果)给模块B,进而控制模块B的逻辑。举例如下public class Ouhe { public static void main(String[] args) { } // a模块 public static void a() { b(true); b(false); } // b模块 public static void b(boolean change) { if (change) { System.out.println(2); } else { System.out.println(1); } } }
a通过传递change值影响b的运行逻辑
-
公共耦合
公共耦合指的多个模块公用同一个结构。上述的标记耦合是两个模块公用一个结构,可以认为是最简单的公共耦合, -
内容耦合
指模块可以直接调用另一模块的内部逻辑,这在大部分高级语言中应该不存在了。
-
三、内聚
- 释义:内聚指的是模块内的代码片段的关系,联系越紧密,模块越独立,越不可拆分,对其他模块影响越小,简单说一个模块应该只干一件事。
- 内聚的种类和聚合度:种类包括无关联内聚,逻辑内聚,功能内聚,聚合度由低到高。
- 常见的内聚介绍
- 无关联内聚:模块内事多个不同的流程,然后图方便写在了一起,如下例
流程a,流程b,流程c毫无关联,带来的影响是流程a的失败会导致流程b,可以用设计模式中的观察者进行改进public void cal(int a, int b, int c, int d) { // 流程a System.out.println(a + b); // 流程b System.out.println(c + d); //流程c System.out.println(a * b); }
- 逻辑内聚:简单点说就是耦合中的控制耦合,根据控制变量的不同,会有多个不同逻辑写在一起,如下例
上例随着控制变量的增多,会变得异常复杂,且难于理解,每一个分支就是一个不同的流程。完成可以把每个分支拆出方法,让后由上层流程调用public class Moshi3 { public void cal(int a, int b, int c) { if (a == 0) { if (b == 0) { System.out.println(1); if (c == 2) { System.out.println(3); } } else if (c == 1) { System.out.println(2); } } else if (a == 1) { System.out.println(1); } } }
- 功能内聚:模块内的每个元素都参与同一个流程,一个片段的输入是下一个片段的输出,且不存在或存在极少的一级(无嵌套的if)分支。
- 无关联内聚:模块内事多个不同的流程,然后图方便写在了一起,如下例