推荐阅读:
Java/Android 常见的设计模式总结,提高代码重用性和扩展下
概念
耦合性(英语:Coupling,dependency,或称耦合力或耦合度)是指一程序中,模块及模块之间信息或参数依赖的程度。
内聚性是一个和耦合性相对的概念,一般而言低耦合性代表高内聚性,反之亦然。耦合性和内聚性都是由提出结构化设计概念的赖瑞·康斯坦丁所提出[1]。低耦合性是结构良好程序的特性,低耦合性程序的可读性及可维护性会比较好。
耦合的因素
造成耦合的强度依赖于以下几个原因可以是一个模块对另一个模块的调用;一个模块向另一个模块传递的数据量;一个模块施加到另一个模块的控制的多少;模块之间接口的复杂程度。
耦合因素从强到弱的排序,如下:
(1)内容耦合。当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模块。类与类之间直接调用或继承关系都是属于这种耦合。
(2)公共耦合。两个及两个以上的模块共同引用一个全局数据项就称为公共耦合。
(3)控制耦合。一个模块在界面上传递一个信号(如开关值、标志量等)控制另一个模块,接收信号的模块的动作根据信号值进行调整,称为控制耦合。
(4)标记耦合。模块间通过参数传递复杂的内部数据结构,称为标记耦合。此数据结构的变化将使相关的模块发生变化。
(5)数据耦合。模块间通过参数传递基本类型的数据,称为数据耦合。
(6)非直接耦合。模块间没有信息传递时,属于非直接耦合。
耦合的威胁
相信多数开发人员遇到过高耦合的代码带来的烦恼,在了解什么是耦合后,对为什么要降低耦合度也已经有一定的认识了。如果在耦合度很高的情况下,修改代码将会“牵一发而动全身”。如果在没有理清这些耦合关系之前就修改,很可能造成未知的程序异常或业务数据错乱。特别是对于需求变化较多以及多人协作开发维护的项目,修改一处模块,可能导致本来运行稳定的模块出现错误,甚至导致恶性循环,bug永远改不完。项目开发的效率降低,开发成本增加。
如何解决以上耦合带来的潜在威胁?其中,一个重要手段就是降低代码的耦合度,但也不可能完全做到有零耦合,因为也是几乎无法做到得事情。只需要项目开发之前,提前去设计代码的组织结构。比如,知道某功能后期基本不维护修改,那即使高耦合了也没关系,反之就需要通过设计模式去降低耦合度。
常见设计模式学习连接:Java/Android 常见的设计模式总结,提高代码重用性和扩展下
耦合度降低
常见的降低耦合的方法总结,如下:
(1)少用类的继承,多用接口隐藏实现的细节。
我们知道Java的面向对象编程中接口属于多态性,而引入接口除了支持多态外, 其中另一个目是隐藏实现细节也是。这个知识点很重要,在现在流行的各种设计模式MVC\MVP等 ,用到的核心技能。比如,一个网络请求的类 GetData.class ,里面有一个getInfo()方法,里面写了从Java后台获取接口数据的代码。通常,都会在需要调用数据的页面,使用 new GetData().getInfo() 去调用。那么如何隐藏实现的细节代码呢? 就是写一个接口 GetDataImp.clss ,在 GetDataImp.class 里写没有方法体的 getInfo() (ps:允许传参),让GetData implement(实现)接口 ,并且会实现getInfo()的具体代码 。然后在需要调用的页面,直接New GetDataImp .getInfo() 即可。
(2)模块的功能化分尽可能的单一
道理也很简单,功能单一的模块供其它模块调用的机会就少。其实这是高内聚的一种说法,高内聚低耦合一般同时出现。
(3)遵循一个定义只在一个地方出现
(4)少使用全局变量
(5)类属性和方法的声明少用public,多用private关键字
(6)多用设计模式
比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。尽量不用“硬编码”的方式写程序。同时也尽量避免直接用SQL语句操作数据库。
(7)避免直接操作或调用其它模块或类(内容耦合)
如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。