概述
今天跟領(lǐng)導(dǎo)交流時談了一下業(yè)務(wù)解耦的一些內(nèi)容,而其中就談到了為什么需要解耦?回答這個問題,我們必須得知道什么是解耦。相信大多數(shù)朋友都在軟件工程中聽過這樣一句話 —— “高內(nèi)聚,低耦合”。那么什么是 “高內(nèi)聚”,什么是 “低耦合”呢?下面區(qū)分介紹一下。
01
什么是內(nèi)聚
內(nèi)聚,從字面上來看有聚精會神、聚在一起的意思,那么 高內(nèi)聚也就是盡可能的使一個模塊或一個類再或者是一個方法只專注做好一件事。
在設(shè)計軟件的時候一定要采取【多聚合、少繼承】的基本原則,因為使用 “聚合” 的這種方式能夠使業(yè)務(wù)邏輯更加清晰,更有利于我們后期的擴(kuò)展和維護(hù)。
例如訂單模塊,一般情況下,下單模塊都會有如下的信息,訂單的信息,產(chǎn)品的信息及誰下的單(買家信息)。這是基本的,那么設(shè)計的時候就要把相關(guān)的功能內(nèi)聚到一起。當(dāng)然這是從大功能(下單管理)上來說,當(dāng)然這些模塊還可以再細(xì)化分成產(chǎn)品、訂單、會員等子模塊。
02
耦合
耦合,從字面上來看有藕斷絲連的意思,“耦” 這個字在中國漢語里指的是兩個人在一起耕地,他倆各干各的互不影響,這也是“耦合”的由來。
那么 低耦合也就是盡可能的使每個模塊之間或者每個類之間再或者是每個方法之間的關(guān)聯(lián)關(guān)系減少,這樣可以使各自盡可能的獨(dú)立,一個地方出錯,不會影響全部,更能提高代碼的重用性。
所以在設(shè)計軟件的時候也一定要注意各模塊之間一定盡可能的減少聯(lián)系,防止一個模塊出現(xiàn)的問題影響到其他模塊。
03
使用高內(nèi)聚,低耦合的好處
1、生活中的 “高內(nèi)聚,低耦合”
軍隊的存在是為了保家衛(wèi)國,我們國家的軍隊分為海軍、陸軍、空軍等部隊,他們各自的職責(zé)是不一樣的。海軍負(fù)責(zé)海上作戰(zhàn),陸軍負(fù)責(zé)陸地作戰(zhàn),空軍負(fù)責(zé)空中作戰(zhàn),他們之間的聯(lián)系很少。
我們可以想想為什么要這樣安排呢?如果我們國家的軍隊不分的那么細(xì),每支部隊都有在海上、陸地、空中作戰(zhàn)的士兵,如果我們和日本在海上大戰(zhàn),我們還需要從各個部隊中抽取能夠在海上作戰(zhàn)的士兵,再組成一支海上抗日軍這樣的部隊,抽取出來的士兵的戰(zhàn)斗力各有不一,還需要一個適應(yīng)的過程,我們想想這支一盤散沙的部隊能取得勝利嘛?
打仗在于兵貴神速,這樣的一支部隊還是一盤散沙呢,怎么能做到兵貴神速呢?那么我們可以早早的就把他們分為海軍、陸軍、空軍,海軍就負(fù)責(zé)在海上作戰(zhàn),陸軍就負(fù)責(zé)在陸地作戰(zhàn),空軍就負(fù)責(zé)在空中作戰(zhàn),我們?nèi)绻腿毡具M(jìn)行海上大戰(zhàn),我們直接派海軍過去不就可以了嘛?
根據(jù)我們剛才的分析,證明了軍隊分為海軍、陸軍、空軍的好處,那么我們再想想,他們之間的聯(lián)系為什么會很少呢?咱們還是假設(shè)一下,如果每個部隊總是依賴其他幾個部隊,不會獨(dú)立戰(zhàn)斗,那么如果某一天海軍被派出去執(zhí)行任務(wù),美國這個時候空軍來襲,我們的空軍難道要等海軍回來再戰(zhàn)斗嘛?如果那樣的話為時晚矣。所以他們之間應(yīng)該獨(dú)立作戰(zhàn),互相依賴的情況應(yīng)該要減少。
這就是生活中的 “高內(nèi)聚,低耦合” 的例子。類似這樣的例子還有很多,只要我們留心觀察就能發(fā)現(xiàn)。
2、Java中的 “高內(nèi)聚,低耦合”
耦合放到Java里面就是兩個類之間的聯(lián)系的緊密程度,看下面這段代碼:
public class A { public void say() { System.out.println(\”I am A\”); }}public class B { public void put(A a) { a.say(); }}
從上面這個例子中我們可以看出來,A類 和 B類 之間存在一種很強(qiáng)的一個聯(lián)系,我們把這種聯(lián)系稱為強(qiáng)耦合關(guān)系,B類的 put方法 參數(shù)必須是 A類類型,不可以是 非A類類型。
當(dāng)然了,既然有強(qiáng)耦合關(guān)系當(dāng)然也存在所謂的弱耦合關(guān)系,弱耦合也就是我們俗說的低耦合。那么請看下面這段代碼:
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類之間就存在一種弱耦合關(guān)系,C類 的 put方法 的參數(shù)可以是 A類類型 也可以是 B類類型,不像強(qiáng)耦合關(guān)系中必須是 A類類型 其他類型皆不可的情形。
我們實現(xiàn)低耦合就是對兩類之間進(jìn)行解耦,解除類之間的直接關(guān)系,將直接關(guān)系轉(zhuǎn)換成間接關(guān)系,和上面代碼一樣,這種思想利用了多態(tài)的思想,不過一般情況都是使用接口的方式來實現(xiàn)解耦的。通常情況下我們在系統(tǒng)分離時只是以接口的方式提供服務(wù),供其他的模塊進(jìn)行使用。在模塊內(nèi)部有大量的信息是不要向外部暴露的,所以模塊在設(shè)計時訪問域的定義就要劃分好,防止因為訪問域的定義而對模塊的信息造成破壞。
“高內(nèi)聚,低耦合”,用一句話概括就是寫的代碼盡可能專一的完成一個任務(wù),且各段代碼盡量模塊化互相獨(dú)立。可能大家覺得這只是開發(fā)要懂的內(nèi)容,但如果運(yùn)維想深入的話這個也是繞不過去的,理解了才能更好的去設(shè)計一個系統(tǒng),保證系統(tǒng)高效穩(wěn)定。后面會分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。