【Python】新手入门学习:详细介绍迪米特原则(LoD)及其作用、代码示例

news2025/3/11 9:12:26

【Python】新手入门学习:详细介绍迪米特原则(LoD)及其作用、代码示例

在这里插入图片描述

🌈 个人主页:高斯小哥
🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分92+),分享更多关于深度学习、PyTorch、Python领域的优质内容!(希望得到您的关注~)

博客链接简要说明
【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例一个类应该只有一个引起变化的原因,确保类的职责单一。
【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例软件实体应对扩展开放,对修改封闭,提高系统的可维护性和可扩展性。
【Python】新手入门学习:详细介绍里氏替换原则(LSP)及其作用、代码示例子类必须能够替换其父类,且替换后,程序的行为没有变化。
【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
【Python】新手入门学习:详细介绍接口分隔原则(ISP)及其作用、代码示例使用多个专门的接口,而不使用单一的总接口,降低类之间的耦合度。
【Python】新手入门学习:详细介绍组合/聚合复用原则(CARP)及其作用、代码示例尽量使用合成/聚合的方式达到复用,减少继承的使用。
【Python】新手入门学习:详细介绍迪米特原则(LoD)及其作用、代码示例一个对象应当对其他对象保持最少的了解,降低类之间的耦合度。

🌵文章目录🌵

  • 🔍一、什么是迪米特原则(LoD)?
  • 💡二、LoD原则的作用
  • 🔧三、如何实现LoD原则
  • 🔍四、违反LoD原则的后果
  • 🎉五、总结

🔍一、什么是迪米特原则(LoD)?

  迪米特原则(Law of Demeter,简称LoD)是面向对象设计原则中的一条重要原则。该原则的核心思想是:一个对象应该对其他对象保持最少的了解。也就是说,一个模块或对象应该尽可能少地了解其他模块或对象的内部状态和行为,只关注与自身直接相关的部分。在代码设计中,这通常意味着一个模块只应该与其直接的朋友(比如它的类成员、方法参数、返回类型等)通信,而不应该了解或依赖于模块的外部细节。

  LoD原则的主要目的是降低模块之间的耦合度,提高系统的可维护性和可扩展性。通过减少对象之间的依赖关系,可以降低代码修改的复杂度,使得系统更加健壮和灵活。

💡二、LoD原则的作用

LoD原则在软件设计中具有重要的作用,主要体现在以下几个方面:

  1. 降低耦合度:通过减少对象之间的依赖关系,降低了模块之间的耦合度。这使得代码更加模块化,便于维护和扩展。

  2. 提高可维护性:由于减少了对象之间的直接交互,当某个对象内部发生变化时,对其他对象的影响也会相应减少,从而降低了维护的难度。

  3. 提高可扩展性:由于对象之间的依赖关系减少,可以更容易地添加或替换模块,提高了系统的可扩展性。

  4. 增加代码可读性:遵循LoD原则的代码结构更加清晰,每个对象只需要关注自己的职责,使得代码更加易于理解和阅读。

🔧三、如何实现LoD原则

下面是一个简单的Python代码示例,展示了如何实现LoD原则:

from abc import ABC, abstractmethod

# 定义组件接口
class Component(ABC):
    @abstractmethod
    def initialize(self):
        pass

# Ram 类实现 Component 接口
class Ram(Component):
    def initialize(self):
        print("RAM initialized")

# Cpu 类实现 Component 接口
class Cpu(Component):
    def initialize(self):
        print("CPU initialized")

# Computer 类依赖于 Component 接口,而不是具体的实现类
class Computer:
    def __init__(self, ram: Component, cpu: Component):
        self._ram = ram
        self._cpu = cpu

    def start(self):
        self._ram.initialize()
        self._cpu.initialize()
        print("Computer started")

# 使用示例
ram_instance = Ram()
cpu_instance = Cpu()
computer = Computer(ram_instance, cpu_instance)
computer.start()

在这个代码示例中:

  • 我们定义了一个 Component 接口,它包含了一个 initialize 方法。RamCpu 类都实现了这个接口。
  • Computer 类现在接受两个 Component 类型的参数(ramcpu),这意味着它可以与任何实现了 Component 接口的类一起工作,而不仅仅是 RamCpu
  • Computer 类调用这些组件的 initialize 方法,但不知道这些组件的具体实现细节。
  • 这样的设计提供了更大的灵活性和可扩展性,因为你可以很容易地替换 RamCpu 的实现,或者添加新的组件类型,只要它们实现了 Component 接口即可。

这个代码示例遵循了迪米特原则,因为它减少了 Computer 类对底层组件具体实现的依赖,并允许更灵活地组合和替换这些组件。

🔍四、违反LoD原则的后果

如果违反了LoD原则,会导致一系列不良后果:

  1. 高耦合度:对象之间的依赖关系复杂,一个对象的修改可能会影响到多个其他对象,增加了代码的维护难度。

  2. 代码难以维护:当某个对象发生变化时,需要修改与之相关的多个对象,维护成本高昂。

  3. 难以扩展:由于对象之间的紧密耦合,添加新功能或替换模块变得困难,限制了系统的可扩展性。

  4. 测试困难:由于对象之间的依赖关系复杂,难以进行单元测试或集成测试,增加了测试的难度和成本。

因此,遵循LoD原则对于保持代码的健壮性、灵活性和可维护性至关重要。

🎉五、总结

  迪米特原则(LoD)是面向对象设计中的重要原则之一,它强调一个对象应该对其他对象保持最少的了解。通过降低模块之间的耦合度,我们可以提高代码的可维护性、可扩展性和可读性

  我们应该意识到违反LoD原则所带来的后果,如高耦合度、代码难以维护、难以扩展和测试困难等问题。因此,在设计和开发过程中,我们应该积极应用LoD原则,并时刻关注代码的结构和依赖关系,以确保系统的健壮性和灵活性。

  总之,迪米特原则(LoD)是我们在面向对象设计中应该遵循的重要原则之一。通过深入理解并应用这一原则,我们可以编写出更加健壮、灵活和易于维护的代码,为软件系统的长期发展和迭代打下坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA编译安卓源码TVBox(2)

