關於解耦的研究(一)之概念梳理

前言:

低耦合高內聚,一直是軟件開發人員心中始終銘記的開發準則,然而在平常的開發中,卻經常忽略它的存在,或者不能清晰的知道如何去作才能更好的解耦和內聚。多年從事於軟件開發工做的我,開發了不少功能,也接手過不少別人的工做,深知其中的坑與痛,因此決心作出改變,本文將從0開始逐步深刻研究,探索低耦合、高內聚的編碼之道。segmentfault

首先,先了解下前人總結的耦合性和聚合性的分類,此部份內容來自百度,若是你們以前有所瞭解能夠直接跳過:安全

耦合性簡介

耦合性,也叫耦合度,是對模塊間關聯程度的度量。耦合的強弱取決於模塊間接口的複雜性、調用模塊的方式以及經過界面傳送數據的多少。模塊間的耦合度是指模塊之間的依賴關係,包括控制關係、調用關係、數據傳遞關係。模塊間聯繫越多,其耦合性越強,同時代表其獨立性越差( 下降耦合性,能夠提升其獨立性)。軟件設計中一般用耦合度和內聚度做爲衡量模塊獨立程度的標準。劃分模塊的一個準則就是高內聚低耦合。網絡

通常模塊之間可能的鏈接方式有七種,構成耦合性的七種類型。它們之間的關係爲(獨立性由強到弱)數據結構

非直接耦合:

若是兩個模塊之間沒有直接關係,它們之間的聯繫徹底是經過主模塊的控制和調用來實現的,這就是非直接耦合。這種耦合的模塊獨立性最強。編碼

數據耦合:

若是一個模塊訪問另外一個模塊時,彼此之間是經過數據參數(不是控制參數、公共數據結構或外部變量)來交換輸入、輸出信息的,則稱這種耦合爲數據耦合。因爲限制了只經過參數表傳遞數據,按數據耦合開發的程序界面簡單、安全可靠。所以,數據耦合是鬆散的耦合,模塊之間的獨立性比較強。在軟件程序結構中至少必須有這類耦合。設計

補充:數據耦合的結果只和傳入的參數有關,且不會改變參數的數據,因此耦合度極低,平常開發應儘可能分離出這樣的模塊結構來下降耦合。code

標記耦合:

若是一組模塊經過參數表傳遞記錄信息,就是標記耦合,也稱特徵耦合。事實上,這組模塊共享了這個記錄,它是某一數據結構的子結構,而不是簡單變量。這要求這些模塊都必須清楚該記錄的結構,並按結構要求對此記錄進行操做。在設計中應儘可能避免這種耦合,它使在數據結構上的操做複雜化了。若是採起「信息隱蔽」的方法,把在數據結構上的操做所有集中。接口

控制耦合:

若是一個模塊經過傳送開關、標誌、名字等控制信息,明顯地控制選擇另外一模塊的功能,就是控制耦合。這種耦合的實質是在單一接口上選擇多功能模塊中的某項功能。所以,對所控制模塊的任何修改,都會影響控制模塊。另外,控制耦合也意味着控制模塊必須知道所控制模塊內部的一些邏輯關係,這些都會下降模塊的獨立性。內存

補充:平常開發中常常須要根據某種狀態來決定執行的邏輯,這幾乎是不可避免的,這種狀況咱們就須要儘可能把狀態邏輯封裝到頂層,各個狀態要執行的具體邏輯封裝成獨立的模塊以最大限度下降影響。開發

外部耦合:

一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,並且不是經過參數表傳遞該全局變量的信息,則稱之爲外部耦合。例如C語言程序中各個模塊都訪問被說明爲extern類型的外部變量。外部耦合引發的問題相似於公共耦合,區別在於在外部耦合中不存在依賴於一個數據結構內部各項的物理安排。

補充:外部耦合指的是共同訪問一些簡單變量,不涉及數據結構。

公共耦合:

