优秀的编程知识分享平台

网站首页 > 技术文章 正文

趣谈设计模式之迪米特原则(迪米特法则的重构方案实例)

nanyue 2024-07-26 16:06:22 技术文章 12 ℃

在面向对象的程序设计原则中也可分为目标类和方法类。目标类除了前面讲的开闭原则、里氏替代原则、再一个就是我们今天讲的迪米特原则。

迪米特原则,在1987年秋天由美国Northeastern University的Ian Holland提出,被UML的创始者之一Booch等普及。它规定每一个软件单位对其他的单位都只有最少的知识,并且局限于那些与本单位密切相关的软件单位。



先看一下规则的定义,只与你直接的朋友们通信,不要跟“陌生人”说话。在编码过程中,所谓的“朋友”有哪些呢?任何一个对象,如果满足下面的任一条件,就是当前对象的“朋友”,否则就是“陌生人”。

一、当前对象本身(this)。

二、以参量形式传入到当前对象方法中的对象。

三、当前对象的实例变量直接引用的对象。

四、当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友。

五、当前对象所创建的对象。

迪米特原则其实是要求类“羞涩”一点,尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多使用private、protected等访问权限。如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,就放置在本类中。

理论知识总是晦涩难懂的,为了不打消各位的积极性,还是来个栗子来压压惊吧。


在一个风和日丽的下午,李小菜与同事王大虾热烈沟通交流业务的关键逻辑。王大虾利用自己的丰富项目经验给李小菜讲的明明白白的,并建议李小菜在设计的时候注意迪米特原则。

尽管李小菜对迪米特原则懵懵懂懂,还是在经过一番构思之后,开始了敲键盘写代码。在兴致勃勃之际,突然停电了,电脑直接关机了。好在供电在短时间内就恢复了,李小菜重新开机之后直呼晦气,部分代码没有保存。

正在抱怨时,王大虾过来跟李小菜说,不要灰心,这是个因祸得福吧。正好借助这个跟你详细讲解一下迪米特原则。于是有了以下的对话。

王大虾:”你平时都是怎么关机的?“

李小菜:”直接在操作系统里,选择开始按钮,然后在选择关机菜单就行了,或者按一个专门的关机按钮,多简单的事情“

王大虾:”你知道,断电和手动关机有啥区别么?“

李小菜:”这个印象深刻,手动关机不丢失数据,断电直接会丢失数据“

说到这里李小菜喃喃自语,”我的代码,我的代码……“,满脸的忧伤。

王大虾:“这其实是一个很好的迪米特例子,我来给你详细讲解一下。断电是你的伤心事,就不讲啦,还是讲讲手动关机吧”

王大虾略微思考一下,接着说。

“选择关机菜单之后,其实计算机会执行一些列动作的。正常情况,先保存当前未完成的任务,然后是运行的服务,再然后关闭显示器,最后是关闭电源。断电是直接执行了最后一步,所以你的代码就丢失了。”

李小菜若有所思,接着说:”这个道理我明白,但是跟迪米特原则有毛关系?“

王大虾:”对于人来说,当他想要执行关闭的时候,是不需要关心电脑内部的关闭步骤的。电脑只需要提供一个关闭方法即可,比如说按关闭按钮。如果把关机的中间操作告诉他人,不说明步骤。他就要记住关机的时候,先干什么后干什么。我敢保证不出几天这个电脑就会挂掉了。“

李小菜:“这么说有点明白了。“

王大虾:”再拔高一下,从被依赖者的角度,只应该暴露应该暴露的方法。“

结语

在很多情况下,我们使用迪米特原则是借助中介来解决问题。比如当你想要租房的时候,你可以找房屋中介,对方会按照你的标准为你寻找合适的住房。但是也存在一个问题,那么做一件事情需要多少中介呢?这是我们需要回避的问题,最好是建议不超过3层委托。不然的话,会给项目带来很大的风险。

最后,通过上面的讲解,各位看懂了么?

最近发表
标签列表