一、项目结构:主要app和player app结构 二、增加遥控器按键选台 修改LivePlayActivity.java 1、声明变量 public String channelId "";public Timer timer new Timer();public Toast mToast;2、定义方法 private void mToastShow(String s){mToast …

数据结构(二)顺序表和链表

1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直…

鸿蒙车载原生开发,拓展新版图

一天内连发“五弹”、HiCar 4.0首次上车 华为鸿蒙狂扩“汽车朋友圈”-上游新闻 汇聚向上的力量 3月15日,在“华为云&华为终端云服务创新峰会2024”上,华为首批汽车行业伙伴广汽传祺、岚图汽车、零跑汽车、凯翼汽车加入鸿蒙生态合作,华为…

C语言:操作符详解(下)

目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性:优先级…

搭建谷歌Gemini

前言 Gemini是Google AI于2023年发布的大型语言模型,拥有强大的文本生成、理解和转换能力。它基于Transformer模型架构,并使用了大量文本和代码数据进行训练。Gemini可以执行多种任务,包括: 生成文本:可以生成各种类…

蓝桥杯2022年第十三届省赛真题-灭鼠先锋

LLLV solution1 必输:只有一个格子 手算可以模拟出来~ solution2 OOOO状态下,谁先下谁必输 》问题转化为谁先下满第一排,谁必赢,可以非常容易的模拟出来

buuctf warmup 超详细

目录 1.代码审计&#xff1a; 2.逻辑分析 3.总结分析 4.分析记录 5.疑点解答 1.代码审计&#xff1a; <?phphighlight_file(__FILE__);class emmm //定义了一个类{public static function checkFile(&$page) 类里面又申明创建…

稀碎从零算法笔记Day18-LeetCode:移除链表元素

前言&#xff1a;接近20day的时间&#xff0c;终于来到了链表。 题型&#xff1a;指针、链表 链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你…

UE4_AI_行为树_行为树快速入门指南

声明&#xff1a;学习笔记。 在 行为树快速入门指南 中&#xff0c;你将学会如何创建一个敌方AI&#xff0c;该AI看到玩家后会做出反应并展开追逐。当玩家离开视线后&#xff0c;AI将在几秒钟后&#xff08;这可根据你的需求进行调整&#xff09;放弃追逐&#xff0c;并在场景中…

P1086 [NOIP2004 普及组] 花生采摘

题目描述 鲁宾逊先生有一只宠物猴&#xff0c;名叫多多。这天&#xff0c;他们两个正沿着乡间小路散步&#xff0c;突然发现路边的告示牌上贴着一张小小的纸条&#xff1a;“欢迎免费品尝我种的花生&#xff01;――熊字”。 鲁宾逊先生和多多都很开心&#xff0c;因为花生正…

xnip滚动截图失效

出现问题背景 系统&#xff1a;macos 截图区域&#xff1a;iterm终端 问题原因 截图背景为非纯色背景&#xff0c;我在iterm中的背景设置了图片&#xff0c;即使用图片作为终端背景&#xff0c;而xnip不支持非纯色背景的滚动截图。 解决方法 取消使用图片背景。 引用 滚…

Linux编译器gcc/g++的功能与使用

一、程序的生成 首先&#xff0c;我们知道程序的编译分为四步&#xff1a; 1、预处理 2、编译 3、汇编 4、链接 1.1预处理 预处理功能主要包括头文件展开、宏定义、文件包含、条件编译、去注释等。 所谓的头文件展开就是在预处理时候&#xff0c;将头文件内容拷贝至源文…

算法之二分查找算法

二分查找算法简介 1. 首先说明二分查找算法是比较恶心, 细节很多, 很容易写出死循环的算法, 但熟悉了之后是最简单的算法. 2. 其次我们可能听说过二分查找的前提是数组有序的前提下进行, 但其实不一定. 3. 二分查找算法有一套模板: 朴素的二分模板: 比较简单, 但是有局限性查找…

【Office学习】Word参考文献交叉引用之连续引用

Word中为实现连续多个参考文献的的引用&#xff0c;如[1-3] 通过交叉引用至内容中的【1】和【3】不必多说&#xff0c;关键问题是如何变成[1-3]&#xff0c;如果强行删掉两边括号&#xff0c;更新后会恢复原样不说&#xff0c;打印或者转为PDF无法识别到删除的修改。 例如 1…

北斗卫星在桥隧坡安全监测领域的应用及前景展望

北斗卫星在桥隧坡安全监测领域的应用及前景展望 北斗卫星系统是中国独立研发的卫星导航定位系统&#xff0c;具有全球覆盖、高精度定位和海量数据传输等优势。随着卫星导航技术的快速发展&#xff0c;北斗卫星在桥隧坡安全监测领域正发挥着重要的作用&#xff0c;并为相关领域…

C++ 网络编程学习五

C网络编程学习五 网络结构的更新单例模式懒汉单例模式饿汉单例模式懒汉式指针智能指针设计单例类 服务器优雅退出asio的多线程模型IOServiceasio多线程IOThreadPoolepoll 和 iocp的一些知识点 网络结构的更新 asio网络层&#xff0c;会使用io_context进行数据封装&#xff0c;…

Typora设置文本颜色

目录 总共分为三种方法 1.使用markdown语法的内联公式 2.使用HTML语法 3.借助第三方软件&#xff08;不建议&#xff0c;操作没那么顺滑&#xff09; 总共分为三种方法 1.使用markdown语法的内联公式 <1>首先需要在设置中勾选Markdown扩展语法下的内联公式&#xff…

QML| QML 组件

# | QML 组件 | 组件是可重用的、封装好的QML类型,并提供了定义好的接口。组件一般使用一个.qml文件定义。前面讲到的使用QML文档定义对象类型,其实就是创建了一个组件。这种使用独立QML文件创建组件的方法这里不再讨论。除了使用单独的QML文件,还可以使用Component类型在一…

DVWA 靶场搭建

文章目录 环境说明1 DVWA 简介2 DVWA 安装 环境说明 操作系统&#xff1a;Windows 10PHPStudy 版本: 8.1.1.3Apache 版本&#xff1a;2.4.39MySQL 版本 5.7.26 1 DVWA 简介 DVWA&#xff08;Damn Vulnerable Web App&#xff09;是一个基于 “PHP MySQL” 搭建的Web应用程序&…

【linux】进程(一)

先看预备知识&#xff0c;对本篇文章更有帮助。 目录 进程概念&#xff1a;了解动态运行的概念&#xff1a;进程的本身内部属性&#xff1a;启动进程&#xff1a;关闭进程&#xff1a; 如何创建进程&#xff1a;进程状态&#xff1a;直接看进程状态&#xff1a;僵尸进程与孤儿…