高內聚低耦合

高內聚低耦合

內聚是從功能角度來度量模組內的聯繫,一個好的內聚模組應當恰好做一件事。它描述的是模組內的功能聯繫; 耦合是軟體結構中各模組之間相互連線的一種度量,耦合強弱取決於模組間接口的複雜程度、進入或訪問一個模組的點以及通過接口的數據。

定義

高內聚低耦合,是軟體工程中的概念,是判斷設計好壞的標準,主要是面向對象的設計,主要是看類的內聚性是否高,耦合度是否低。

概念

耦合性:也稱塊間聯繫。指軟體系統結構中各模組間相互聯繫緊密程度的一種度量。模組之間聯繫越緊密,其耦合性就越強,模組的獨立性則越差。模組間耦合高低取決於模組間接口的複雜性、調用的方式及傳遞的信息

內聚性:又稱塊內聯繫。指模組的功能強度的度量,即一個模組內部各個元素彼此結合的緊密程度的度量。若一個模組內各元素(語名之間、程式段之間)聯繫的越緊密,則它的內聚性就越高。

所謂高內聚是指一個軟體模組是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。

耦合:一個軟體結構內不同模組之間互連程度的度量。

對於低耦合,粗淺的理解是:一個完整的系統,模組與模組之間,儘可能的使其獨立存在。也就是說,讓每個模組,儘可能的獨立完成某個特定的子功能。模組與模組之間的接口,儘量的少而簡單。如果某兩個模組間的關係比較複雜的話,最好首先考慮進一步的模組劃分。這樣有利於修改和組合。

知識

軟體架構設計的目的簡單說就是在保持軟體內在聯繫的前提下,分解軟體系統,降低軟體系統開發的複雜性,而分解軟體系統的基本方法無外乎分層和分割。但是在保持軟體內在聯繫的前提下,如何分層分割系統,分層分割到什麼樣的程度,並不是一件容易的事,這方面有各種各樣的分解方法,比如:關注點分離,面向方面,面向對象,面向接口,面向服務,依賴注入,以及各種各樣的設計原則等。

耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:

(1) 內容耦合:一個模組直接訪問另一模組的內容,則稱這兩個模組為內容耦合。

若在程式中出現下列情況之一,則說明兩個模組之間發生了內容耦合:

1. 一個模組直接訪問另一個模組的內部數據。

2. 一個模組不通過正常入口而直接轉入到另一個模組的內部。

3. 兩個模組有一部分代碼重疊(該部分代碼具有一定的獨立功能)。

4. 一個模組有多個入口。

內容耦合可能在彙編語言中出現。大多數高級語言都已設計成不允許出現內容耦合。這種耦合的耦合性最強,模組獨立性最弱。

(2) 公共耦合:一組模組都訪問同一個全局數據結構,則稱之為公共耦合。公共數據環境可以是全局數據結構、共享的通信區、記憶體的公共覆蓋區等。如果模組只是向公共數據環境輸入數據,或是只從公共數據環境取出數據,這屬於比較鬆散的公共耦合;如果模組既向公共數據環境輸入數據又從公共數據環境取出數據,這屬於較緊密的公共耦合。

公共耦合會引起以下問題:

1. 無法控制各個模組對公共數據的存取,嚴重影響了軟體模組的可靠性和適應性。

2. 使軟體的可維護性變差。若一個模組修改了公共數據,則會影響相關模組。

3. 降低了軟體的可理解性。不容易清楚知道哪些數據被哪些模組所共享,排錯困難。

一般地,僅當模組間共享的數據很多且通過參數傳遞很不方便時,才使用公共耦合。

(3) 外部耦合:一組模組都訪問同一全局簡單變數,而且不通過參數表傳遞該全局變數的信息,則稱之為外部耦合。

(4) 控制耦合:模組之間傳遞的不是數據信息,而是控制信息例如標誌、開關量等,一個模組控制了另一個模組的功能。

(5) 標記耦合:調用模組和被調用模組之間傳遞數據結構而不是簡單數據,同時也稱作特徵耦合。標記耦合的模組間傳遞的不是簡單變數,而是像高級語言中的數據名、記錄名和檔案名稱等數據結果,這些名字即為標記,其實傳遞的是地址。

(6) 數據耦合:調用模組和被調用模組之間只傳遞簡單的數據項參數。相當於高級語言中的值傳遞。

(7) 非直接耦合:兩個模組之系,它們之間的聯繫完全是通過主模組的控制和調用來實現的。耦合度最弱,模組獨立性最強。

總結:耦合是影響軟體複雜程度和設計質量的一個重要因素,為提高模組的獨立性,應建立模組間儘可能鬆散的系統,在設計上我們應採用以下原則:若模組間必須存在耦合,應儘量使用數據耦合,少用控制耦合,慎用或有控制地使用公共耦合,並限制公共耦合的範圍,儘量避免內容耦合。

內聚有如下的種類,它們之間的內聚度由弱到強排列如下:

(1) 偶然內聚:一個模組內的各處理元素之間沒有任何聯繫,只是偶然地被湊到一起。這種模組也稱為巧合內聚,內聚程度最低。

(2) 邏輯內聚:這種模組把幾種相關的功能組合在一起, 每次被調用時,由傳送給模組參數來確定該模組應完成哪一種功能 。

(3) 時間內聚:把需要同時執行的動作組合在一起形成的模組稱為時間內聚模組。
(4) 過程內聚:構件或者操作的組合方式是,允許在調用前面的構件或操作之後,馬上調用後面的構件或操作,即使兩者之間沒有數據進行傳遞。簡單的說就是如果一個模組內的處理元素是相關的,而且必須以特定次序執行則稱為過程內聚。
(5) 通信內聚:指模組內所有處理元素都在同一個數據結構上操作或所有處理功能都通過公用數據而發生關聯(有時稱之為信息內聚)。即指模組內各個組成部分都使用相同的數據或產生相同的數據結構。
(6) 順序內聚:一個模組中各個處理元素和同一個功能密切相關,而且這些處理必須順序執行,通常前一個處理元素的輸出是後一個處理元素的輸入。

例如某模組完成工業產值求值的功能,前一個功能元素求總產值,後一個功能元素求平均產值,顯然該模組內兩部分緊密關聯。

順序內聚的內聚度比較高,但缺點是不如功能內聚易於維護。

(7) 功能內聚:模組內所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能,模組已不可再分。即模組僅包括為完成某個功能所必須的所有成分,這些成分緊密聯繫、缺一不可。

功能內聚是最強的內聚,其優點是它的功能明確。判斷一個模組是否功能內聚,一般從模組名稱就能看出。如果模組名稱只有一個動詞和一個特定的目標(單數名詞),一般來說就是功能內聚,如:“計算水費”、“計算產值”等模組。功能內聚一般出現在軟體結構圖的較低層次上。

功能內聚模組的一個重要特點是:他是一個“暗盒”,對於該模組的調用者來說,只需要知道這個模組能做什麼,而不需要知道這個模組是如何做的。

總結:在模組劃分時,要遵循“一個模組,一個功能”的原則,儘可能使模組達到功能內聚。

高內聚,低耦合的系統有什麼好處呢?事實上,短期來看,並沒有很明顯的好處,甚至短期內會影響系統的開發進度,因為高內聚,低耦合的系統對開發設計人員提出了更高的要求。高內聚,低耦合的好處體現在系統持續發展的過程中,高內聚,低耦合的系統具有更好的重用性,維護性,擴展性,可以更高效的完成系統的維護開發,持續的支持業務的發展,而不會成為業務發展的障礙。

相關詞條

相關搜尋

熱門詞條

聯絡我們