如何降低一個程序的耦合性

英文 : coupling 
耦合性是程序結構中各個模塊之間相互關聯的度量。它取決於各個模塊之間接口的複雜程度、調用模塊的方式以及哪些信息通過接口。 
一般模塊之間可能的連接方式有七種,構成耦合性的七種類型。它們之間的關係爲(由弱到強) 
(1)非直接耦合(Nondirect coupling) 
如果兩個模塊之間沒有直接關係,它們之間的聯繫完全是通過主模塊的控制和調用來實現的,這就是非直接耦合。這種耦合的模塊獨立性最強。 。 
(2)數據耦合(Data Coupling) 
如果一個模塊訪問另一個模塊時,彼此之間是通過數據參數(不是控制參數、公共數據結構或外部變量)來交換輸入、輸出信息的,則稱這種耦合爲數據耦合。由於限制了只通過參數表傳遞數據,按數據耦合開發的程序界面簡單、安全可靠。因此,數據耦合是鬆散的耦合,模塊之間的獨立性比較強。在軟件程序結構中至少必須有這類耦合。 
(3)標記耦合(Stamp Coupling) 
如果一組模塊通過參數表傳遞記錄信息,就是標記耦合。事實上,這組模塊共享了這個記錄,它是某一數據結構的子結構,而不是簡單變量。這要求這些模塊都必須清楚該記錄的結構,並按結構要求對此記錄進行操作。在設計中應儘量避免這種耦合,它使在數據結構上的操作複雜化了。如果採取“信息隱蔽”的方法,把在數據結構上的操作全部集中在一個模塊中,就可以消除這種耦合。
(4)控制耦合(control(20upling)
如果一個模塊通過傳送開關、標誌、名字等控制信息,明顯地控制選擇另一模塊的功能,就是控制耦合。如圖4.13所示。這種耦合的實質是在單一接口上選擇多功能模塊中的某項功能。因此,對所控制模塊的任何修改,都會影響控制模塊。另外,控制耦合也意味着控制模塊必須知道所控制模塊內部的一些邏輯關係,這些都會降低模塊的獨立性。
(5)外部耦合(External(;oupling)
一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,而且不是通過參數表傳遞該全局變量的信息,則稱之爲外部耦合。例如C語言程序中各個模塊都訪問被說明爲extern類型的外部變量。外部耦合引起的問題類似於公共耦合,區別在於在外部耦合中不存在依賴於一個數據結構內部各項的物理安排。
(6)公共耦合((;ommon Coupling)
若一組模塊都訪問同一個公共數據環境,則它們之間的耦合就稱爲公共耦合。公共的數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等。
這種耦合會引起下列問題:
1)所有公共耦合模塊都與某一個公共數據環境內部各項的物理安排有關,若修改某個數據的大小,將會影響到所有的模塊。
2)無法控制各個模塊對公共數據的存取,嚴重影響軟件模塊的可靠性和適應性。
3)公共數據名的使用,明顯降低了程序的可讀性。[Page]
公共耦合的複雜程度隨耦合模塊的個數增加而顯著增加。如圖4.14所示,若只是兩個模塊之間有公共數據環境,則公共耦合有兩種情況。
若一個模塊只是往公共數據環境裏傳送數據,而另一個模塊只是從公共數據環境中取數據,則這種公共耦合叫做鬆散公共耦合。若兩個模塊都從公共數據環境中取數據,又都向公共數據環境裏送數據,則這種公共耦合叫做緊密公共耦合。只有在模塊之間共享的數據很多,且通過參數表傳遞不方便時,才使用公共耦合。否則,還是使用模塊獨立性比較高的數據耦合好些。
(7)內容耦合((70ntent Coupling)
如果發生下列情形,兩個模塊之間就發生了內容耦合。
1)一個模塊直接訪問另一個模塊的內部數據;
2)一個模塊不通過正常入口轉到另一模塊內部;
3)兩個模塊有一部分程序代碼重疊(只可能出現在彙編語言中);
4)一個模塊有多個入口。
在內容耦合的情形,所訪問模塊的任何變更,或者用不同的編譯器對它再編譯,都會造成程序出錯。好在大多數高級程序設計語言已經設計成不允許出現內容耦合。它一般出現在彙編語言程序中。這種耦合是模塊獨立性最弱的耦合。
以上由Myers給出的七種耦合類型,只是從耦合的機制上所做的分類,按耦合的鬆緊程度的排列只是相對的關係。但它給設計人員在設計程序結構時提供了一個決策準則。實際上,開始時兩個模塊之間的耦合不只是一種類型,而是多種類型的混合。這就要求設計人員按照Myers提出的方法進行分析,比較和分析,逐步加以改進,以提高模塊的獨立性。
原則上講,模塊化設計的最終目標,是希望建立模塊間耦合儘可能鬆散的系統。在這樣一個系統中,我們設計、編碼、測試和維護其中任何一個模塊,就不需要對系統中其他模塊有很多的瞭解。此外,由於模塊間聯繫簡單,發生在某一處的錯誤傳播到整個系統的可能性很小。因此,模塊間的耦合情況很大程度影響到系統的可維護性。
那麼,在系統的模塊化設計時,如何降低模塊間的耦合度呢?以下幾點可供參考。
1)根據問題的特點,選擇適當的耦合類型
在模塊間傳遞的信息有兩種:一種是數據信息,一種是控制信息。傳送數據的模塊,其耦合程度比傳送控制信息的模塊耦合程度要低。
在模塊調用時,傳送的控制信息有兩種:一種是傳送地址,即調用模塊直接轉向所調用模塊內部的某一地址。在這種情況,一個模塊的改動對其他模塊有直接影響。另一種是傳送判定參數,調用模塊把判定參數傳送給所調用模塊,決定所調用模塊如何執行。在這種情況下,模塊間的耦合程度也很高,所以應當儘量減少和避免傳送控制信息。但另一方面,也不要盲目地追求鬆散的耦合。例如,一個程序有40種出錯信息,若把它們集中放在一個錯誤處理模塊中,通過調用模塊傳送錯誤類型到該模塊的接口上,再進行處理,就形成“控制耦合”。這樣做可以消去重複的信息,使所有錯誤信息格式標準化。所以,耦合類型的選擇,應當根據實際情況,全面權衡,綜合地進行考慮。
2)降低模塊接口的複雜性
模塊接口的複雜性包括三個因素:一是傳送信息的數量,即有關的公共數據與調用參數的數量;二是聯繫方式;三是傳送信息的結構。
一般情況,在模塊的調用序列中若出現大量的參數,就表明所調用模塊要執行許多任務。通過把這個所調用模塊分解成更小的模塊,使得每個小模塊只完成一個任務,就可以減少模塊接口的參數個數,降低模塊接口的複雜性,從而降低模塊間的耦合程度。
模塊的聯繫方式(即調用方式)有兩種:call方式和“直接引用”。前者使用標準的過程調用方式,模塊間接口的複雜性較低,模塊間的耦合程度低。後者是一個模塊直接訪問另一個模塊內部的數據或指令,模塊間的耦合程度高。所以,應當儘可能用call方式代替“直接引用”,減少模塊接口的複雜性。在參數類型上,儘量少使用指針、過程等類型的參數。
此外,在模塊接口上傳送的信息若能以標準的、直接的方式提供,則信息結構比較簡單。若以非標準的、嵌套的方式提供,則信息結構比較複雜。例如,在模塊中要調用畫直線的命令LINE,若命令要求直接給它直線兩個端點的座標Xo,yo,x1,y1:
call LINE(zo,yo,X1,y1)
則接口複雜性比給origin(始點),end(終點)要低。因爲後者還要定義origin和end的結構。
call LINE(origin,end)
3)把模塊的通信信息放在緩衝區中
因爲緩衝區可以看做是一個先進先出的隊列,它保持了通信流中元素的順序。沿着通信路徑而操作的緩衝區將減少模塊間互相等待的時間。在模塊化設計時,如果能夠把緩衝區作爲每次通信流的媒介,那麼一個模塊執行的速度、頻率等問題一般不影響其他模塊的設計。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章