今天跟领导交流时谈了一下业务解耦的一些内容,而其中就谈到了为什么需要解耦?回答这个问题,我们必须得知道什么是解耦。相信大多数朋友都在软件工程中听过这样一句话 —— “高内聚,低耦合”。那么什么是 “高内聚”,什么是 “低耦合”呢?下面区分介绍一下。
(资料图片)
内聚,从字面上来看有聚精会神、聚在一起的意思,那么高内聚也就是尽可能的使一个模块或一个类再或者是一个方法只专注做好一件事。
在设计软件的时候一定要采取【多聚合、少继承】的基本原则,因为使用 “聚合” 的这种方式能够使业务逻辑更加清晰,更有利于我们后期的扩展和维护。
例如订单模块,一般情况下,下单模块都会有如下的信息,订单的信息,产品的信息及谁下的单(买家信息)。这是基本的,那么设计的时候就要把相关的功能内聚到一起。当然这是从大功能(下单管理)上来说,当然这些模块还可以再细化分成产品、订单、会员等子模块。
耦合,从字面上来看有藕断丝连的意思,“耦” 这个字在中国汉语里指的是两个人在一起耕地,他俩各干各的互不影响,这也是“耦合”的由来。
那么 低耦合也就是尽可能的使每个模块之间或者每个类之间再或者是每个方法之间的关联关系减少,这样可以使各自尽可能的独立,一个地方出错,不会影响全部,更能提高代码的重用性。
所以在设计软件的时候也一定要注意各模块之间一定尽可能的减少联系,防止一个模块出现的问题影响到其他模块。
1、生活中的 “高内聚,低耦合”
军队的存在是为了保家卫国,我们国家的军队分为海军、陆军、空军等部队,他们各自的职责是不一样的。海军负责海上作战,陆军负责陆地作战,空军负责空中作战,他们之间的联系很少。
我们可以想想为什么要这样安排呢?如果我们国家的军队不分的那么细,每支部队都有在海上、陆地、空中作战的士兵,如果我们和日本在海上大战,我们还需要从各个部队中抽取能够在海上作战的士兵,再组成一支海上抗日军这样的部队,抽取出来的士兵的战斗力各有不一,还需要一个适应的过程,我们想想这支一盘散沙的部队能取得胜利嘛?
打仗在于兵贵神速,这样的一支部队还是一盘散沙呢,怎么能做到兵贵神速呢?那么我们可以早早的就把他们分为海军、陆军、空军,海军就负责在海上作战,陆军就负责在陆地作战,空军就负责在空中作战,我们如果和日本进行海上大战,我们直接派海军过去不就可以了嘛?
根据我们刚才的分析,证明了军队分为海军、陆军、空军的好处,那么我们再想想,他们之间的联系为什么会很少呢?咱们还是假设一下,如果每个部队总是依赖其他几个部队,不会独立战斗,那么如果某一天海军被派出去执行任务,美国这个时候空军来袭,我们的空军难道要等海军回来再战斗嘛?如果那样的话为时晚矣。所以他们之间应该独立作战,互相依赖的情况应该要减少。
这就是生活中的 “高内聚,低耦合” 的例子。类似这样的例子还有很多,只要我们留心观察就能发现。
2、Java中的 “高内聚,低耦合”
耦合放到Java里面就是两个类之间的联系的紧密程度,看下面这段代码:
public class A { public void say() { System.out.println("I am A"); }}public class B { public void put(A a) { a.say(); }}
从上面这个例子中我们可以看出来,A类 和 B类 之间存在一种很强的一个联系,我们把这种联系称为强耦合关系,B类的 put方法 参数必须是 A类类型,不可以是 非A类类型。
当然了,既然有强耦合关系当然也存在所谓的弱耦合关系,弱耦合也就是我们俗说的低耦合。那么请看下面这段代码:
public interface IBase { void say();}public class A implements IBase { @Override public void say() { System.out.println("I am A"); }}public class B implements IBase { @Override public void say() { System.out.println("I am B"); }}public class C { public void put(IBase base) { base.say(); }}
上面这段代码中 C类 与 A类、B类之间就存在一种弱耦合关系,C类 的 put方法 的参数可以是 A类类型 也可以是 B类类型,不像强耦合关系中必须是 A类类型 其他类型皆不可的情形。
我们实现低耦合就是对两类之间进行解耦,解除类之间的直接关系,将直接关系转换成间接关系,和上面代码一样,这种思想利用了多态的思想,不过一般情况都是使用接口的方式来实现解耦的。通常情况下我们在系统分离时只是以接口的方式提供服务,供其他的模块进行使用。在模块内部有大量的信息是不要向外部暴露的,所以模块在设计时访问域的定义就要划分好,防止因为访问域的定义而对模块的信息造成破坏。
“高内聚,低耦合”,用一句话概括就是写的代码尽可能专一的完成一个任务,且各段代码尽量模块化互相独立。可能大家觉得这只是开发要懂的内容,但如果运维想深入的话这个也是绕不过去的,理解了才能更好的去设计一个系统,保证系统高效稳定。