QZQ的小世界!

  • 首页
你好!
这里是QZQ的博客站!
  1. 首页
  2. 未分类
  3. 正文

最少知识原则

2025年4月4日 44点热度 0人点赞 0条评论

定义

最少知识原则(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 方法仅能访问如下这些类型的对象:

  1. O 对象自身;

  2. m 方法的参数对象;

  3. 任何在 m 方法内创建的对象;

  4. 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()

上面的设计有诸多问题

  1. call_xiaoming函数实现的功能,没必要和Teacher类进行交互,它需要的类只是XiaoMing类本身而已。

  2. 代码耦合性增强,call_xiaoming中的任意依赖类Teacher和XiaoMing之一被修改,正常的功能可能就无法实现。

  3. 复用很难,如果Teacher类要接收一个小红学生替代XiaoMing,则小红类必须也实现call_my_name否则就报错。

其他的就没法展开说了,讲真参考的文章讲的确实相对生涩了点,我经验不多,盲目展开容易出问题,就先介绍到这里。

参考

最少知识原则(Least Knowledge Principle) - sangmado - 博客园

面向对象编程的六大原则

最少知识原则——Python案例理解 - QZQ的小世界!

开放封闭原则——Python案例理解 - QZQ的小世界!

里氏替换原则——Python案例理解 - QZQ的小世界!

依赖倒置原则——Python案例理解 - QZQ的小世界!

单一职责原则——Python案例理解 - QZQ的小世界!

接口分离原则——Python案例理解 - QZQ的小世界!

[文章导入自 http://qzq-go.notion.site/16349a7b4e75805a8de8f5cfa5eca4a3 访问原文获取高清图片]

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: IT技术 Python Python理论精进
最后更新:2025年4月3日

QZQ

一只涉猎广泛的技术爱好者,绝赞养猫中~

点赞
< 上一篇
下一篇 >

归档

  • 2025 年 4 月
  • 2025 年 3 月
  • 2025 年 2 月
  • 2025 年 1 月
  • 2024 年 12 月
  • 2024 年 11 月

分类

  • 技术
  • 未分类

COPYRIGHT © 2024 QZQ的小世界!. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang