消息链
概述
消息链是耦合类代码异味的一种,指方法调用链过长,例如a.getB().getC().getD().getValue()这样的"火车残骸"式代码,使客户端依赖于对象的导航结构。
关键内容
- 特征识别:
- 方法调用链很长:a.getB().getC().getD().getValue()
- 客户端代码依赖对象的导航结构
- "火车残骸"(Train Wreck)式的代码
-
连续的点号调用链条
-
负面影响:
- 代码非常脆弱,任何一层变化都会导致失败
- 违反迪米特法则(Law of Demeter)
- 代码绑定到特定的对象结构
- 降低代码的可维护性
-
难以理解对象之间的关系
-
典型示例: ``` // 差的做法:消息链 const managerName = employee.getDepartment().getManager().getName();
// 更好的做法:隐藏委派 const managerName = employee.getManagerName(); ```
- 重构策略:
- Hide Delegate:隐藏委托关系
- Extract Method:提取方法来简化调用
-
Move Method:将方法移到更合适的位置
-
解决方案:
- 在合适的类中添加包装方法
- 使用委派模式隐藏复杂调用
- 重新设计对象关系以减少深层调用
来源
- Martin Fowler — 《重构:改善既有代码的设计》
- 代码异味 — 重构指导书