2011-07-07 36 views
13

我正在閱讀福勒的重構書,對這兩種代碼氣味感到困惑。「消息鏈」vs「中間人」

「消息鏈」是像a.getB().getC().getValue()這樣的調用。

「中間人」就像

class A 
{ 
    object getCValue() 
    { 
     return b.getCValue(); 
    } 
} 

我瞭解這兩個部分是,如果你已經有了「信息鏈」您通過引入「中間人」縮短它們的方式方法。如果你有「中間人」你把他們變成「消息鏈」...

現在顯然必須有一些限制,或者你會有程序員的旋轉木馬。 我應該在哪一點上比另一個更好?

一種是將類耦合到不相關的類,另一種是將類耦合到結構。所以理論上我的方法是檢查給定的變化是否減少一種耦合比增加另一種耦合。但是一種耦合越來越差,應該多加權衡呢?即只能添加一個類耦合,如果你可以刪除X結構耦合?

回答

7

喜歡通過消息鏈的中間人也被稱爲Law of Demeter,它可以概括爲「僅與您的直接依賴關係對話」。

使用中間人代替消息鏈的一個好處是你在進行單元測試時必須提供更少的模擬。當你不得不爲他們的直接依賴提供模擬時,類變得很難測試,而且它們也是間接的。

它也有助於分離關注點,因爲具有A並且想要C的代碼不應該知道涉及B。這有助於模塊化。

消息鏈的主要論點是,你不必在中間寫樣板文件,在某些情況下它可能是有意義的,但我認爲經驗法則應該是偏好中間人。

1

這是您的選擇。按照您認爲更易於維護的方式進行編碼。順便說一句,我不認爲有「將班級與無關班級聯繫」的情況。相反,這是將間接關係轉化爲直接關係的問題。從班上多次訪問間接班時,這一點尤其值得。這也可能會消除對中間類的依賴關係,具體取決於您建立直接關係的方式。

3

正如哈馬爾所說,這一個是關於德米特法。像a.getB().getC().getD()這樣的東西幾乎總是很糟糕。它們引入耦合到A接口的客戶端。寧可引入中間人,如:

class A 
    def calculateHowManyCowsCanFitOnTheMoon 
     doLocalCalculation(b.performEncapsulatedCalculation()) 
    end 
end 

你想擺脫中間人的時候它不服務就像上面,一個目的,如當它剛剛從B.提取數據我會去至於說一個糟糕的中間人的重構可能是重構的重組。