迪米特法则(Law of Demeter,LoD)
同称 最少知识原则(Low knowledge Principle,LKP)
好,按照习惯,从老外的话开始介绍
Each unit should have only limited knowledge about other units: only
units “closely” related to the current unit.
概念1:每一个单元与其他单元间的关系应保持在有限的知识上,即仅与当前单元紧密关联的单元。
Each unit should only talk to its (immediate) friends; don’t talk to strangers.
概念2:每一个单元都应该只与它的(直接)朋友交流,不和陌生人交流。
其实概念2有点扯淡,说直接朋友不就得了,因为朋友的朋友也算是你的朋友,不过在你没和他接触前他对于你来说就是一个陌生人。然后按照这个逻辑,那概念1不就是我们成熟程序员常说的,朋友天下不如知心一个嘛,反正陌生人对我们也没啥卵用,如同饮水,冷暖自知。ok,概念大概就是这个意思,教我们交朋友。
如果说其他原则侧重的是每个类的简单化,那么,迪米特法则阐述的就是类与类间关系的简单化,加上其他原则的相辅相成,那就是说,将类的编写控制的更简单和抽象。
CPU在做运算时,数据的获取方式一般遵从缓存(L1,L2,L3)–>主存–>磁盘的顺序,下面我们用代码模拟一下流程。
先来个错误示范:
运行结果:
乍一看没啥大问题,功能已经实现了。但是从迪米特法则的概念出发,这样子写是不合理的。代码的基本逻辑是没错的,但是相对于CPU来说,与它最熟悉的是Cache,而Block和Memory与它而言都是陌生人。Cache和Memory是彼此的直接朋友,Block和Memory也是彼此的直接朋友,那么我们可以按照迪米特法则的概念把代码改一下。
修改后:
这样子修改就符合迪米特法则了,因为每个类面向的都是它的直接朋友,没有与陌生人产生关系。
迪米特法则其根本思想,是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成搏击,也就是说,信息的隐藏促进了软件的复用。但是迪米特法则也会带来大量的中介类,导致系统类的数量急剧膨胀。