图解高内聚与低耦合

模块

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

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

耦合

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

比如模块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");

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

性能调优攻略

关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈...

3674
来自专栏猫哥学前班

网络慢?看看路由器设置对不对

防蹭网 开启 UPnP QoS 与网络限速 设置正确的 MTU 值 使用路由器交换机模式 使用无线中继扩展 Wi-Fi 信号 1、防蹭网 这是最最首要的一条...

72316
来自专栏Golang语言社区

Go的单元测试技巧

本文为社区粉丝原创投稿,再次感谢作者DrmagicE的分享,欢迎大家在评论区留言和作者讨论,同时也欢迎大家踊跃投稿,分享您的golang语言学习经验!投稿邮箱地...

1243
来自专栏极客生活

七种武器之一口箱子Redis

江湖传言「在任何规模、任何类型的服务器项目中,都存在一些最适合用Redis存储的数据。」

922
来自专栏SDNLAB

话说VLAN Tag 的“来龙去脉”

前言 自从上篇文章《三层交换机的工作原理》发布后,有很多的网络爱好者私底下与我取得了联系,针对当前的TCP/IP网络做了很多的探讨,从这些爱好者身上我也学习到了...

45111
来自专栏七夜安全博客

(原创)python爬取慕课网视频

2494
来自专栏程序员的知识天地

这一堆初中生写的类库、框架,让一群中年程序员坐不住了!

前不久在V2EX上看到一个帖子,主题是「一堆初中生写的类库、框架」,原本猿妹以为只是个标题党不以为意。点进去该博主的博客主页发现,博主确实是一名初中生,而且他的...

1303
来自专栏高性能服务器开发

C++日志系统如何设计

笔者在写作本章节的时候,并不敢把此章节的标题叫做《高性能日志系统的设计》,之所以不敢加上“高性能”三个字的原因是,第一,我的对于日志系统设计知识和经验都来自于学...

4383
来自专栏移动端周边技术扩展

移动端常用数据库

2664
来自专栏程序员互动联盟

【盟友分享】如何快速获取Chromium源码和编译

感谢盟友:我为之狂的热心分享!同时也希望盟友们多多分享自己写的不错的文章哦; 正文: 最近准备研究下Chromium源码,但在获取Chromium源码以及编译...

5508

扫码关注云+社区

领取腾讯云代金券