【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例

【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例

在这里插入图片描述

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

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

🌵文章目录🌵

  • 📚一、单一职责原则(SRP)简介
  • 💡二、SRP的重要性
  • 🔧三、如何实现SRP
  • 🔍四、SRP与其他软件设计原则的关系
  • 🚫五、SRP的局限性与挑战
  • 🎉六、总结与展望
  • 🔥结束语
  • 关键词

📚一、单一职责原则(SRP)简介

  单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的基本原则之一。它的核心思想是:一个类应该只有一个引起变化的原因。通俗易懂地说,一个类应该只有一个职责,当需求变化时,这个变化应该只影响一个类,而不是多个类

  单一职责原则有助于提高代码的可维护性和可读性。当类的职责单一时,代码结构更加清晰,易于理解和修改。同时,它也有助于降低类之间的耦合度,提高代码的可重用性。

💡二、SRP的重要性

单一职责原则在软件开发中扮演着至关重要的角色。以下是它的一些主要优势:

  1. 提高代码的可读性:每个类只负责一个职责,使得代码结构清晰,易于理解。
  2. 降低维护成本:当需求发生变化时,只需要修改与变化相关的类,而不需要触动其他无关的类。
  3. 提高代码的可重用性:由于每个类职责单一,因此更容易被其他模块或系统重用。
  4. 减少耦合度:遵循单一职责原则的类之间耦合度更低,使得系统更加灵活和可扩展。

🔧三、如何实现SRP

要实现单一职责原则,我们可以从以下几个方面入手:

  1. 识别类的职责:首先,我们需要仔细分析类的功能,确定其主要职责。一个类应该只关注一个核心功能或业务领域。
  2. 拆分职责:如果发现一个类承担了多个职责,应该将其拆分成多个更小的类,每个类只负责一个职责。
  3. 避免使用大而全的类:大而全的类往往包含了多个职责,导致代码难以维护和理解。我们应该尽量避免创建这样的类。

下面是一个简单的Python代码示例,展示了如何实现单一职责原则。在这个示例中,我们将展示一个订单处理支付流程的简单实现,其中每个类都专注于自己的单一职责。

# 订单类,负责存储订单信息
class Order:def __init__(self, product_name, quantity, price):self.product_name = product_nameself.quantity = quantityself.price = pricedef calculate_total(self):return self.quantity * self.pricedef __str__(self):return f"Order for {self.quantity} of {self.product_name} at {self.price} RMB"# 订单处理类,负责处理订单逻辑(如验证、存储等)
class OrderProcessor:def process_order(self, order):# 这里可以添加订单验证逻辑,例如检查库存、支付状态等print(f"Processing order: {order}")# 假设订单处理成功,返回处理后的订单return order# 支付服务类,负责处理支付逻辑
class PaymentService:def process_payment(self, amount):# 这里可以添加支付逻辑,例如调用支付网关APIprint(f"Processing payment for amount: {amount}")# 假设支付成功,返回支付结果return True# 订单服务类,协调订单处理和支付
class OrderService:def __init__(self, order_processor: OrderProcessor, payment_service: PaymentService):self.order_processor = order_processorself.payment_service = payment_servicedef place_order(self, order):# 处理订单processed_order = self.order_processor.process_order(order)# 计算订单总价total_amount = processed_order.calculate_total()# 处理支付payment_successful = self.payment_service.process_payment(total_amount)if payment_successful:print("Order placed successfully!")else:print("Payment failed, order not placed.")# 使用示例
if __name__ == "__main__":# 创建订单对象order = Order("Book", 2, 50)print(f"Creating order: {order}")# 创建订单处理对象和支付服务对象order_processor = OrderProcessor()payment_service = PaymentService()# 创建订单服务对象,并协调订单处理和支付order_service = OrderService(order_processor, payment_service)order_service.place_order(order)

在这个示例中:

  • Order 类负责存储订单信息,如产品名称、数量和价格,并提供计算总价的方法。
  • OrderProcessor 类负责处理订单逻辑,比如验证订单信息、存储订单等。在这个简单的示例中,它只是打印出正在处理的订单信息。
  • PaymentService 类负责处理支付逻辑。在这个示例中,它只是打印出正在处理的支付金额。
  • OrderService 类是一个协调者,它接收 OrderProcessorPaymentService 的实例,并协调它们来完成整个订单放置流程。它首先处理订单,然后计算总价,并尝试处理支付。

  每个类都专注于自己的单一职责:订单类关注订单信息,订单处理类关注订单处理逻辑,支付服务类关注支付逻辑,而订单服务类则协调整个流程。这样的设计使得代码更加清晰、易于维护和测试。如果未来需要改变订单处理或支付逻辑,我们只需要修改相应的类,而不需要影响其他部分的代码。

