迪米特法则
迪米特法则又叫作最少知识原则,就是说,一个对象应当对其他对象要有尽可能少的了解。
迪米特法则所谈论的,就是对对象之间的信息流量、流向以及信息的影响的控制。
在软件系统中,一个模块设计得好不好最主要、最重要的标志,就是该模块在多大程度上将自己的内部数据和其他与实现有关的细节隐藏起来。
一个设计得好的模块可以将它所有实现的细节隐藏起来,彻底的将提供给外界的API和自己的实现分隔开来。这样,模块和模块之间就可以仅仅通过彼此的API相互通信,而不会理会模块内部的工作细节。
这一概念就是“信息的隐藏”,或者叫作“封装”,是软件设计的基本教义之一。
迪米特法则信息的隐藏非常重要的原因在于,它可以使各个子系统之间脱耦,从而允许它们独立的被开发、优化、使用、阅读以及修改。
这种脱耦化可以有效的加快系统的开发过程,因为可以独立地同时开发各个模块。它可以使维护过程变得容易,因为所有的模块都容易读懂,特别是不必担心对其他模块的影响。
迪米特法则的主要用意是控制信息的过载。将迪米特法则运用到系统设计中时,要注意下面的几点。
(1)在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。迪米特法则一个处于弱耦合中类一旦被修改,不会对有关系的类造成波及。
(2)在类的结构设计上,每一个类都应当尽量降低成员的访问权限(Accessibility)。换言之,一个类包装好各自的private状态。一个类不应当public自己的属性,而应当提供取和赋的方法让外界访问自己的属性。
(3)在类设计上,只要有可能,一个类应当设计成不变类。
(4)在对其他类的引用上,一个对象对其对象的引用应当降到最低。
限制局域变量的有效范围
在需要一个变量的时候才声明它,可以有效地限制局域变量的有效范围。一个变量如果仅仅在块的内部使用的话,就应当将这个变量在程序块的内部使用它的地方声明,而不是放到块的外部或者块的开头声明。这样做的好处有两个:
(1)程序可读性比较好。
(2)如果一个变量是在需要它的程序块的外部声明的,那么当这个块还没有被执行时,这个变量就已经被分配了内存;而且在这个程序块已经执行完毕后,这个变量所占据的内存空间还没有释放,这显然是不好的。如果局域变量都是在马上就要使用的时候才声明,就可以避免这种情况。
狭义的迪米特法则的缺点:
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关。
遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。
但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。
门面模式和调停者模式实际上就是迪米特法则的应用。 .
广义的迪米特法则在类的设计上的体现:
优先考虑将一个类设置成不变类。
尽量降低一个类的访问权限。
谨慎使用Serializable。
尽量降低成员的访问权限。