图解高内聚与低耦合

模块

模块就是从逻辑上将系统分解为更细微的部分, 分而治之, 复杂问题拆解为若干简单问题, 逐个解决.

耦合主要描述模块之间的关系, 内聚主要描述模块内部. 模块的粒度可大可小, 可以是函数, 类, 功能块等等.

耦合

模块之间存在依赖, 导致改动可能会互相影响, 关系越紧密, 耦合越强, 模块独立性越差.

比如模块A直接操作了模块B中数据, 则视为强耦合, 若A只是通过数据与模块B交互, 则视为弱耦合.

独立的模块便于扩展, 维护, 写单元测试, 如果模块之间重重依赖, 会极大降低开发效率.

内聚

模块内部的元素, 关联性越强, 则内聚越高, 模块单一性更强. 一个模块应当尽可能独立完成某个功能,

如果有各种场景需要被引入到当前模块, 代码质量将变得非常脆弱, 这种情况建议拆分为多个模块.

低内聚的模块代码, 不管是维护, 扩展还是重构都相当麻烦, 难以下手.

接口设计原则

好的接口应当满足设计模式六大原则, 很多设计模式, 框架都是基于高内聚低耦合这个出发点的.

  1. 单一职责原则: 一个类只负责一个功能领域中的相应职责.
  2. 开闭原则: 一个软件实体应当对扩展开放,对修改关闭.
  3. 里氏代换原则: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.
  4. 依赖倒转原则: 抽象不应该依赖于细节, 细节应当依赖于抽象. 换言之, 要针对接口编程, 而不是针对实现编程.
  5. 接口隔离原则: 使用多个专门的接口, 而不使用单一的总接口, 即客户端不应该依赖那些它不需要的接口.
  6. 迪米特法则: 一个软件实体应当尽可能少地与其他实体发生相互作用, 例如外观模式, 对外暴露统一接口.

举几个栗子

外观模式

为系统中多个子系统提供一致的对外调用, 对客户端隐藏子系统细节, 降低其与子系统的耦合.

桥接模式

JDBC中的把面向厂商的接口(Driver)和面向使用者的API(DriverManager)做了拆分隔离.

1         // 开发者只需要关注JDBC API, 无需关注不同数据库Driver接口实现
2         Class.forName("com.mysql.jdbc.Driver");
3         Connection conn = DriverManager.getConnection(url, username, password);

适配器模式

引入第三方库(hibernate, log4j), 不应该直接在代码中继承或者使用其实体类.

需要抽出上层统一接口, 然后增加实现类, 对外暴露接口.

1         // 代码与log4j强耦合, 不推荐
2         org.apache.log4j.Logger.getRootLogger().info("info");
3         // 底层可以随意更换log框架
4         FRLoggerFactory.getLogger().info("info");