🔍四、SRP与其他软件设计原则的关系

单一职责原则与其他软件设计原则密切相关,共同构成了面向对象设计的基石。以下是它与一些常见设计原则的关系:

  1. 开闭原则(OCP):OCP强调软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。遵循单一职责原则的类更容易实现OCP,因为每个类职责单一,更容易进行扩展和修改。
  2. 里氏替换原则(LSP):LSP要求子类必须能够替换其父类,并且替换后不会影响程序的正确性。遵循单一职责原则的类更容易满足LSP,因为它们的职责更加明确和单一。
  3. 依赖倒置原则(DIP):DIP强调高层模块不应该依赖于低层模块,它们都应该依赖于抽象。遵循单一职责原则的类更容易实现抽象和接口的设计,使得系统更加灵活和可维护。

🚫五、SRP的局限性与挑战

虽然单一职责原则在软件设计中具有重要的作用,但它也存在一些局限性和挑战:

  1. 过度拆分:有时候,为了追求单一职责,我们可能会过度拆分类,导致系统中类的数量过多,使得代码结构变得复杂。因此,在拆分类的过程中需要权衡利弊,避免过度拆分。
  2. 职责界定模糊:在实际项目中,有时很难明确界定一个类的职责范围。有些职责可能相互关联,难以完全分离。在这种情况下,我们需要根据项目的实际需求和团队的共识来判断如何拆分和组织类。
  3. 历史遗留问题:对于已经存在的大型系统,引入单一职责原则进行重构可能会面临很大的挑战。这涉及到对现有代码的修改和重构,可能需要投入大量的时间和精力。在这种情况下,我们可以逐步引入单一职责原则,逐步改进代码结构。

🎉六、总结与展望

  单一职责原则是面向对象设计的重要原则之一,它强调一个类应该只有一个引起变化的原因。通过遵循单一职责原则,我们可以提高代码的可读性、可维护性和可重用性,降低类之间的耦合度,使系统更加灵活和可扩展。

  在实际项目中,我们应该注意识别和拆分类的职责,避免创建大而全的类。同时,我们也要认识到单一职责原则的局限性和挑战,在实践中灵活运用,权衡利弊。

  随着技术的不断发展和软件需求的不断变化,单一职责原则的应用也将不断演变和完善。未来,我们可以期待更多的研究和实践来推动单一职责原则在软件设计领域的应用和发展。

  总之,掌握和运用单一职责原则对于提高软件质量和开发效率具有重要意义。希望本文能够帮助新手入门学习者更好地理解和掌握这一原则,并在实际项目中灵活运用。

🔥结束语

  希望这篇博客能够为你带来启示和收获!如果你有任何疑问或建议,请随时留言交流。同时,也欢迎你分享自己的实践经验和心得,让我们一起学习和进步!

关键词

单一职责原则,SRP,Python,代码示例,面向对象设计,软件设计原则,可读性,可维护性,可重用性,耦合度,灵活性,可扩展性,重构,实践应用。

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

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

相关文章

力扣106 从中序与后续遍历序列构造二叉树

文章目录 题目描述解题思路代码 题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], …

海豚调度系列之:认识海豚调度

海豚调度系列之:认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过…

使用 opencv 识别答题卡,生成填涂答案

一般答题卡设计时都在试卷4个角预留4个一样大小的黑块 仅能识别选择题判断题之类的填涂答题的题目,不能识别填空题应用题等其它主观题 使用 opencv 识别试卷图片中所有黑块,再根据黑块大小获取四个角的位置,根据四个黑块位置校正图像 将图…

Ubuntu下txt中文显示乱码问题常规解决方法

在正常使用ubuntu 文档时,突然发现txt文档出现,如下情况 无法正常观看,后来搜了一下发现是gedit 没有对应打开文件的编码格式,Ubuntu用的是utf-8,所以打开会有乱码!初始没有GBK和GB2312,把GBK和GB2312添加…

