“低耦合(Low Coupling)”這個(gè)詞相信大家已經(jīng)耳熟能詳,我們在看spring的書籍、MVC的數(shù)據(jù)、設(shè)計(jì)模式的書籍,無處不提到“低耦合、高內(nèi)聚”,它已經(jīng)成為軟件設(shè)計(jì)質(zhì)量的標(biāo)準(zhǔn)之一。那什么是低耦合?耦合是對一個(gè)元素與其他元素之間的聯(lián)系、感知和依賴性的度量。這里提到的元素可以是函數(shù)、對象(類)或系統(tǒng)、子系統(tǒng)或模塊。如果一個(gè)元素與元素B,或認(rèn)為B通過自己的方法,或不能正常工作時(shí)B不存在,那么元素加上元素B耦合引起的問題是,當(dāng)元素B的變化或不存在,它將影響元件的正常工作,影響系統(tǒng)的可維護(hù)性和可變性。同時(shí),A元素只能在B元素存在的環(huán)境中工作,這也降低了A元素的可重用性。由于耦合的缺點(diǎn),我們在軟件設(shè)計(jì)中努力追求“低耦合”。低耦合要求在我們的軟件系統(tǒng)中,一個(gè)元素不應(yīng)該過度地依賴于其他元素,請注意這里的“過度”一詞。比如我們可以設(shè)計(jì)一個(gè)不與JDK耦合的類,這可能嗎?除非你不是一個(gè)設(shè)計(jì)的Java程序。

1、耦合度分類(由高到低)
1)內(nèi)容耦合。當(dāng)一個(gè)模塊直接修改或操作另一個(gè)模塊的數(shù)據(jù),或直接向另一個(gè)模塊傳輸數(shù)據(jù)時(shí),就會發(fā)生內(nèi)容耦合。此時(shí),修改后的模塊完全依賴于修改后的模塊。類與類之間的直接調(diào)用或繼承關(guān)系就屬于這種耦合。應(yīng)該完全避免內(nèi)容耦合。關(guān)鍵是不要在類內(nèi)部直接操作另一個(gè)類的對象的數(shù)據(jù)成員。可以通過在操作類中增加一個(gè)函數(shù)接口向客戶類提供服務(wù)來實(shí)現(xiàn)。
2)公共耦合是指兩個(gè)或多個(gè)模塊一起引用一個(gè)全局?jǐn)?shù)據(jù)項(xiàng)。
3)控制耦合是指一個(gè)模塊在接口上發(fā)送信號(如開關(guān)值、標(biāo)志量等)來控制另一個(gè)模塊,并根據(jù)信號值來調(diào)整接收信號的模塊的動作。
4)標(biāo)記耦合是指復(fù)雜的內(nèi)部數(shù)據(jù)結(jié)構(gòu)是通過參數(shù)在模塊之間傳遞的。數(shù)據(jù)結(jié)構(gòu)的改變會改變相關(guān)的模塊。
5)數(shù)據(jù)耦合是指基本類型的數(shù)據(jù)通過參數(shù)在模塊之間傳遞。
6)非直接耦合就是模塊間沒有信息傳遞。
2、為什么要追求低耦合?
原因很簡單。當(dāng)耦合度很高時(shí),在代碼維護(hù)過程中修改一個(gè)地方會涉及到很多地方。如果耦合關(guān)系不是澄清修改期間,后果可能是災(zāi)難性的,特別是對于有許多變化的項(xiàng)目需求和多人協(xié)作開發(fā)和維護(hù),修改一個(gè)地方會導(dǎo)致模塊的錯(cuò)誤一直運(yùn)行穩(wěn)定,如果是嚴(yán)重的,將導(dǎo)致一個(gè)惡性循環(huán),問題永遠(yuǎn)不能完全解決,開發(fā)和測試正與各種各樣的問題作斗爭。最終會導(dǎo)致項(xiàng)目延遲,降低用戶滿意度,增加成本。