中國三農(nóng)建設(shè)工作委員會官方網(wǎng)站深圳網(wǎng)絡(luò)推廣最新招聘
文章目錄
- 一、迪米特法則定義
- 二、迪米特法則分析
- 三、迪米特法則實例
一、迪米特法則定義
迪米特法則(Law of Demeter, LoD):一個軟件實體應(yīng)當(dāng)盡可能少地與其他實體發(fā)生相互作用。
二、迪米特法則分析
如果一個系統(tǒng)符合迪米特法則,那么當(dāng)其中某一個模塊發(fā)生修改時,就會盡量少地影響其他模塊,擴(kuò)展會相對容易,這是對軟件實體之間通信的限制,迪米特法則要求限制軟件實體之間通信的寬度和深度。迪米特法則可降低系統(tǒng)的耦合度,使類與類之間保持松散的耦合關(guān)系。
迪米特法則還有幾種定義形式,包括:不要和“陌生人”說話、只與你的直接朋友通信等,在迪米特法則中,對于一個對象,其朋友包括以下幾類:
-
當(dāng)前對象本身(this);
-
以參數(shù)形式傳入到當(dāng)前對象方法中的對象;
-
當(dāng)前對象的成員對象;
-
如果當(dāng)前對象的成員對象是一個集合,那么集合中的元素也都是朋友;
-
當(dāng)前對象所創(chuàng)建的對象。
任何一個對象,如果滿足上面的條件之一,就是當(dāng)前對象的“朋友”,否則就是“陌生人”。在應(yīng)用迪米特法則時,一個對象只能與直接朋友發(fā)生交互,不要與“陌生人”發(fā)生直接交互,這樣做可以降低系統(tǒng)的耦合度,一個對象的改變不會給太多其他對象帶來影響。
迪米特法則要求我們在設(shè)計系統(tǒng)時,應(yīng)該盡量減少對象之間的交互,如果兩個對象之間不必彼此直接通信,那么這兩個對象就不應(yīng)當(dāng)發(fā)生任何直接的相互作用,如果其中的一個對象需要調(diào)用另一個對象的某一個方法的話,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用。簡言之,就是通過引入一個合理的第三者來降低現(xiàn)有對象之間的耦合度。
在將迪米特法則運用到系統(tǒng)設(shè)計中時,要注意下面的幾點:
- 在類的劃分上,應(yīng)當(dāng)盡量創(chuàng)建松耦合的類,類之間的耦合度越低,就越有利于復(fù)用,一個處在松耦合中的類一旦被修改,不會對關(guān)聯(lián)的類造成太大波及;
- 在類的結(jié)構(gòu)設(shè)計上,每一個類都應(yīng)當(dāng)盡量降低其成員變量和成員函數(shù)的訪問權(quán)限;
- 在類的設(shè)計上,只要有可能,一個類型應(yīng)當(dāng)設(shè)計成不變類;
- 在對其他類的引用上,一個對象對其他對象的引用應(yīng)當(dāng)降到最低。
三、迪米特法則實例
某公司所開發(fā)CRM系統(tǒng)包含很多業(yè)務(wù)操作窗口,在這些窗口中,某些界面控件之間存在復(fù)雜的交互關(guān)系,一個控件事件的觸發(fā)將導(dǎo)致多個其他界面控件產(chǎn)生響應(yīng),例如,當(dāng)一個按鈕(Button)被單擊時,對應(yīng)的列表框(List)、組合框(ComboBox)、文本框(TextBox)、文本標(biāo)簽(Label)等都將發(fā)生改變,在初始設(shè)計方案中,界面控件之間的交互關(guān)系可簡化為如圖所示結(jié)構(gòu):
由于界面控件之間的交互關(guān)系復(fù)雜,導(dǎo)致在該窗口中增加新的界面控件時需要修改與之交互的其他控件的源代碼,系統(tǒng)擴(kuò)展性較差,也不便于增加和刪除新控件。
現(xiàn)使用迪米特對其進(jìn)行重構(gòu)。
在本實例中,可以通過引入一個專門用于控制界面控件交互的中間類(Mediator)來降低界面控件之間的耦合度。引入中間類之后,界面控件之間不再發(fā)生直接引用,而是將請求先轉(zhuǎn)發(fā)給中間類,再由中間類來完成對其他控件的調(diào)用。當(dāng)需要增加或刪除新的控件時,只需修改中間類即可,無須修改新增控件或已有控件的源代碼,重構(gòu)后結(jié)構(gòu)如圖所示: