【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例

【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例
在这里插入图片描述

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

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

🌵文章目录🌵

  • 🎯一、什么是依赖倒置原则(DIP)?
  • 🔧二、DIP原则的作用
  • 📚三、如何实现DIP原则
  • 🔍四、DIP原则在实际项目中的应用
  • 💡五、违反DIP原则的后果
  • 🎉六、总结

🎯一、什么是依赖倒置原则(DIP)?

  依赖倒置原则(Dependency Inversion Principle,简称DIP)是面向对象设计原则中的一条重要原则。其核心思想是:要依赖于抽象,不要依赖于具体实现。换言之,高层模块不应该依赖于低层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象

  DIP原则鼓励我们在编写代码时,将抽象层与具体实现层进行分离,通过接口或抽象类来定义抽象层,而将具体的实现细节放在具体实现层中。这样,当具体实现发生变化时,只要接口或抽象类保持不变,高层模块就不会受到影响,提高了代码的可维护性和可扩展性。

🔧二、DIP原则的作用

DIP原则在软件设计中发挥着至关重要的作用,主要体现在以下几个方面:

  1. 降低耦合度:通过抽象层与具体实现层的分离,降低了模块之间的耦合度。当具体实现发生变化时,只需要修改具体实现层,而不需要修改高层模块,降低了代码的维护成本。

  2. 提高代码的可扩展性:由于高层模块依赖于抽象层,因此可以通过添加新的具体实现来扩展系统的功能,而无需修改现有代码。

  3. 促进代码复用:通过定义清晰的接口或抽象类,不同的模块可以共享相同的抽象层,从而实现代码的复用。

  4. 增强系统的灵活性:由于高层模块不直接依赖于具体实现,因此可以轻松地替换或升级具体实现,而不会影响到整个系统的运行。

📚三、如何实现DIP原则

要实现DIP原则,我们可以采取以下几个关键步骤:

  1. 定义抽象层:通过接口或抽象类来定义抽象层,明确高层模块所需的功能和行为。

  2. 编写具体实现:实现具体的类,这些类将继承自抽象类或实现接口,提供具体的功能实现。

  3. 高层模块依赖于抽象:在高层模块中,只引用抽象层,而不直接引用具体实现类。这样,高层模块就可以通过抽象层来调用具体实现的功能。

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

from abc import ABC, abstractmethod

# 定义抽象层
class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

# 具体实现
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

# 高层模块依赖于抽象
def calculate_total_area(shapes):
    total_area = 0
    for shape in shapes:
        total_area += shape.area()
    return total_area

# 使用示例
shapes = [Circle(5), Rectangle(10, 20)]
total_area = calculate_total_area(shapes)
print(f"Total area: {total_area}")

在这个例子中:

  1. 抽象层定义Shape 类是一个抽象基类,它定义了一个抽象的 area 方法。

  2. 具体实现CircleRectangle 类是 Shape 的具体实现,它们分别实现了 area 方法,用来计算各自的面积。

  3. 高层模块依赖于抽象calculate_total_area 函数是一个高层模块,它依赖于 Shape 抽象,而不是依赖于具体的 CircleRectangle 类。它接收一个 Shape 对象的列表,并调用每个对象的 area 方法来计算总面积。

  4. 细节依赖于抽象CircleRectangle 类作为细节,它们实现了 Shape 抽象中定义的 area 方法。

  这样的设计使得 calculate_total_area 函数可以独立于具体的形状类,只要它们实现了 Shape 抽象中定义的接口。如果将来需要添加新的形状类,只要这个新类也实现了 Shape 接口,calculate_total_area 函数就可以无缝地与之集成。因此,这个代码示例遵循了依赖倒置原则,使得系统更加灵活、可维护和可扩展。

🔍四、DIP原则在实际项目中的应用

  在实际项目中,DIP原则的应用广泛而重要。它常常与工厂模式、策略模式等设计模式一起使用,以实现代码的灵活性和可扩展性。

  例如,在一个复杂的业务系统中,我们可能需要处理多种不同类型的支付方式(如支付宝、微信支付、银行卡支付等)。每种支付方式都有自己的支付逻辑和接口。这时,我们可以定义一个抽象的 Payment 接口,然后为每种支付方式实现一个具体的类。业务逻辑层则依赖于 Payment 接口,而不是具体的支付实现类。这样,当需要添加新的支付方式时,我们只需要实现新的支付类,并将其注册到系统中,而无需修改现有的业务逻辑代码。

💡五、违反DIP原则的后果

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

  1. 代码紧耦合:当高层模块直接依赖于具体实现时,不同模块之间会形成紧密的耦合关系。一旦具体实现发生变化,高层模块也必须进行相应的修改,这增加了代码的维护难度和成本。

  2. 难以扩展新功能:如果高层模块直接依赖于具体实现,那么添加新的功能或修改现有功能将变得困难。因为每次变动都需要修改高层模块的代码,这限制了系统的可扩展性。

  3. 测试困难:当高层模块与具体实现紧密耦合时,测试也会变得困难。因为测试人员需要模拟具体的实现细节,以验证高层模块的正确性。这增加了测试的复杂性和工作量。

  4. 降低了代码复用性:如果每个高层模块都直接依赖于具体的实现,那么不同的模块之间很难共享相同的抽象层。这导致了代码的重复和冗余,降低了代码的复用性。

  因此,遵循DIP原则对于保持代码的健壮性、灵活性和可维护性至关重要。它有助于我们构建出易于扩展、易于测试、易于维护的软件系统。

🎉六、总结

  依赖倒置原则(DIP)是面向对象设计中的重要原则之一。它强调高层模块应该依赖于抽象而不是具体实现,使得代码更加灵活、可扩展和易于维护。通过定义清晰的抽象层和具体实现层,我们可以降低模块之间的耦合度,提高代码的可复用性和可测试性。

  在实际项目中,我们应该积极应用DIP原则,通过接口或抽象类来定义抽象层,将具体实现细节放在具体实现层中。这样,当具体实现发生变化时,我们只需要修改具体实现层,而无需修改高层模块,从而降低了代码的维护成本。

  同时,我们也应该避免违反DIP原则,以免导致代码紧耦合、难以扩展和测试困难等问题。通过遵循DIP原则,我们可以构建出更加健壮、灵活和可维护的软件系统。

  希望本文的介绍能够帮助你更好地理解依赖倒置原则,并在实际开发中灵活运用。通过不断实践和积累经验,我们可以逐渐提高软件设计的能力,创造出更加优秀和可靠的软件系统。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL索引原理及慢查询优化

背景 MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上…

【话题】2024年AI辅助研发趋势,有那些应用领域

大家好,我是全栈小5,欢迎阅读文章! 此篇是【话题达人】系列文章,这一次的话题是《2024年AI辅助研发趋势》 目录 背景概念实践医药领域汽车设计领域展望未来文章推荐 背景 随着人工智能技术的持续发展与突破,2024年AI辅…

使用CryptoJs对开发中的参数进行加密

场景描述 在开发程序中,我们无时无刻不在接受第三方的一些token,比如我们申请了地图软件的一些定位、导航功能,第三方会给予我们appid还有app secret作为访问他们服务的凭证,大部分时候我们会将求这些登陆凭证放在env文件中&…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数,例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数,在小程序端的时候测试并无问题,但是发行到H5时首页加载会造成参数获取…

怎样基于“用户”思维让内容营销更有效

当下互联网流量见顶,内容已经成为互联网竞争新的制高点,可以说在数字化驱动的新时代下,“内容为王”仍然是真理。然后信息泛滥的时代下,如何让内容营销脱颖而出呢?媒介盒子认为“用户思维”是关键,今天就和…

C/C++中strcpy,strcat,strstr以及strncpy,strncat,strncmp的使用

1、首先我们来介绍strcpy的使用从这个函数的名字来看它应该是属于字符串的拷贝,string copy。 那么这个函数是怎么用的呢?下面我么来介绍她的基本结构。 char * strcpy ( char * destination, const char * source );由上述可知它需要两部分 一个是目标字…

操作系统——进程

1.什么是进程 概念: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度的一个独立单位。 进程是程序的依次执行 进程是一个程序及其数据在处理机上顺序执行时所发生的活动 进程是程序在一个数据集合上运行的过…

[剪藏] - 由哇哈哈和农夫山泉所想到的

哇哈哈和农夫山泉的缠斗最近冒出来一个有趣的点:营销大于内容的胜利。 具体来说是这样的:农夫山泉很多年前做广告,说纯净水没有矿物质,长期喝是不利于人体健康的。农夫还做了个营销的对比实验,大概是用矿泉水养水仙花&…

CMDB在IT管理中的重要性

Configuration Management Database(CMDB)即配置管理数据库,在当前企业的IT运维管理中扮演着重要的角色。CMDB是一个包含了企业所有设备、软件和服务配置信息的中心数据库,通过有效地管理这些配置数据,能够为企业提供全…

AIX7.2下安装mysql5.1.73数据库

首先需要现在AIX版本的mysql安装包以及相关的依赖包 依赖关系deps文件下载地址: Index of /download/rpmdb/deplists/aix72 对应的rpm包下载地址: Index of /download/everything/RPMS 我们需要下载的mysql安装包主要有 mysql-5.1.73-1.ppc mysql…

WanAndroid(鸿蒙版)开发的第五篇

前言 DevEco Studio版本:4.0.0.600 WanAndroid的API链接:玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考: 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

SpringBoot(接受参数相关注解)

文章目录 1.基本介绍2.PathVariable 路径参数获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 3.RequestHeader 请求头获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 4.RequestParameter 请求获取参数信息1.代码实例…

PMP成绩判定标准是什么?

2024年3月10日的PMP考试已经结束,不知道大家考得怎么样,对于考试难度有没有值得分享或者吐槽的?可以发出来大家交流一下~ 一、3月PMP考试成绩什么时候出? 按照往期考试成绩发布时间,基本在考后6-8周会出成绩&#xf…

扩展资料主机名到IP地址的有两种方式:DNS

中国联通的DNS地址有两种。 主 DNS 为“210.21.4.130”,备用 DNS 为“221.5.88.88”。 每个 IP 地址可以有一个主机名。 主机名由一串或多串字符组成。 用小数点分隔字符串。 对于中国联通宽带用户,主DNS设置为:210.21.4.130,备用…

最好的五款骨传导耳机推荐,揭秘几大骨传导耳机选购技巧

骨传导耳机以健康听音的优势,近年来迅速赢得了市场的青睐,并成为蓝牙耳机领域的热门选择。随着其受欢迎程度的提升,市场上也出现了一些质量很差的产品,这些产品音质不佳、佩戴不舒适,甚至可能对用户的听力造成潜在风险…

Python实现BOA蝴蝶优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

权限管理系统-0.4.1

5.4 权限管理前端开发 5.4.1 src/components 新建ParentView文件夹&#xff0c;并在文件夹中新建index.vue文件。 并在index.vue中加入以下内容&#xff1a; <template><router-view /> </template>5.4.2 layout/components/Sidebar/index.vue routes() …

潜水耳机哪个牌子好?潜水党必看的游泳耳机专业性能详解!

在游泳、潜水等水上活动中&#xff0c;一个好的耳机可以让你更加享受水中的乐趣。而随着科技的不断发展&#xff0c;市面上涌现了越来越多的游泳耳机品牌和型号&#xff0c;让人眼花缭乱。 &#xff08;以下是之前测试过的游泳耳机&#xff1a;&#xff09; 那么&#xff0c;潜…

从零开始搭建医保购药APP:技术选择与开发流程

医保购药APP作为一种创新的医疗服务工具&#xff0c;为用户提供了便捷的医保购药流程&#xff0c;同时也为医疗机构提供了更高效的管理和服务方式。今天小编将为大家讲解如何从零开始搭建一款医保购药APP&#xff0c;包括技术选择和开发流程。 一、技术选择 在搭建医保购药APP…

python面向对象的三大特性:封装,继承,多态

1、面向对象有哪些特性 三种&#xff1a;封装性、继承性、多态性 2、Python中的封装 在Python代码中&#xff0c;封装有两层含义&#xff1a; ① 把现实世界中的主体中的属性和方法书写到类的里面的操作即为封装 ② 封装可以为属性和方法添加为私有权限&#xff0c;不能直…