设计模式六大原则解读——什么是迪米特法则
author:陈镇坤27
创建日期:2022年1月31日
——————————————————————————————
一、迪米特法则(Low of Demeter)
1、迪米特法则的定义
迪米特法则也称最少知识原则(Least Knowledge Principle), 即对自己需要耦合的类保持最低限度的了解原则。
2、迪米特法则的目的
目的在于类间解耦,保证类间的弱耦合关系。一方面可以提高类的复用率,一方面有利于塑造单一构件,方便系统迭代维护。
3、迪米特法则示义1
Only talk to your immediate friends
业务的运转需要对象与对象之间发生必要的耦合,形式各异:组合、聚合、依赖、关联。
迪米特法则要求对象只与“直接的朋友”发生耦合。
下方是示例1
老师commonds班长去清点女生数量。
在类图示例中,Teacher与Girl产生关联。事实上是业务要求中,教师只有负责commond班长固定去清点学生的功能,因此不需要与Girl发生关联。
按照“朋友原则”可分析Teacher的“朋友类”只有存在于成员方法入参、成员变量上的类,因此在方法体内部实例化Girl的做法违反了“最少朋友”的要求,不论是Teacher或GroupLeader,其健壮性都不强(比如修改countGirls方法,可能需要其调用者)。
改良后如下:
下方是示例2
安装软件过程中,遵循第一步确定后,再执行第二步,以此类推,在代码中的UML类图体现如上所示。
在InstallSofware类中,调用其朋友类,进行了上述的判断。
问题在于,根据迪米特法则——最少知识原则的要求,InstallSoftware应该保持对Wizrd最低限度的了解,事实上可以将第一步、第二步,乃至到第三步的判断逻辑封装到Wizard中,InstallSoftware调用封装好的方法即可。否则,当Wizard类中方法产生修改时,将会连带影响到期调用者所在的类——InstallSoftware。
4、建议
遵循迪米特原则,可以从以下几个方面入手:
尽量只与朋友类发生关联;
设计类方法时,尽量考虑是否能减少public方法——越多的public意味着产生越多不必要关联的可能。
PS(书中介绍的一个bug场景):额外注意Serializable(远程调用的对象实现Serializable后,在服务的另一端被实例化时,若类的字段名、类的访问修饰符不一致,则会实例化失败)
5、总结
迪米特法则的核心是解耦。就好像机械零件与零件之间,越少的耦合,便使得整个系统具备更强的健壮性——当某个零件需要更迭或替换时,产生的影响最小。