迪米特法則 (Law of Demeter)

★★★★★Studied

From大話設計模式

📚 From the Books

迪米特法則 (Law of Demeter)ConceptPrinciples

又叫最少知識原則:如果兩個類別不必直接通訊,就不該發生直接互動;真要呼叫,透過第三者轉發。核心是「只跟直接朋友說話」——盡量降低成員可見度、強調類別間鬆耦合,因為資訊的隱藏促進了複用。

🧠 When to Use

TIP

訊號:出現 a.getB().getC().doD() 這種「火車失事(train wreck)」鏈;一個物件要辦事得先認識另一個物件肚子裡的第三、第四個物件;改了深處某個類別,一路上的呼叫端全被波及。

⚖️ Structure & Variants

只跟直接朋友說話 — 別問陌生人
// ❌ 火車失事:Checkout 認識了 Customer 內部的 Wallet、再認識 Wallet 內部的餘額
class Checkout {
    fun pay(customer: Customer, amount: Int) {
        customer.getWallet().getBalance().deduct(amount)   // 穿三層內部結構
    }
}

// ✅ 只跟直接朋友(Customer)說話,內部怎麼扣由它自己負責
class Checkout {
    fun pay(customer: Customer, amount: Int) {
        customer.pay(amount)          // Customer 對外只暴露一個意圖
    }
}
  • 「打電話別問『小張在嗎?』(依賴具體實作),要問『IT 部嗎?我電腦壞了請派人來』(依賴抽象窗口)」——大話設計模式的比喻。
兩個前提 — 降可見度 + 鬆耦合
  • 降低成員的訪問權限:每個類別盡量把狀態包成 private,不需要外部知道的欄位/行為就別公開;對外只開必要的屬性。
  • 強調鬆耦合:類別間耦合越弱越有利複用;弱耦合的類別被改,不會波及有關係的類別。
  • 一句話總結書中觀點:資訊的隱藏促進了軟體的複用。
和三個原則/模式的關係
  • DIP:問「IT 部」而非「小張」=面向介面而非面向實現。LoD 與 DIP 都在降耦合,只是切角不同。
  • Mediator:把「員工各自找工程師」的網狀依賴,收成「都找 IT 主管安排」的星形——這正是中介者。
  • Facade:對外只暴露一個窗口、隱藏子系統內部,也是 LoD 的具體落地。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading