欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动画图解高内聚与低耦合

程序员文章站 2022-05-30 10:15:52
...

你知道的越多,不知道的就越多,业余的像一棵小草!

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

编辑:业余草

来源:cnblogs.com/xdecode/p/9393885.html

推荐:https://www.xttblog.com/?p=5062

高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。

耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。

内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。

上面光说概念,大家可能难以理解,今天分享几个动图,帮助大家理解!

模块

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

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

耦合

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

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

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

动画图解高内聚与低耦合

内聚

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

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

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

动画图解高内聚与低耦合

接口设计原则

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

  1. 单一职责原则: 一个类只负责一个功能领域中的相应职责。

  2. 开闭原则: 一个软件实体应当对扩展开放,对修改关闭。

  3. 里氏代换原则: 所有引用基类(父类)的地方必须能透明地使用其子类的对象。

  4. 依赖倒转原则: 抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

  5. 接口隔离原则: 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

  6. 迪米特法则: 一个软件实体应当尽可能少地与其他实体发生相互作用,例如外观模式,对外暴露统一接口。

举几个栗子

外观模式

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

动画图解高内聚与低耦合

桥接模式

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

// 开发者只需要关注JDBC API, 无需关注不同数据库Driver接口实现
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
动画图解高内聚与低耦合

适配器模式

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

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

// 代码与log4j强耦合, 不推荐
org.apache.log4j.Logger.getRootLogger().info("info");
// 底层可以随意更换log框架
FRLoggerFactory.getLogger().info("info");
动画图解高内聚与低耦合

总结

最后,我们来个一句话结尾。“低耦合”给软件项目带来的优点是:易于变更、易于重用。

动画图解高内聚与低耦合