“高内聚、松耦合”是一个非常重要的设计思想,能够有效地提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。很多设计原则都以实现代码的“高内聚、松耦合”为目的,比如单一职责原则、基于接口而非实现编程等。

实际上,“高内聚、松耦合”是一个比较通用的设计思想,可以用来指导不同粒度代码的设计与开发,比如系统、模块、类,甚至是函数,也可以应用到不同的开发场景中,比如微服务、框架、组件、类库等。为了方便讲述,接下来就以“类”作为这个设计思想的应用对象来展开讲解,其他应用场景读者可以自行类比。

在这个设计思想中,“高内聚”用来指导类本身的设计,“松耦合”用来指导类与类之间依赖关系的设计。不过,这两者并非完全独立不相干。高内聚有助于松耦合,松耦合又需要高内聚的支持。

什么是高内聚?

所谓高内聚,就是指相近的功能应该放到同一个类中,不相近的功能不要放到同一个类中。相近的功能往往会被同时修改,放到同一个类中,修改会比较集中,代码容易维护。实际上,单一职责原则是实现代码高内聚非常有效的设计原则。

什么是松耦合?

所谓松耦合是说,在代码中,类与类之间的依赖关系简单清晰。即使两个类有依赖关系,一个类的代码改动不会或者很少导致依赖类的代码改动。实际上,依赖注入、接口隔离、基于接口而非实现编程,以及迪米特法则,都是为了实现代码的松耦合。

“内聚”和“耦合”之间的关系?

前面也提到,“高内聚”有助于“松耦合”,同理,“低内聚”也会导致“紧耦合”。关于这一点,这里用一张对比图来解释。图中左边部分的代码结构是“高内聚、松耦合”;右边部分正好相反,是“低内聚、紧耦合”。


图中左边部分的代码设计中,类的粒度比较小,每个类的职责都比较单一。相近的功能都放到了一个类中,不相近的功能被分割到了多个类中。这样类更加独立,代码的内聚性更好。

因为职责单一,所以每个类被依赖的类就会比较少,代码低耦合。一个类的修改,只会影响到一个依赖类的代码改动。我们只需要测试这一个依赖类是否还能正常工作就行了。

图中右边部分的代码设计中,类粒度比较大,低内聚,功能大而全,不相近的功能放到了一个类中。这就导致很多其他类都依赖这个类。当我们修改这个类的某一个功能代码的时候,会影响依赖它的多个类。我们需要测试这三个依赖类,是否还能正常工作。这也就是所谓的“牵一发而动全身”。

除此之外,从图中我们也可以看出,高内聚、低耦合的代码结构更加简单、清晰,相应地,在可维护性和可读性上确实要好很多。

总结

“高内聚、松耦合”是一个非常重要的设计思想,能够有效提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。“高内聚”用来指导类本身的设计,“松耦合”用来指导类与类之间依赖关系的设计。

所谓高内聚,就是指相近的功能应该放到同一个类中,不相近的功能不要放到同一类中。相近的功能往往会被同时修改,放到同一个类中,修改会比较集中。所谓松耦合指的是,在代码中,类与类之间的依赖关系简单清晰。即使两个类有依赖关系,一个类的代码改动也不会或者很少导致依赖类的代码改动。