vi 显示行号 显示色彩

首先进入当前用户目录下的.vimrc文件/.virc文件(具体要看操作系统) vi ~/.virc 显示行号 set number 显示色彩 highlight LineNr guifgred 效果

怎样才能选择一套好的ai智能语音系统呢?人工智能电话机器人系统各版本搭建

如今竞争激烈的市场环境下,企业需要不断创新,提高效率,以获得更多的市场份额和利润。而智能电销机器人,作为一种新型的营销工具,正逐渐成为越来越多企业的首选工具,接下来我们看看怎样才能选择一套好的ai智…

生态碳汇涡度相关监测与通量数据分析

朱老师(副教授):来自国内重点高校,长期从事涡度通量观测与分析研究,发表SCI论文多篇,主持国家与地方科研项目多个,在生态环境数据处理与分析中具有丰富的实践项目经验。 本文基于MATLAB语言、以…

滑动窗口最大值(leetcode hot100)

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输…

2024年初中生古诗文大会备考:多选题真题和独家解析(持续更新)

今天我们继续来做初中古诗文大会的一道难题:多选题,让大家了解初中生古诗文大会的考察内容和形式,并且提供了我独家的题目解析和答案,供初中的同学们学习和参考。 Tips:古诗文大会的许多题目都来自于中考、高考&#…

使用Barrier共享鼠标键盘,通过macos控制ubuntu系统

之前文章写过如何使用barrrier通过windows系统控制ubuntu系统,该文章将详细介绍如何使用barrier通过macos系统控制ubuntu系统 一、macOS安装barrier macOS版本barrier链接 1、双击点开安装包 2、将安装包里的barrier拷贝到macOS的达达->应用程序中 3、在达达…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

(黑马出品_高级篇_03)SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

边框检测在 Python 中的应用

在游戏开发中,我们经常会回使用到边框检测。我们知道,边框检测是计算机视觉中常用的技术,用于检测图像中的边界和轮廓。在Python中,可以使用OpenCV库来实现边框检测。具体是怎么实现的?以下是一个简单的示例代码&#…

深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁

引言 在Java并发编程领域,有效管理对共享资源的访问显得尤为关键。为了保障线程安全,Java虚拟机(JVM)引入了一系列精妙的锁机制,这其中的核心概念就是Java对象头中的MarkWord。本文将详尽解析MarkWord的作用&#xff…

Vue.js+SpringBoot开发考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安调研

3月12日下午,由教育部网络安全教学指导委员会秘书长(专家组组长)封化民、工业和信息化部规划司原司长肖华、中国现代国际关系研究院原副院长张力等领导组成的国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安及湖南欧拉生态创新…

【Python】成功解决NameError: name ‘cv2‘ is not defined

【Python】成功解决NameError: name ‘cv2’ is not defined 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您…

mavon-editor实现支持md格式输入并自定义工具栏

需求说明 起源于我在做机器人报警推送的一个模块时,涉及到可以自定义报警的内容,其中内容支持md格式,同时还支持用户在指定光标处插入指定的字符串占位符。于是我在项目中引入mavon-editor库(支持Vue2、Vue3),以支持用户输入md格…

Maven深入了解

Maven深入了解 前言一、Maven的核心概念1.1 Maven-Jar包模块化管理1.2 POM1.3 坐标及其命名规范1.4 仓库的概念1.5 生命周期1.6 插件和目标 二、依赖管理2.1 自己写的模块和模块之间也可以互相依赖2.2 依赖的生效范围(scope标签)2.3 依赖的传递性2.4 依赖冲突问题2.5 依赖的排除…

Linux——多线程

目录 线程概念 线程控制 线程创建 进程 vs 线程 线程异常 线程等待 线程终止 pthread_cancel 进程替换 线程分离 线程互斥 mutex mutex接口 mutex的理解 互斥锁的实现 可重入和线程安全 死锁 什么是死锁 死锁产生的必要条件 避免死锁 线程同步 概念 条件…

一个悄然崛起的AI开源项目!

众所周知,最近这半年AI相关的话题实在是火到出圈。尤其是生成式AI的流行,让我们普通人也可以近距离地接触和应用AI。这其中最典型的就是ChatGPT。 那除了ChatGPT,还有一个非常实用的领域,也是我们今天要讨论的话题,那…