You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:49:45