关于Law of Demeter中Direct component object术语的含义及资料咨询
迪米特法则中「Direct Component Object」的详解
我来帮你理清这个容易混淆的术语——毕竟David Block对迪米特法则的细化解读确实给不少开发者带来过困惑。
一、术语到底指什么?
首先明确:Direct Component Object是David Block在细化迪米特法则(LoD)的“只和朋友说话”原则时提出的概念,它特指当前对象自身直接拥有、管理的组成部件。换句话说,就是那些作为当前对象成员变量存在、通过构造注入被持有,或者由当前对象负责创建和维护的对象。
举个生活化的例子:你手里的手机,它的电池、屏幕、主板就是你的手机的Direct Component Object——这些部件是手机本身的组成部分,手机可以直接操作它们。
二、实际代码案例(Java示例)
用代码来直观感受:
// 组件类:电池 class Battery { public void charge() { System.out.println("电池开始充电"); } } // 主类:手机 class Phone { // Battery是Phone的Direct Component Object private Battery battery; public Phone() { // 由Phone创建并持有组件对象 this.battery = new Battery(); } // 符合迪米特法则:Phone直接调用自己的组件方法 public void startCharging() { battery.charge(); } } public class Demo { public static void main(String[] args) { Phone myPhone = new Phone(); // 外部只和Phone交互,不直接碰它的组件 myPhone.startCharging(); } }
这里要划重点:如果外部代码写成myPhone.getBattery().charge(),那就违反了迪米特法则——因为外部对象不应该直接和Phone的Direct Component Object交互,而应该通过Phone提供的接口来间接操作。
三、怎么找更多相关信息?
David Block的原始论述可以在经典的面向对象设计书籍里找到(比如《Object-Oriented Analysis and Design with Applications》这类教材会引用他对LoD的细分)。另外,很多高校的软件工程课件、专注于面向对象设计的技术博客,也会把Direct Component Object和LoD允许交互的其他对象类型(比如方法参数对象、方法内创建的局部对象)放在一起对比讲解,这些内容能帮你更全面地理解这个术语的上下文。
内容的提问来源于stack exchange,提问作者Fox Amadeus
相关产品推荐
相关产品推荐

