当前位置: 首页 > news >正文

【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,代码示例,面向对象设计,软件设计原则,可读性,可维护性,可重用性,耦合度,灵活性,可扩展性,重构,实践应用。

相关文章:

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

【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyT…...

【DataWhale学习笔记】使用AgentScope调用qwen大模型

AgentScope AgentScope介绍 AgentScope是一款全新的Multi-Agent框架,专为应用开发者打造,旨在提供高易用、高可靠的编程体验! 高易用:AgentScope支持纯Python编程,提供多种语法工具实现灵活的应用流程编排&#xff…...

【C++】手撕AVL树

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:能直接手撕AVL树。 > 毒鸡汤:放弃自…...

探索 TorchRe-ID--基于 Python 的人员再识别库

导言 人员再识别(re-ID)是计算机视觉中的一项重要任务,在监控系统、零售分析和人机交互中有着广泛的应用。TorchRe-ID 是一个功能强大、用户友好的 Python 库,它为人员再识别任务提供了一套全面的工具和模型。在本文中&#xff0…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Flex)

以弹性方式布局子组件的容器组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。Flex组…...

tmux最基础的一点应用-不用一直挂着ssh,可以干点别的事情

文章目录 使用原因基础命令创建一个窗口退出当前窗口重新进入万一忘记了环境名字想要删除环境 使用原因 跑程序要很久&#xff0c;需要干别的事情&#xff0c;电脑不能一直开&#xff0c;可以使用tmux来管理。 基础命令 创建一个窗口 tmux new -s <你自己起的环境名字&g…...

Java推荐算法——特征加权推荐算法(以申请学校为例)

加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知&#xff0c;推荐算法有很多种&#xff0c;例如&#xff1a; 1.加权推荐&#xff1a;分为简单的特征加权&#xff0c;以及复杂的混合加权。主要…...

探索什么便签软件好用,可以和手机同步的便签软件

在信息技术日新月异的今天&#xff0c;各类数字工具已经成为我们生活与工作的重要助手。便签软件作为一种简单却高效的辅助工具&#xff0c;悄然改变着人们的记录习惯与时间管理方式。而在诸多便签软件中&#xff0c;能够实现手机与电脑同步功能的产品尤显其独特的价值。那么&a…...

字符函数与字符串函数

前言 本次博客可以说内容最为多的一次博客&#xff0c;讲解同样很细致大家好好看看 1字符函数 在讲解字符函数时,大家得了解什么是字符吧 普通字符a b c 1 转义字符 \n 换行‘ \t’ 水平制表符\r回车 大家了解即可 在C语言中字符也可以有分类 所以我们先来看看…...

Kubernetes 项目整体布局 el-container

整体布局整体布局 你可能会去敲不同的项目&#xff0c;有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的&#xff0c;边框架子都是相同的。其实框架是不怎么变化的&#xff0c;变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…...

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…...

unraid docker.img扩容

unraid 弹Docker image disk utilization of 99%&#xff0c;容器下载/更新失败 我的版本是6.11.5&#xff0c;docker.img满了导致容器不能更新&#xff0c;遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来&#xff0c;我已经清理过只清理出来1G多点&…...

Python 实现1~100之间的偶数求和

result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)...

Leetcode 387. First Unique Character in a String

Problem Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1. Algorithm Use two lists: one list is used to count the letters in “s”; the other list is the position where the letter first …...

c++ 自己实现一个迭代器

具体代码 /*自定义迭代器的实现 */ #include <iostream> using namespace std; class num {int val; //具体的数字int length; //数字的位数void calculate_length(){if(val/100){ //这个数字只有1位length1;return;}int x10; //这里就是不断重复除直…...

HarmonyOS NEXT应用开发—图片压缩方案

介绍 图片压缩在应用开发中是一个非常常见的需求&#xff0c;特别是在处理用户上传图片时&#xff0c;需要上传指定大小以内的图片。目前图片压缩支持jpeg、webp、png格式。本例中以jpeg图片为例介绍如何通过packing和scale实现图片压缩到目标大小以内。 效果图预览 使用说明…...

深入理解nginx的请求限速模块[下]

目录 3. 源码分析3.1 配置指令3.1.1 limit_req_zone指令3.1.2 limit_req指令3.1.3 limit_req_dry_run指令3.1.4 limit_req_log_level指令3.1.5 limit_req_status指令3.2 模块初始化3.3 请求处理3.3.1 ngx_http_limit_req_handler3.3.1 ngx_http_limit_req_lookup3.3.2 ngx_http…...

王者归位:Kafka控制器组件解析

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 王者归位&#xff1a;Kafka控制器组件解析 前言控制器组件简介控制器组件的定义和作用&#xff1a;为什么控制器是分布式系统的核心&#xff1f; 保存了什么数据控制器的指定和切换故障转移控制器故障…...

XmlHttpRequest responseType: ‘stream‘ 图片代理服务器

它是一个存在于原生 XMLHttpRequest 对象中的属性。在 Web API 中&#xff0c;XMLHttpRequest 对象用于发送 HTTP 或 HTTPS 请求到服务器&#xff0c;并接收响应。responseType 属性就是用来指定预期从服务器返回的响应数据的类型。 默认值 responseType的默认值为json&#x…...

手写 UE4中的 TArray

#pragma once #include<iostream> #include<stdexcept> #define CHECK_INDEX_RANGE(Index) if (Index > ElementCount) throw std::out_of_range("索引超出界限")template<typename ElementType> class TArray {typedef unsigned int uint; pri…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...