浅谈耦合和内聚

一、模块

模块指能完成某一功能的代码单元,可以是方法,类,系统等等

二、耦合

  1. 释义:耦合指的是模块间的关系,联系越紧密,相互影响越大,耦合度越高;反之则耦合度越低。耦合度越高对模块的修改产生的影响范围越大。所以模块设计应该尽量降低耦合度

  2. 耦合的种类和耦合度:耦合的种类根据模块间的关系来划分,种类包括无直接耦合,数据耦合,标记耦合,控制耦合,公共耦合,内容耦合,耦合度由低到高。有一点需要注意,并不是耦合度越低越好,仍然要具体情况具体分析。没有绝对的,只有适合的。

  3. 常见的耦合介绍

    • 无直接耦合
      一般的情况就是在模块间引入一个间接模块来做中转,虽然,此时两个模块都会和该间接模块产生耦合,但是这种耦合程度是很低的。举个例子,像设计模式中的工厂模式、外观模式,都是采取次方式。无直接耦合的两个模块修改不会相互影响

    • 数据耦合
      指两个模块之间传递的是简单的数据值,这种数据值不会影响模块内部的逻辑,举例说,模块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的运行逻辑

    • 公共耦合
      公共耦合指的多个模块公用同一个结构。上述的标记耦合是两个模块公用一个结构,可以认为是最简单的公共耦合,

    • 内容耦合
      指模块可以直接调用另一模块的内部逻辑,这在大部分高级语言中应该不存在了。

三、内聚

  1. 释义:内聚指的是模块内的代码片段的关系,联系越紧密,模块越独立,越不可拆分,对其他模块影响越小,简单说一个模块应该只干一件事。
  2. 内聚的种类和聚合度:种类包括无关联内聚,逻辑内聚,功能内聚,聚合度由低到高。
  3. 常见的内聚介绍
    • 无关联内聚:模块内事多个不同的流程,然后图方便写在了一起,如下例
       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);
      }
      
      流程a,流程b,流程c毫无关联,带来的影响是流程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)分支。

你可能感兴趣的:(java,java,开发语言)