定义
最少知识原则(Least Knowledge Principle),或者称迪米特法则(Law of Demeter),是一种面向对象程序设计的指导原则,它描述了一种保持代码松耦合的策略。其可简单的归纳为:
Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.
应用到面向对象的程序设计中时,可描述为:
"类应该与其协作类进行交互但无需了解它们的内部结构"
这种设计能带来的好处是:更好的信息隐藏和更少的信息重载
具体地讲
对于对象 O 中的一个方法 m ,m 方法仅能访问如下这些类型的对象:
- O 对象自身;
- m 方法的参数对象;
- 任何在 m 方法内创建的对象;
- O 对象直接依赖的对象
也就是说,对象应尽可能地避免调用由另一个方法返回的对象的方法。
现代面向对象程序设计语言通常使用 "." 作为访问标识,LoD 可以被简化为 "仅使用一个点(use only one dot)"。也就是说,代码 a.b.Method() 违反了 LoD,而 a.Method() 则符合 LoD。打个比方,人可以命令一条狗行走,但是不应该直接指挥狗的腿行走,应该由狗去指挥它的腿行走。
最后这个比喻真的太精妙了!
代码案例
来看一个代码
class XiaoMing:
def __init__(self):
self.name = '小明'
def call_my_name(self):
return self.name
class Teacher:
def __init__(self, Student):
self.st = Student()
def get_student(self):
return self.st
def call_xiaoming():
tc = Teacher(XiaoMing)
print(f'老师的学生是{tc.get_student().call_my_name()}')
if __name__ == '__main__':
call_xiaoming()
上面的设计有诸多问题
call_xiaoming
函数实现的功能,没必要和Teacher
类进行交互,它需要的类只是XiaoMing
类本身而已。- 代码耦合性增强,
call_xiaoming
中的任意依赖类Teacher
和XiaoMing
之一被修改,正常的功能可能就无法实现。 - 复用很难,如果
Teacher
类要接收一个小红学生替代XiaoMing
,则小红类必须也实现call_my_name
否则就报错。
其他的就没法展开说了,讲真参考的文章讲的确实相对生涩了点,我经验不多,盲目展开容易出问题,就先介绍到这里。
参考
最少知识原则(Least Knowledge Principle) - sangmado - 博客园
文章评论