最少知识原则也叫迪米特法则(Law of Demeter,LoD),“迪米特”这个名字源自 1987 年美国东北大学一个名为“Demeter”的研究项目。
许多人更倾向于使用迪米特法则这个名字,也许是因为显得更酷一点。但本书参考 Head First Design Patterns 的建议,称之为最少知识原则。一是因为这个名字更能体现其含义,另一个原因 是“法则”给人的感觉是必须强制遵守,而原则只是一种指导,没有哪条原则是在实际开发中必 须遵守的。比如,虽然遵守最小知识原则减少了对象之间的依赖,但也有可能增加一些庞大到难 以维护的第三者对象。跟单一职责原则一样,在实际开发中,是否选择让代码符合最少知识原则, 要根据具体的环境来定。
最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。
我们先来看一下这个代码:
gerneral.getColonel(c).getMajor(m).getCaptain(c).getSergeant(s).getPrivate(p).digFoxhole();
代码通过这么长的消息链才能完成一个任务,太过于繁琐!而且,这条链中任何一个对象的改动都会影响整条链的结果。
1. 减少对象之间的联系
单一职责原则指导我们把对象划分成较小的粒度,这可以提高对象的可复用性。 但越来越多的对象之间可能会产生错综复杂的联系,如果修改了其中一个对象,很可能会影响到跟它相 互引用的其他对象。对象和对象耦合在一起,有可能会降低它们的可复用性。
最少知识原则要求我们在设计程序