迪米特原则

迪米特法则,Law of Demeter,简称 LoD,也叫最小知识原则。是指如果两个类不必彼此互相通信,那么这两个类就不应当发生直接的相互作用;如果其中一个类需要调用另一个类的某一个方法,可以通过第三者转发这个调用。

迪米特法则还有一个英文解释是:talk only to your immediate friends(只和直接的朋友交流)。

使用动机

强调类之间的松耦合。类之间的耦合越弱,越有利于复用和扩展。另外,一个处于弱耦合的类被修改,不会对有关系的类造成波及。

如何使用

  • 尽量减少暴露实现细节
  • 在类的结构设计上,每一个类都应当尽量降低成员的访问权限,不需要让别的类知道的字段或行为就不要公开。
  • 类之间不直接建立联系,通过中间类来中转。

使用原则

  • 减少公开方法和变量。
  • 每个类对其他类知道的越少越好。
  • 类不应该知道它所操作的对象的内部细节。

使用示例

案例:跨部门办事

假设我们电脑出问题了,第一反应是找运维部门的熟人帮忙看看,这等于直接操作了运维部门的内部。这样的好处几乎没有,但问题很多。也许有人会说都找到人直接解决问题了,不是很高效吗,其实并不是。首先,你找熟人时,他不一定有时间,也许手里还有更重要、更紧急的事情在忙;其次,他也许也不知道你的问题,或者说他不负责这一块,无能为力;还有,如果他人际关系不错,很多人出问题了都来找他,还会导致部门内工作不均衡;另外,他自己一直在解决问题,但是领导却并不知晓,即便知道也不能接受。总而言之,如果都去找熟人,最后效率和满意度都不会很高。

这时候最好的做法是提供一个运维部门的问题反馈入口,由这名同事将收集到的问题分门别类,统一分派给部门内相应的人员进行处理。这样不仅资源得到了均衡,而且还易于批量解决问题,领导查看也一目了然。即便有同事请假,那也是运维部门内部的事情,由内部自己解决,并不影响外部使用。

案例:密码学攻击者-挑战者游戏

img

在攻击者-挑战者模型中,用户能得到全部信息,而挑战者需要让攻击者无法分辨出自己拿到的信息和随机字符串有什么区别,即最小知识。

为了区分攻击者和用户,需要采用中介(私钥、鉴权操作),让中介委托获取信息。

资源

  1. 迪米特原则 (datawhalechina.github.io)
  2. 密码学之安全模型总结 - Max1z - 博客园 (cnblogs.com)