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 來重構!!