用途:该技能依据迪米特法则(最少知识原则,Karl Liebherr 于1987年提出)进行代码审查与设计辅助,检测对象链式调用(Train Wreck),将设计转换为只与直接朋友对话,从而降低耦合、提升可修改性。适用于代码审查、新实现、重构时对象间耦合较深的场景。
主要能力:识别连链调用,如 a.getB().getC().doX()、order.getCustomer().getAddress().getCity() 等;按四条规则判断调用是否合法:仅可调用自身方法、方法参数对象的方法、方法内新建对象的方法、自身实例字段的方法;禁止调用上述调用返回值的对象方法(即朋友的朋友)。提供判断流程与检测标准(两个以上点号连链、getter 连链加末尾操作、getter 连链加 if 分支)。
使用方式:在代码审查中检查点号连链、getter 连链、对远对象的依赖,并确认是否属于例外。转换模式包括:引入委托方法(如 order.getShippingCity())、使用目的性方法名(如 getNotificationEmail())、以参数传入所需对象、将行为移动到对象内部(如 order.applyApplicableTax())。
例外:流式 API/建造者模式、DTO/值对象、流/集合操作、标准库同类型连链通常不算违规。
限制:需避免过度应用导致“包装方法爆炸”,委托方法超过4个应重新审视设计;委派到同一目标过多时考虑直接使用该对象。语言相关实现模式与重构步骤详见 references/patterns.md。可配合 tell-dont-ask、first-class-collection、breach-encapsulation-naming 等技能使用。