標籤:

圖解7種耦合關係

之前組內同學問我耦合的關係,我沒給對方講清楚,今天借這個機會來深入講講模塊之間的耦合關係這個事情。

本文將用圖文詳細講解七種耦合的不同之處。

高內聚與低耦合

高內聚與低耦合是每個軟體開發者追求的目標,那麼內聚和耦合分別是什麼意思呢?

內聚是從功能角度來度量模塊內的聯繫,一個好的內聚模塊應當恰好做一件事。它描述的是模塊內的功能聯繫。

耦合是軟體結構中各模塊之間相互連接的一種度量,耦合強弱取決於模塊間介面的複雜程度、進入或訪問一個模塊的點以及通過介面的數據。

耦合

不同模塊之間的關係就是耦合,根據耦合程度可以分為7種,耦合度依次變低。

  • 內容耦合
  • 公共耦合
  • 外部耦合
  • 控制耦合
  • 標記耦合
  • 數據耦合
  • 非直接耦合

下面我們來說說每種耦合是什麼,開始之前先來說下要實現的功能。m1和m2是兩個獨立的模塊,其中m2種會顯示m1的輸入,m1會顯示m2的輸入。

很顯然,m1和m2兩個模塊之間會有一些聯繫(耦合),你也可以想想如何實現這個功能,下面用7種不同的方式來實現這個功能。

註:項目的代碼我放到了github,項目的demo,可以在這裡查看。

內容耦合

內容耦合是最緊的耦合程度,一個模塊直接訪問另一模塊的內容,則稱這兩個模塊為內容耦合。

為了實現功能,我們將m1的輸入放到m2.m1input上,將m2的輸入放到m1.m2input上。

// m1.jsnroot.m2.m1input = this.value;nm2.update();nn// m2.jsnroot.m1.m2input = this.value;nm1.update();n

PS:不知道誰會這麼寫代碼,除了我為了做演示之外。。。

查看完整代碼和demo。

公共耦合

一組模塊都訪問同一個全局數據結構,則稱之為公共耦合。

在這種case中,m1和m2將自己的輸入放到全局的data上。

// m1.jsnroot.data.m1input = this.value;nm2.update();nn// m2.jsnroot.data.m2input = this.value;nm1.update();n

查看完整代碼和demo。

外部耦合

一組模塊都訪問同一全局簡單變數,而且不通過參數表傳遞該全局變數的信息,則稱之為外部耦合。外部耦合和公共耦合很像,區別就是一個是簡單變數,一個是複雜數據結構。

在這種case中,m1和m2都將自己的輸入放到全局上。

// m1.jsnroot.m1input = this.value;nm2.update();nn// m2.jsnroot.m2input = this.value;nm1.update();n

查看完整代碼和demo。

控制耦合

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

從控制耦合開始,模塊的數據就放在自己內部了,不同模塊之間通過介面互相調用。

在這個case中,得增加一個需求,就是當m1的輸入為空時,隱藏m2的顯示信息。

// m1.jsnroot.m1input = this.value;nm2.update();nnm2.toggle(!!this.value); // 傳遞flagn

上面的代碼中m1直接控制了m2的顯示和隱藏。

查看完整代碼和demo。

標記耦合

調用模塊和被調用模塊之間傳遞數據結構而不是簡單數據,同時也稱作特徵耦合。

在這個case中,m1傳給m2的是一個對象。

// m1.jsnme.m1input = this.value;nm2.update(me); // 傳遞引用nn// m2.jsnme.m2input = this.value;nm1.update(me);n

查看完整代碼和demo。

數據耦合

調用模塊和被調用模塊之間只傳遞簡單的數據項參數。相當於高級語言中的值傳遞。

在這個case中,m1傳給m2的是一個簡單數據結構。

// m1.jsnme.m1input = this.value;nm2.update(me.m1input); // 傳遞值nn// m2.jsnme.m2input = this.value;nm1.update(me.m2input);n

查看完整代碼和demo。

非直接耦合

兩個模塊之間沒有直接關係,它們之間的聯繫完全是通過主模塊的控制和調用來實現的。耦合度最弱,模塊獨立性最強。

子模塊無需知道對方的存在,子模塊之間的聯繫,全部變成子模塊和主模塊之間的聯繫。

在這個case種,增加一個index.js作為主模塊。

// index.jsnvar m1 = root.m1;nvar m2 = root.m2;nnm1.init(function (str) {n m2.update(str);n});nnm2.init(function (str) {n m1.update(str);n});nn// m1.jsnme.m1input = this.value;ninputcb(me.m1input); // inputcb是回調函數nn// m2.jsnme.m2input = this.value;ninputcb(me.m2input);n

查看完整代碼和demo。

內聚

其實關於內聚也分為很多種,如下所示,如果你感興趣可以自己研究研究,我們下次再來分享內聚的問題。

  • 偶然內聚
  • 邏輯內聚
  • 時間內聚
  • 通信內聚
  • 順序內聚
  • 功能內聚

總結

希望你看完上面的文章,搞懂了耦合的種類,也希望你以後能使用非直接耦合這種方式來寫代碼,祝好。

原文網址:圖解7種耦合關係


推薦閱讀:

爬取中國亞馬遜網站遇到503怎麼解決?
如何利用python讀取特定目錄下的特定文件的倒數兩行?
C++中如何把一個變數的值作為另一個變數的名?
如果程序語言的賦值變為左值賦予右值會更好嗎?
阿里內推面試,應該注意什麼?

TAG:程序 |