迪米特法则(lawofdemeter)

yizhihongxing

迪米特法则(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)。

总结

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

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

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

相关文章

  • 详解Java内存管理中的JVM垃圾回收

    详解Java内存管理中的JVM垃圾回收 Java内存管理中的JVM垃圾回收是指Java虚拟机(JVM)自动回收不再使用的内存空间的过程。垃圾回收的目的是优化内存使用,防止内存泄漏和内存溢出等问题。本攻略将详细介绍JVM垃圾回收的原理和常见的垃圾回收算法,并提供两个示例说明。 1. 垃圾回收的原理 JVM垃圾回收的原理基于以下两个基本概念: 引用计数:每个对象…

    other 2023年8月1日
    00
  • win7系统中怎样添加账户就是添加个用户名来使用

    添加用户账户是Windows 7系统中的一项常用操作,下面我将为你详细讲解如何添加账户及使用。 步骤一:进入控制面板 首先,我们需要进入系统的控制面板: 点击开始菜单,选择“控制面板”。 在控制面板窗口中,找到“用户账户和家庭安全”选项,点击进入。 步骤二:添加新账户 在“用户账户和家庭安全”页面中,点击“添加或删除用户账户”选项。 在弹出的“管理用户账户”…

    other 2023年6月27日
    00
  • Win11/10热跳闸错误怎么修复? 电脑CPU高温重启的解决办法

    Win11/10热跳闸错误怎么修复? 什么是热跳闸错误? 热跳闸(thermal trip)是一种CPU过热保护机制,当CPU温度超过指定上限时,系统会自动关闭以防止硬件损坏。如果您不断遇到热跳闸错误,可能需要采取措施修复您的计算机。 修复热跳闸错误的步骤: 步骤1:清洁内部装置 首先,您需要确认您的计算机内部没有积尘和污垢。如果风扇和其他散热装置被堵塞,将…

    other 2023年6月27日
    00
  • 详解Linux系统中的tempfs与/dev/shm

    详解Linux系统中的tmpfs与/dev/shm 简介 在Linux系统中,我们经常需要在内存中创建一个文件系统或临时存储区。这时我们就可以使用tmpfs与/dev/shm。tmpfs是一种在内存中创建临时文件系统的机制,而/dev/shm是一个tmpfs挂载点,用于在内存中创建极快的共享内存。在本文中,我们将讨论如何使用tmpfs与/dev/shm。 t…

    other 2023年6月27日
    00
  • java入门:基础算法之二进制转换为十进制

    Java入门:基础算法之二进制转换为十进制 在Java编程中,经常需要进行二进制和十进制之间的转换。本文将介绍如何将二进制转换为十进制,并提供两个示例说明,以帮助您更好地理解和应用这些技术。 二进制转换为十进制的方法 将进制转换为十进制的方法是将每个二进制位乘以2的幂次方,然后将结果相加。例如,二进制数1011转换为十进制数的计算方法如下: 1*2^3 + …

    other 2023年5月7日
    00
  • python文件名批量重命名脚本实例代码

    下面详细讲解一下“python文件名批量重命名脚本实例代码”的完整攻略。 简要说明 批量重命名脚本是一种能够帮助我们快速批量修改多个文件名的工具,使用Python语言编写,具体实现思路是遍历指定的目录,对目录下的所有文件进行遍历,通过正则表达式匹配文件名,然后通过字符串的替换方法生成新的文件名,最后使用os模块中的rename方法对文件进行重命名。 实现步骤…

    other 2023年6月26日
    00
  • vue-cli3+ts+webpack实现多入口多出口功能

    “vue-cli3+ts+webpack实现多入口多出口功能”需要做如下几个步骤: 初始化项目 使用vue-cli3初始化一个vue项目,这个项目作为主项目,用于引入其他模块。 vue create my-project 添加模块 在主项目中,通过npm或yarn安装其他需要接入主项目的模块,例如我们需要接入一个blog模块,通过以下命令安装: npm in…

    other 2023年6月27日
    00
  • JavaScript是如何实现继承的(六种方式)

    下面是 JavaScript 实现继承的六种方式的详细攻略: 1. 原型链继承 原型链继承是 JavaScript 实现继承最常用的方式之一。通过将子类的原型指向父类的实例,从而实现对父类属性和方法的继承。具体代码实现如下: // 父类 function Person(name) { this.name = name; } Person.prototype.…

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