什么是高内聚与低耦合?相关推荐

  1. 小菜学设计模式——高内聚、低耦合

    2019独角兽企业重金招聘Python工程师标准>>> 背景 本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习<大话设计模式>时的笔记摘要部分,当然,并不是记录 ...

  2. python模块化设计耦合度_什么是程序设计中的高内聚、低耦合?

    开发者经常遇到一些项目,比如一个真格量化中的策略,要求较高的模块独立性.模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单.我们有两个定性的度量标准--耦合性和内聚性. ...

  3. 耦合式是什么意思_高内聚 ,低耦合 到底是什么意思?

    总会听到大牛们说到"高内聚,低耦合",不是特别明白,最近查阅了一些资料,才明白. '高内聚,低耦合'是相对于代码而言,一个项目中: 每个模块之间相互联系的紧密程度,模块之间联系越紧 ...

  4. 你的代码是否按照高内聚、低耦合的原则来设计的?

    我们一直强调软件开发中要按照高内聚.低耦合的设计原则来做代码结构设计.c语言和c++不同,c语言面向过程.c++面向对象. 真正的项目中,要对业务升级,原来的业务函数需要保留,要保证老的功能继续维持, ...

  5. 云小课|打造企业数据“高内聚,低耦合”--试试GaussDB(DWS)逻辑集群,实现数据物理隔离

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:逻辑集群是基于No ...

  6. 6. 以下耦合度中最松散的耦合是_什么是程序设计中的高内聚、低耦合?

    开发者经常遇到一些项目,比如一个真格量化中的策略,要求较高的模块独立性.模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单.我们有两个定性的度量标准--耦合性和内聚性. ...

  7. 多模块顺序_软件架构基础 3: 什么是好的模块化代码?高内聚、低耦合如何衡量?...

    0. 写在前面 什么是好的代码?好的代码应该模块化. 王垠在其<编程的智慧>中也提到,要"写模块化的代码".(不对人做评价,这篇文章写得是非常好的.) 如果你读过< ...

  8. 什么叫高内聚、低耦合?

    耦合这个词,在开发人员里常常提到,但是很少有人解释耦合到底是什么?导致很多新手听见高内聚.低耦合这两个名词,就很奇怪,不知道到底说的是什么? 耦合,在开发中说的是所写的业务代码跨了几个动作,动作跨的越 ...

  9. 浅谈“高内聚,低耦合”

    浅谈"高内聚,低耦合" 高内聚,低耦合官方概念:在软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分模块的一个准则是高内聚低耦合.从模块粒度来看,高内聚:尽可能类的每个 ...

  10. 【Java设计模式 规范与重构】 三 大型重构的手段:高内聚,低耦合

    之前通过两篇Blog了解了重构的目的.内容.时机.方法.保障,了解了持续重构的重要性和好处,知道了单元测试对于重构代码的保障作用,同时明确小范围重构依照规范随时进行,而大型重构需要分层.模块化.解耦. ...

最新文章

  1. 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念
  2. arcsde9.3 the arcsde repository is not successfully created
  3. 如何QLayout内部的成员部件之间从左到右依次排列
  4. android getinstance 方法,Android中的'new Fragment()'和'Fragment.getInstance()'有什么区别?...
  5. Taro+react开发(80):状态改变的构造函数
  6. php redis.h,swoole安装hredis支持导致php不能加载swoole扩展
  7. (原创)c++11中的日期和时间库
  8. vue划入划出事件_基于vue中对鼠标划过事件的处理方式详解
  9. python需要缩进的块_“需要缩进块”
  10. mysql练习(重)
  11. iosxib 设置图片_iOS framework制作及使用(包含xib和图片)
  12. 金蝶14.0系统服务器安装教程,大神面对win7系统安装金蝶kis14.0的方式
  13. 【综合篇】Web前端性能优化原理问题
  14. java代码规范插件_阿里java代码规范IDEA插件之傻瓜教程
  15. FLV格式解析及其解析器的实现
  16. 星际大战(飞机游戏系列)
  17. 怎么用python电商文本挖掘?(5)
  18. 图像篡改检测C语言,图像篡改检测和定位(二)
  19. python tkinter progressbar_Tkinter 之ProgressBar进度条标签
  20. Win7 Wininit.exe任意加载/执行(漏洞)

热门文章

  1. Python自动生成ffmpeg转码HEVC (X265,H265) 命令
  2. 堆排序(JAVA版)
  3. 修改数据库账号密码(最新版本)
  4. 什么是接口测试?测试人员为什么要做接口测试?
  5. 51单片机驱动——LCD1602
  6. 布斯乘法 Mips实现 - Booth Algorithm
  7. mstsc远程桌面连接失败,提示CredSSP加密Oracel修正
  8. 光纤收发器常见故障问题的时候我们该如何解决呢
  9. v-for 循环中数据更新子组件视图不更新解决方案
  10. 【三维激光扫描】第五章:基于点云数据的立面图绘制及三维建模