迪米特法则(lawofdemeter)

迪米特法则(Law of Demeter)

迪米特法则(Law of Demeter)也叫最少知识原则(Least Knowledge Principle),它是一种面向对象设计原则,旨在降低软件系统中对象之间的耦合度。

定义

迪米特法则是说,一个对象应该仅与其密切的朋友交流,而不与陌生人交流。所谓的“朋友”,是指直接依赖的对象,包括以下几种:

  1. 该对象本身
  2. 被当作参数传入的对象
  3. 此方法的返回值
  4. 此方法所创建或实例化的对象

优点

迪米特法则可以帮助降低系统中的耦合度,提高系统的可维护性、可拓展性、可读性、稳定性和重用性。当系统中各个对象之间的关系合理、紧密且清晰明了时,就可以更容易地对系统进行维护、修改、扩展以及重构。

如何实现

实现迪米特法则的关键在于尽量减少对象之间的直接依赖关系,可以采用如下方法:

  1. 将某些公共操作封装起来,转化为共享模块。
  2. 尽量减少对象的行为,尽量保持属性的简单,并用该属性避免方法调用。
  3. 在创建对象时,尽量将对象的信息注入到对象内部,而不是在外部直接操作,从而减少对象之间的交互。

实例

下面给出一个违反迪米特法则的例子:

class A:
    def __init__(self):
        self.b = B()

    def do_something(self):
        self.b.action()


class B:
    def __init__(self):
        self.c = C()

    def action(self):
        self.c.action()


class C:
    def action(self):
        print('Do something in C')

a = A()
a.do_something()

以上代码中,类A直接调用了类B和类C的方法,从而导致A、B、C之间的联系非常紧密。如果要对其中任何一个类进行修改,会引起整个系统的变化,这样就会变得非常困难和危险。

现在,我们来修改一下代码,使其符合迪米特法则:

class A:
    def __init__(self, b):
        self.b = b

    def do_something(self):
        self.b.action()


class B:
    def __init__(self):
        self.c = C()

    def action(self):
        self.c.action()


class C:
    def action(self):
        print('Do something in C')

c = C()
b = B()
a = A(b)
a.do_something()

我们将B类的实例化移到了外部,让外部来负责实例化并注入给A类,从而实现了A、B、C之间的松耦合,也更容易进行单元测试。这个模式常常被称为依赖注入或控制反转(Dependency Injection, Inversion of Control, IOC)。

总结

迪米特法则是一种十分实用的面向对象设计原则,能使软件系统更稳定、可扩展和可读,同时也提高了系统的可维护性和重用性。当系统中各个对象之间的关系合理、紧密且清晰明了时,才能更容易地对系统进行维护、修改、扩展以及重构。

阅读剩余 52%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:迪米特法则(lawofdemeter) - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 一键快速关机/重启和登出Win8的实用小技巧

    下面是关于“一键快速关机/重启和登出Win8的实用小技巧”的详细攻略。 一、快速关机和重启 方法一:使用快捷键 直接按下键盘上的「Win+I」快捷键,打开 Windows 8 的设置菜单; 点击「电源」选项,会出现「关机」和「重启」的选项,点击即可关机或重启。 方法二:使用命令行 打开命令提示符,可以通过 【Win + R】 键调出运行窗口,输入 cmd 后…

    other 2023年6月27日
    00
  • VC++中进程与多进程管理的方法详解

    针对“VC++中进程与多进程管理的方法详解”的完整攻略,我给出以下详细内容: VC++中进程与多进程管理的方法详解 1. 进程和多进程的概念 进程是一个正在运行的程序的实例,它包含了程序代码和当前正在执行的程序状态。每一个进程都有一个唯一的进程标识符(PID)来区分自己和其他进程。在Windows系统中,每个进程有自己的地址空间、栈、寄存器和堆。 多进程是指…

    other 2023年6月25日
    00
  • 解决SpringBoot webSocket 资源无法加载、tomcat启动报错的问题

    下面是解决SpringBoot WebSocket资源无法加载、Tomcat启动报错的问题的完整攻略。 首先,检查pom文件中是否有正确的依赖。WebSocket需要两个依赖,分别是spring-boot-starter-websocket和javax.websocket-api。可以在pom.xml文件中添加: <dependency> &lt…

    other 2023年6月25日
    00
  • 阿里规范:为何boolean类型变量命名禁用is开头

    阿里规范:为何boolean类型变量命名禁用is开头 阿里规范是一套由阿里巴巴集团制定的编码规范,旨在提高代码的可读性和可维护性。其中之一的规范是禁止使用\”is\”作为boolean类型变量的命名开头。以下是详细的攻略,解释了为什么要遵循这个规范,并提供了两个示例说明。 为什么禁用is开头命名boolean类型变量? 1. 语义歧义 使用\”is\”开头命…

    other 2023年8月8日
    00
  • Win10 Dev版20246怎么手动更新? Win10 20246版更新出错的解决办法

    下面就是关于“Win10 Dev版20246怎么手动更新? Win10 20246版更新出错的解决办法”的完整攻略: Win10 Dev版20246怎么手动更新? Win10 Dev版20246是Windows Insider计划的一部分,该计划允许开发人员在其PC上测试Windows的最新版本。如果你想手动更新Win10 Dev版20246,以下是步骤: …

    other 2023年6月27日
    00
  • win7系统kb3035583补丁无法卸载解决方法

    Win7系统KB3035583补丁无法卸载解决方法 在Windows 7的更新中,KB3035583补丁是一个比较麻烦的补丁,有时候会导致系统卡死、出现蓝屏等问题,因此许多用户希望将其卸载。但是,有时候卸载这个补丁会提示出错,本文将为大家详细讲解如何解决这个问题。 方法一:使用命令行卸载 打开命令提示符:在Windows启动菜单中,搜索“cmd”或者“命令提…

    other 2023年6月27日
    00
  • Win10升级系统后蓝屏或无限重启的解决方法

    Win10升级系统后蓝屏或无限重启的解决方法 问题现象及可能原因 在升级Windows10系统时,有时会出现蓝屏或无限重启的问题,导致系统不能正常使用。可能的原因有多种,例如: 系统升级过程中出现错误导致系统文件损坏 驱动程序不兼容或过期 硬件设备故障等 解决方法 1. 进入安全模式 首先需要进入Windows10的安全模式,通过安全模式来解决蓝屏或无限重启…

    other 2023年6月27日
    00
  • FreeRTOS动态内存分配管理heap_5示例

    针对您提到的FreeRTOS动态内存分配管理heap_5示例,我将提供详细的攻略如下: 一、FreeRTOS动态内存分配管理 在FreeRTOS中,内存管理既可以是静态的也可以是动态的。静态内存分配意味着在编译时将内存分配给任务和其它内核对象,而动态内存分配是在运行时进行的。动态内存分配使得任务可以根据需要申请和释放内存,这是一种非常强大和灵活的方法。实现动…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部