各位博友晚上好
先回顾一下之前学习的设计模式和原则
简单工厂模式,策略模式,单一职责原则,开放封闭原则,依赖倒转原则,装饰模式,代理模式,抽象工厂模式,原型模式(Copy,深复制,浅复制)以及昨天刚刚学习的模板方法(最大化优化代码)。
今天吃完饭听了一会猫扑网络电台,感觉里面的MM声音不错,听了一个小时,现在开始继续学习啦。
迪米特法则定义(Law of Demeter)
又叫最少知识法则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其它对象尽可能少的了解,不和陌生人说话。英文简写:LoD。
它在软件中的定义是这样的:如果两个类之间不必彼此直接进行通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类需要用另一个类的方法的话,可以通过第三者来转发这个调用。
用我们现在的国情来举个例子,当今社会是个靠关系吃饭的社会,没有关系寸步难行啊,这也就是我们社会现在主要的弊病,官场腐败,行业内部都是尔虞我诈。为什么会这样呢,人们为了生存,都在找自己的关系网络,不管是高层底层通吃,这样的弊端是什么,关系复杂啊。还记得“蜗居”里面的一句台词:关系越用越活。这样 的后果就是人际关系复杂,尤其是负责公关的,这一点体现的尤为明显,当我我是一个最看不惯爱攀关系的人,所以呀我就学习了迪米特法则。如果想让这个社会没有那么复杂,那快用迪米特法则吧。用迪米特法则来制定自己做人的原则,做事的原则,为人处事的原则。
迪米特首先强调的是在类的设计上,每一个类都应该尽量降低类的访问权限,也就是说一个类包装好自己的private状态,不需要让别的类知道的字段和方法就不要公开。迪米特原则的根本思想是强调了类之间的松耦合。
类之间的耦合度越弱,越有利于被复用,一个处在弱耦合的类被修改,不会对关系的类造成波及。也就是说信息的隐藏促进了软件的复用。
LoD的来源:
1987年秋天由美国Northeastern University的Ian Holland提出,被UML的创始者之一Booch等普及。后来,因为在经典著作《 The Pragmatic Programmer》而广为人知。
模式和意义:
迪米特法则可以简单说成:talk only to your immediate friends。
对于面向OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
迪米特法则不希望类直接建立直接的接触。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
有兴趣可以研究一下设计模式的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。
值得一提的是,虽然Ian Holland对计算机科学的贡献也仅限于这一条法则,其他方面的建树不多,但是,这一法则却不仅仅局限于计算机领域,在其他领域也同样适用。比如,美国人就在航天系统的设计中采用这一法则。
狭义的迪米特法则的缺点:
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关。
遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。
门面模式和调停者模式实际上就是迪米特法则的应用。
广义的迪米特法则在类的设计上的体现:
优先考虑将一个类设置成不变类。
尽量降低一个类的访问权限。
谨慎使用Serializable。
尽量降低成员的访问权限。
迪米特原则比较简单,但是它贯穿了整个软件设计理念,需要我们去亲身在编程中灵活的去运用他。
时间不早,早点休息,明天还有新一天的工作。欢迎你的阅读。www.tianboo.net