1. 程式人生 > >第2章 面向物件的設計原則(SOLID):5_迪米特法則

第2章 面向物件的設計原則(SOLID):5_迪米特法則

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)解耦是有限度的,在實際的專案中,需要適度考慮這個原則。