天天看點

關于耦合度以及低耦合度的必要性

耦合性(英語:Coupling,dependency,或稱 耦合力或 耦合度)是一種 軟體度量,是指一程式中, 子產品及子產品之間資訊或參數依賴的程度。

内聚性是一個和耦合性相對的概念,一般而言低耦合性代表高内聚性,反之亦然。耦合性和内聚性都是由提出結構化設計概念的賴瑞·康斯坦丁所提出[1]。低耦合性是結構良好程式的特性,低耦合性程式的可讀性及可維護性會比較好。

耦合性可以是低耦合性(或稱為松散耦合),也可以是高耦合性(或稱為緊密耦合)。以下列出一些耦合性的分類,從高到低依序排列:

  • 内容耦合(content coupling,耦合度最高)
  • 也稱為病态耦合(pathological coupling)當一個子產品直接使用另一個子產品的内部資料,或通過非正常入口而轉入另一個子產品内部。
  • 共用耦合/公共耦合(common coupling)
  • 也稱為全局耦合(global coupling.)指通過一個公共資料環境互相作用的那些子產品間的耦合。公共耦合的複雜程式随耦合子產品的個數增加而增加。
  • 外部耦合(external coupling)
  • 發生在二個子產品共用一個外加的資料格式、通信協定或是裝置界面,基本上和子產品和外部工具及裝置的溝通有關。
  • 控制耦合(control coupling)
  • 指一個子產品調用另一個子產品時,傳遞的是控制變量(如開關、标志等),被調子產品通過該控制變量的值有選擇地執行塊内某一功能;
  • 特征耦合/标記耦合(stamp coupling)
  • 也稱為資料結構耦合,是指幾個子產品共享一個複雜的資料結構,如進階語言中的數組名、記錄名、檔案名等這些名字即标記,其實傳遞的是這個資料結構的位址;
  • 資料耦合/資料耦合(data coupling)
  • 是指子產品借由傳入值共享資料,每一個資料都是最基本的資料,而且隻分享這些資料(例如傳遞一個整數給計算平方根的函數)。
  • 消息耦合(message coupling,是無耦合之外,耦合度最低的耦合)
  • 可以借由以下二個方式達成:狀态的去中心化(例如在對象中),元件間利用傳入值或消息傳遞 (計算機科學)來通信。
  • 無耦合:子產品完全不和其他子產品交換資訊。

面向對象程式設計

  • 子類耦合(subclass coupling)
  • 描述子類和父類别之間的關系,子類連結到父類别,但父類别沒有連結到子類。
  • 時空耦合(temporal coupling)
  • 二個動作隻因為同時間發生,就被包裝在一個子產品中。

後來的研究提出了許多不同層面的耦合性,并且用來評估實務上各種的子產品化法則的實施程度。  [1]  

缺點

緊密耦合的系統在開發階段有以下的缺點:

  1. 一個子產品的修改會産生 漣漪效應,其他子產品也需随之修改。
  2. 由于子產品之間的相依性,子產品的組合會需要更多的精力及時間。
  3. 由于一個子產品有許多的相依子產品,子產品的 可複用性低。  [1]  

改善方法

機能設計是一種可以降低耦合性的方法,此方法以機能性的角度設法限制各子產品需負責的事務。在類别 A及 B之間,若有以下任何一種情形,會提高二者的耦合性:

  • A有一個屬性是參考類别 B(此屬性的形态為類别 B)
  • A調用對象 B提供的服務
  • A有一個方法會參考類别 B(此方式會傳回一形态為類别 B的物性)
  • A是類别 B的子類。

松散耦合是指二個彼此相關的子產品,其中的接口是一個簡單而穩定的接口,且其接口和任一子產品内部的實作方式無關(參考 資訊隐藏)。 像 CORBA或 元件對象模型等系統,允許一對象在不知道另一對象實作方式的情形下和另一對象互動。這類系統甚至允許一對象和用其他語言撰寫的對象進行互動。  [1]