若一組模塊都訪問同一個公共數據環境,則它們之間的耦合就稱爲公共耦合。公共的數據環境能夠是全局數據結構、共享的通訊區、內存的公共覆蓋區等。 這種耦合會引發下列問題:

全部公共耦合模塊都與某一個公共數據環境內部各項的物理安排有關,若修改某個數據的大小,將會影響到全部的模塊。

沒法控制各個模塊對公共數據的存取,嚴重影響軟件模塊的可靠性和適應性。

公共數據名的使用,明顯下降了程序的可讀性。

公共耦合的複雜程度隨耦合模塊的個數增長而顯著增長。若只是兩個模塊之間有公共數據環境,則公共耦合有兩種狀況。

若一個模塊只是往公共數據環境裏傳送數據,而另外一個模塊只是從公共數據環境中取數據,則這種公共耦合叫作鬆散公共耦合。若兩個模塊都從公共數據環境中取數據,又都向公共數據環境裏送數據,則這種公共耦合叫作緊密公共耦合。只有在模塊之間共享的數據不少,且經過參數表傳遞不方便時,才使用公共耦合。不然,仍是使用模塊獨立性比較高的數據耦合好些。

內容耦合:

若是發生下列情形,兩個模塊之間就發生了內容耦合。

1、一個模塊直接訪問另外一個模塊的內部數據;
2、一個模塊不經過正常入口轉到另外一模塊內部(好比反射);
3、兩個模塊有一部分程序代碼重疊(只可能出如今彙編語言中);
4、一個模塊有多個入口。

在內容耦合的情形,所訪問模塊的任何變動,或者用不一樣的編譯器對它再編譯,都會形成程序出錯。好在大多數高級程序設計語言已經設計成不容許出現內容耦合。它通常出如今彙編語言程序中。這種耦合是模塊獨立性最弱的耦合。

內聚性簡介

內聚的種類通常也是分紅7種,從上到下內聚性依次加強:

偶然內聚:

一個模塊內的各處理元素之間沒有任何聯繫,只是偶然地被湊到一塊兒。這種模塊也稱爲巧合內聚,內聚程度最低(極力避免)。

邏輯內聚:

這種模塊把幾種相關的功能組合在一塊兒, 每次被調用時,由傳送給模塊參數來肯定該模塊應完成哪種功能(與控制耦合相似) 。

時間內聚:

把須要同時執行的動做組合在一塊兒造成的模塊稱爲時間內聚模塊。

過程內聚:

構件或者操做的組合方式是,容許在調用前面的構件或操做以後,立刻調用後面的構件或操做,即便二者之間沒有數據進行傳遞。簡單的說就是若是一個模塊內的處理元素是相關的,並且必須以特定次序執行則稱爲過程內聚。例如某要完成登陸的功能,前一個功能判斷網絡狀態,後一個執行登陸操做,顯然是按照特定次序執行的。

通訊內聚:

指模塊內全部處理元素都在同一個數據結構上操做或全部處理功能都經過公用數據而發生關聯(有時稱之爲信息內聚)。即指模塊內各個組成部分都使用相同的數據結構或產生相同的數據結構。

順序內聚:

一個模塊中各個處理元素和同一個功能密切相關,並且這些處理必須順序執行,一般前一個處理元素的輸出時後一個處理元素的輸入。例如某要完成獲取訂單信息的功能,前一個功能獲取用戶信息,後一個執行計算均價操做,顯然該模塊內兩部分緊密關聯。順序內聚的內聚度比較高,但缺點是不如功能內聚易於維護。

功能內聚:

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

總結

經過上面的內容,咱們已經對耦合性和內聚性有了必定程度的理解,在平常的開發中,咱們要儘量用耦合性低,內聚性高的方式,參考上面的介紹。這樣子在開發過程當中前期會有必定的速度影響,可是在以後,不管查找問題仍是擴展功能亦或是修改收益仍是很是大的,當別人由於一個小的變更就抓耳撓腮,無從下手,必須重構時,你就會暗自慶幸當時的機智!

下一篇 關於解耦的研究(二)之基礎解耦實踐

相關文章
相關標籤/搜索