【设计模式】理解高内聚、松耦合相关推荐

  1. 最简单理解高内聚低耦合

    低耦合: 耦合就是元素与元素之间的连接,感知和依赖量度.这里说的元素即是功能,对象,系统,子系统.模块. 例如:现在有方法A和方法B 我们在A元素去调用B元素,当B元素有问题或者不存在的时候,A元素就 ...

  2. 简单理解高内聚低耦合-高内聚低耦合通俗理解是什么?

    低耦合: 耦合就是元素与元素之间的连接,感知和依赖量度.这里说的元素即是功能,对象,系统,子系统.模块. 例如:现在有方法A和方法B 我们在A元素去调用B元素,当B元素有问题或者不存在的时候,A元素就 ...

  3. 深入理解高内聚,低耦合

    起因:模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单,两个定性的度量标准――耦合性和内聚性. 耦合性也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量 ...

  4. 如何理解高内聚低耦合?Java/Android 程序员必看的知识

    推荐阅读: Android MVC设计模式详解 Android 框架MVVM详解 Android MVC设计模式详解 Java/Android 常见的设计模式总结,提高代码重用性和扩展下 概念 耦合性 ...

  5. 怎样理解高内聚低耦合?

    在网上查了很多相关的资料不能更好地去帮我们理解高内聚与低耦合.以我自己的理解总结以下几点: 什么是高内聚: 在我们开发项目中的时候,需要有很多的模块,但模块与模块间肯定会存在相互调用.高内聚指的就是模 ...

  6. 软件开发及过程管理——理解高内聚-低耦合

    目录 一. 低耦合(Low Coupling) 二. 哪些是耦合 三. 高内聚-低耦合的作用 3.1 根据可能的变化设计软件 3.2 合理的职责划分 3.3 使用接口而不是继承 四. 设计模式专栏 一 ...

  7. 怎么理解高内聚低耦合

    本文转自:http://www.cnblogs.com/hegezhou_hot/archive/2010/09/18/1830306.html 一.上章回顾 在上篇中我们讲解了几类UML2.0语言新 ...

  8. c语言如何实现高内聚低耦合_怎么理解高内聚低耦合

    本文转自:http://www.cnblogs.com/hegezhou_hot/archive/2010/09/18/1830306.html 一.上章回顾 在上篇中我们讲解了几类UML2.0语言新 ...

  9. 高内聚 松耦合 高扇入 低扇出

    1:高扇入 扇入?扇入是什么东东?我以前还真不知道,仔细一看原来就是指被其它类或方法引用.那高扇入也就是说你这个类/方法-被很多其它类引用了.也就是利用率很高了.按照我的想法如果段代码我连写了三次,我 ...

  10. 如何理解高内聚低耦合

    高内聚就是说相关度比较高的部分尽可能的集中,不要分散 例如内聚性要求强的话就像Windows32中系统提供的API,里面的函数太多了,都放在一个Dll中,那么每个函数完成一个功能.这样强大的功能,会比 ...

最新文章

  1. linux 内核申请内存大小,linux内核常用的内存申请函数
  2. 《科学》:中国科学家揭示,人脑中间神经元多样性从何而来?
  3. activiti源码编译
  4. 数据结构实验之栈与队列三:后缀式求值
  5. html网页访问WebAPI中的方法遇到的问题
  6. JVM之类加载器ClassLoader
  7. NOIP练习赛题目5
  8. 基于DM642的X264开源代码实现的研究
  9. golang time包梳理
  10. 在计算机系统中使用加载器,在个人计算机系统中从软盘加载基本输入/输出系统的设备和方法...
  11. maven 入门介绍
  12. guava_学习_00_资源帖
  13. MATLAB符号运算——极限
  14. 2018web前端不好找工作之web前端面试简历补救篇
  15. Excel之VBA编程常用语句300句
  16. 计算机网络五层体系结构各层协议
  17. 【前端基础】20.JQuery基本语法
  18. 45种攻入后台的方法(非原创,来自伟大的网络)
  19. 清除C盘系统垃圾和缓存的批处理bat文件
  20. 【Book】剑指Offer -- By 何海涛

热门文章

  1. 南京大学苏州校区,明年启用!
  2. 短视频技术课程培训干货分享
  3. 用什么软件可以注册亚马逊买家账号
  4. php邮件服务器搭建,如何快速简单的使用Linux搭建邮件服务器
  5. PHP 设置多域名允许跨域访问
  6. 一位程序员的2016年终告白
  7. java.lang.RuntimeException:java.lang.RuntimeException:org.codehaus.plexus.component.repository.exc
  8. java90到100随机数生成器_java实现随机数生成器
  9. lvgl的区别 qt_QT开发lvgl
  10. 二级c 云图/程序填空题