Law of Demeter (LOD)

定義:

也稱最少知識原則(Principle of Least Knowledge)。
模組應該儘可能的減少其他模組交互,目的在於降低彼此之間的依賴。
 

說明:

以下為必須遵循 LOD 的條件
類別 O 的任何方法 m 只能呼叫屬於以下情況的方法
1. 類別 O 本身的方法。
2. 傳入 m 的參數的方法。
3. 在 m 中建立對象的方法。
4. 任何直接持有的對象方法。
 
Example Code :

public class Man {
    private Vehicle mVehicle;
    private void methodInMan(){}
    public void driveVehicle(Vehicle vehicle){
    	methodInMan();// Rule 1
        vehicle.drive();// Rule 2
        new Car().drive();// Rule 3
        mVehicle = new Bike();
        mVehicle.drive();//Rule 4
        new Bike().getClass().getName(); //violation at getName()
    }
}

如何修改遵循 LOD ,可以在 Bike 中直接建立方法來取得 class name,如下

public class Bike implements Vehicle{
    ...
    public String getClassName(){
        return getClass().getName();
    }
}

client 端呼叫

public class Man {
    private Vehicle mVehicle;
    private void methodInMan(){}
    public void driveVehicle(Vehicle vehicle){
    	methodInMan();// Rule 1
        vehicle.drive();// Rule 2
        new Car().drive();// Rule 3
        mVehicle = new Bike();
        mVehicle.drive();//Rule 4
        new Bike().getClassName(); //Rule 3
    }
}

 
注意:
在重構中的程式碼壞味道第15點 Message Chain (過度耦合的消息鏈) 其本身也是描述相同的問題:
一個對象請求另一個對象,然後再向後者請求一個對象。
代表對象之間的結構緊密耦合,一旦對象關係發生變化,客戶端不得不做出相應修改。
可以使用 Hide Delegate 來重構!!