动画图解高内聚与低耦合
你知道的越多,不知道的就越多,业余的像一棵小草!
你来,我们一起精进!你不来,我和你的竞争对手一起精进!
编辑:业余草
来源:cnblogs.com/xdecode/p/9393885.html
推荐:https://www.xttblog.com/?p=5062
高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。
上面光说概念,大家可能难以理解,今天分享几个动图,帮助大家理解!
模块
模块就是从逻辑上将系统分解为更细微的部分,分而治之,复杂问题拆解为若干简单问题,逐个解决。
耦合主要描述模块之间的关系,内聚主要描述模块内部。模块的粒度可大可小,可以是函数、类、功能块等等。
耦合
模块之间存在依赖,导致改动可能会互相影响,关系越紧密,耦合越强,模块独立性越差。
比如模块 A 直接操作了模块 B 中数据,则视为强耦合,若 A 只是通过数据与模块 B 交互,则视为弱耦合。
独立的模块便于扩展,维护,写单元测试,如果模块之间重重依赖,会极大降低开发效率。
内聚
模块内部的元素,关联性越强,则内聚越高,模块单一性更强。一个模块应当尽可能独立完成某个功能。
如果有各种场景需要被引入到当前模块,代码质量将变得非常脆弱,这种情况建议拆分为多个模块。
低内聚的模块代码,不管是维护,扩展还是重构都相当麻烦,难以下手。
接口设计原则
好的接口应当满足设计模式六大原则,很多设计模式,框架都是基于高内聚低耦合这个出发点的。
单一职责原则: 一个类只负责一个功能领域中的相应职责。
开闭原则: 一个软件实体应当对扩展开放,对修改关闭。
里氏代换原则: 所有引用基类(父类)的地方必须能透明地使用其子类的对象。
依赖倒转原则: 抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
接口隔离原则: 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
迪米特法则: 一个软件实体应当尽可能少地与其他实体发生相互作用,例如外观模式,对外暴露统一接口。
举几个栗子
外观模式
为系统中多个子系统提供一致的对外调用,对客户端隐藏子系统细节,降低其与子系统的耦合。
桥接模式
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");
总结
最后,我们来个一句话结尾。“低耦合”给软件项目带来的优点是:易于变更、易于重用。