第2章 面向物件的設計原則(SOLID):5_迪米特法則
阿新 • • 發佈:2018-11-08
5. 迪米特法則(Law of Demeter,LoD)
5.1 定義
(1)應儘量減少其他物件之間的互動,物件只和自己的朋友交談,即對其他依賴的類越少越好(不要和太多的類發生關係)。
(2)儘量不要讓類和類之間建立直接的關係,這樣可減少類與類之間的依賴,降低類之間的耦合。
(3)一個類應對自己需要耦合的類知道得最少,只知道其public方法,其內部如何複雜自己沒有關係,也叫最少知識原則(Least Knowledge Principle,LKP)。
5.2 迪米特法則:核心要義就是類間解耦、低耦合
(1)只和直接朋友交流
①直接朋友的定義:出現在成員變數、方法的輸入引數和返回值的類
②非朋友:出現在方法體內部的類
【程式設計實驗】體育委員點名
//違反LoD的設計
//面向物件設計原則:LoD迪米特法則 //類間解耦 #include <stdio.h> #include <list> using namespace std; //Girl類 class Girl { }; //體育委員類 class GroupLeader { public: //清點女生數量 void countGirls(list<Girl>& list) { printf("Numbers of Girls: %d\n", list.size()); } }; //Teacher類 class Teacher { public: //老師叫體育委員清點一下女生人數 void command(GroupLeader& groupLeader) { //方法內的類,與Teacher不是朋友關係, //但這樣的設計會使Teacher對Girl類產生依賴,違反Lod法則 list<Girl> listGirls; //初始化女生 for(int i = 0; i< 20; i++) { Girl g; listGirls.push_back(g);//會複製一份過去 } groupLeader.countGirls(listGirls); } }; int main() { Teacher teacher; GroupLeader groupLeader; //老師釋出命令 teacher.command(groupLeader); return 0; }
//遵循LoD法則的設計
//面向物件設計原則:LoD迪米特法則 //類間解耦 #include <stdio.h> #include <list> using namespace std; //Girl類 class Girl { }; //體育委員類 class GroupLeader { private: list<Girl>& listGirls; public: //從構造器傳入全班女生 GroupLeader(list<Girl>& _list):listGirls(_list) { } //清點女生數量 void countGirls() { printf("Numbers of Girls: %d\n", listGirls.size()); } }; //Teacher類:與Girl類解耦 class Teacher { public: //老師叫體育委員清點一下女生人數 void command(GroupLeader& groupLeader) { groupLeader.countGirls(); } }; int main() { Teacher teacher; list<Girl> listGirls; //初始化女生 for(int i = 0; i< 20; i++) { Girl g; listGirls.push_back(g);//會複製一份過去 } // GroupLeader groupLeader(listGirls); //老師釋出命令 teacher.command(groupLeader); return 0; }
(2)朋友間也是有距離的
//知道得太多:InstallSoftware類和Wizard的耦合太緊
//鬆耦合:隱藏Wizard類安裝步驟的介面,降低耦合度
(3)是自己的就是自己的
當某個方法放在本類可以,放在其他類也沒錯,那麼根據迪米特法則,可以在不增加類間的關係,也不對本類產生負面影響,就放置在本類中。
5.3 最佳實踐
(1)迪米特法則的核心觀念就是類間解耦、弱耦合
(2)解耦是有限度的,在實際的專案中,需要適度考慮這個原則。