【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的重要性
单一职责原则在软件开发中扮演着至关重要的角色。以下是它的一些主要优势:
- 提高代码的可读性:每个类只负责一个职责,使得代码结构清晰,易于理解。
- 降低维护成本:当需求发生变化时,只需要修改与变化相关的类,而不需要触动其他无关的类。
- 提高代码的可重用性:由于每个类职责单一,因此更容易被其他模块或系统重用。
- 减少耦合度:遵循单一职责原则的类之间耦合度更低,使得系统更加灵活和可扩展。
🔧三、如何实现SRP
要实现单一职责原则,我们可以从以下几个方面入手:
- 识别类的职责:首先,我们需要仔细分析类的功能,确定其主要职责。一个类应该只关注一个核心功能或业务领域。
- 拆分职责:如果发现一个类承担了多个职责,应该将其拆分成多个更小的类,每个类只负责一个职责。
- 避免使用大而全的类:大而全的类往往包含了多个职责,导致代码难以维护和理解。我们应该尽量避免创建这样的类。
下面是一个简单的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
类是一个协调者,它接收OrderProcessor
和PaymentService
的实例,并协调它们来完成整个订单放置流程。它首先处理订单,然后计算总价,并尝试处理支付。
每个类都专注于自己的单一职责:订单类关注订单信息,订单处理类关注订单处理逻辑,支付服务类关注支付逻辑,而订单服务类则协调整个流程。这样的设计使得代码更加清晰、易于维护和测试。如果未来需要改变订单处理或支付逻辑,我们只需要修改相应的类,而不需要影响其他部分的代码。
🔍四、SRP与其他软件设计原则的关系
单一职责原则与其他软件设计原则密切相关,共同构成了面向对象设计的基石。以下是它与一些常见设计原则的关系:
- 开闭原则(OCP):OCP强调软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。遵循单一职责原则的类更容易实现OCP,因为每个类职责单一,更容易进行扩展和修改。
- 里氏替换原则(LSP):LSP要求子类必须能够替换其父类,并且替换后不会影响程序的正确性。遵循单一职责原则的类更容易满足LSP,因为它们的职责更加明确和单一。
- 依赖倒置原则(DIP):DIP强调高层模块不应该依赖于低层模块,它们都应该依赖于抽象。遵循单一职责原则的类更容易实现抽象和接口的设计,使得系统更加灵活和可维护。
🚫五、SRP的局限性与挑战
虽然单一职责原则在软件设计中具有重要的作用,但它也存在一些局限性和挑战:
- 过度拆分:有时候,为了追求单一职责,我们可能会过度拆分类,导致系统中类的数量过多,使得代码结构变得复杂。因此,在拆分类的过程中需要权衡利弊,避免过度拆分。
- 职责界定模糊:在实际项目中,有时很难明确界定一个类的职责范围。有些职责可能相互关联,难以完全分离。在这种情况下,我们需要根据项目的实际需求和团队的共识来判断如何拆分和组织类。
- 历史遗留问题:对于已经存在的大型系统,引入单一职责原则进行重构可能会面临很大的挑战。这涉及到对现有代码的修改和重构,可能需要投入大量的时间和精力。在这种情况下,我们可以逐步引入单一职责原则,逐步改进代码结构。
🎉六、总结与展望
单一职责原则是面向对象设计的重要原则之一,它强调一个类应该只有一个引起变化的原因。通过遵循单一职责原则,我们可以提高代码的可读性、可维护性和可重用性,降低类之间的耦合度,使系统更加灵活和可扩展。
在实际项目中,我们应该注意识别和拆分类的职责,避免创建大而全的类。同时,我们也要认识到单一职责原则的局限性和挑战,在实践中灵活运用,权衡利弊。
随着技术的不断发展和软件需求的不断变化,单一职责原则的应用也将不断演变和完善。未来,我们可以期待更多的研究和实践来推动单一职责原则在软件设计领域的应用和发展。
总之,掌握和运用单一职责原则对于提高软件质量和开发效率具有重要意义。希望本文能够帮助新手入门学习者更好地理解和掌握这一原则,并在实际项目中灵活运用。
🔥结束语
希望这篇博客能够为你带来启示和收获!如果你有任何疑问或建议,请随时留言交流。同时,也欢迎你分享自己的实践经验和心得,让我们一起学习和进步!
关键词
单一职责原则,SRP,Python,代码示例,面向对象设计,软件设计原则,可读性,可维护性,可重用性,耦合度,灵活性,可扩展性,重构,实践应用。
相关文章:
【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例
【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyT…...
【DataWhale学习笔记】使用AgentScope调用qwen大模型
AgentScope AgentScope介绍 AgentScope是一款全新的Multi-Agent框架,专为应用开发者打造,旨在提供高易用、高可靠的编程体验! 高易用:AgentScope支持纯Python编程,提供多种语法工具实现灵活的应用流程编排ÿ…...
【C++】手撕AVL树
> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:能直接手撕AVL树。 > 毒鸡汤:放弃自…...
探索 TorchRe-ID--基于 Python 的人员再识别库
导言 人员再识别(re-ID)是计算机视觉中的一项重要任务,在监控系统、零售分析和人机交互中有着广泛的应用。TorchRe-ID 是一个功能强大、用户友好的 Python 库,它为人员再识别任务提供了一套全面的工具和模型。在本文中࿰…...
鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Flex)
以弹性方式布局子组件的容器组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。Flex组…...
tmux最基础的一点应用-不用一直挂着ssh,可以干点别的事情
文章目录 使用原因基础命令创建一个窗口退出当前窗口重新进入万一忘记了环境名字想要删除环境 使用原因 跑程序要很久,需要干别的事情,电脑不能一直开,可以使用tmux来管理。 基础命令 创建一个窗口 tmux new -s <你自己起的环境名字&g…...
Java推荐算法——特征加权推荐算法(以申请学校为例)
加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知,推荐算法有很多种,例如: 1.加权推荐:分为简单的特征加权,以及复杂的混合加权。主要…...
探索什么便签软件好用,可以和手机同步的便签软件
在信息技术日新月异的今天,各类数字工具已经成为我们生活与工作的重要助手。便签软件作为一种简单却高效的辅助工具,悄然改变着人们的记录习惯与时间管理方式。而在诸多便签软件中,能够实现手机与电脑同步功能的产品尤显其独特的价值。那么&a…...
字符函数与字符串函数
前言 本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看 1字符函数 在讲解字符函数时,大家得了解什么是字符吧 普通字符a b c 1 转义字符 \n 换行‘ \t’ 水平制表符\r回车 大家了解即可 在C语言中字符也可以有分类 所以我们先来看看…...
Kubernetes 项目整体布局 el-container
整体布局整体布局 你可能会去敲不同的项目,有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的,边框架子都是相同的。其实框架是不怎么变化的,变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…...
AI赋能写作:AI大模型高效写作一本通
❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…...
unraid docker.img扩容
unraid 弹Docker image disk utilization of 99%,容器下载/更新失败 我的版本是6.11.5,docker.img满了导致容器不能更新,遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来,我已经清理过只清理出来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应用开发—图片压缩方案
介绍 图片压缩在应用开发中是一个非常常见的需求,特别是在处理用户上传图片时,需要上传指定大小以内的图片。目前图片压缩支持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控制器组件解析
欢迎来到我的博客,代码的世界里,每一行都是一个故事 王者归位:Kafka控制器组件解析 前言控制器组件简介控制器组件的定义和作用:为什么控制器是分布式系统的核心? 保存了什么数据控制器的指定和切换故障转移控制器故障…...
XmlHttpRequest responseType: ‘stream‘ 图片代理服务器
它是一个存在于原生 XMLHttpRequest 对象中的属性。在 Web API 中,XMLHttpRequest 对象用于发送 HTTP 或 HTTPS 请求到服务器,并接收响应。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…...
Flink实时写Hudi报NumberFormatException异常
Flink实时写Hudi报NumberFormatException异常 问题描述 在Flink项目中,针对Hudi表 xxxx_table 的 bucket_write 操作由于 java.lang.NumberFormatException 异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报…...
Dataset与DataLoader、transform
文章目录 1、Dataset2、DataLoader2.1 参数详解2.1.1 num_works2.1.2 pin_memory2.1.3 collate_fn 3、图像增强4、重写transform 1、Dataset 在 PyTorch 中,如果要创建自定义的数据集(Dataset),通常会继承 torch.utils.data.Data…...
海豚调度系列之:认识海豚调度
海豚调度系列之:认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过…...
MateBook 14s 2023款 集显 触屏(HKFG-16)原厂Win11系统
HUAWEI华为MateBook14s笔记本电脑2023款原装Windows11,恢复出厂开箱状态系统下载 适用型号:HKFG-XX、HKFG-16、HKFG-32 链接:https://pan.baidu.com/s/1GBPLwucRiIup539Ms2ue0w?pwdfm41 提取码:fm41 原厂系统自带所有驱动、…...
zookeeper快速入门(合集)
zookeeper作为一个分布式协调框架,它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外,它还能够提供更多的功能,但是对于入门来说,看这一篇就够了。后续会讲zookeeper的架构设计与原理,比如zookee…...
鸿蒙App开发学习 - TypeScript编程语言全面开发教程(上)
背景 根据鸿蒙官方的说明: ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前&#…...
Java语言: JVM
1.1 内存管理 1.1.1 JVM内存区域 编号 名字 功能 备注 1 堆 主要用于存放新创建的对象 (所有对象都在这里分配内存) jdk1.8之后永久代被替换成为了元空间(Metaspace) 2 方法区(加、常、静、即) 被虚拟机加载的类信息(版本、字段、方法、接口…...
下拉树级带搜索功能
可以直接复制粘贴到自己的项目里,方法处把接口替换一下 <template><div><el-popoverplacement"bottom"width"200"trigger"click"><el-inputslot"reference"class"mrInput":placeholder"placehol…...
【数组、字符串】算法例题
每个题的【方法1】是自己的思路,【其他方法】是力扣上更优的解题思路 目录 一、数组、字符串 1. 合并两个有序数组 ① 2. 移除元素 ① 3. 删除有序数组中的重复项 ① 4. 删除有序数组中的重复项 II ② 5. 多数元素 ① 6. 轮转数组 ② 7. 买卖股票的最佳时机…...
docxTemplater——从word模板生成docx文件
官网文档:Get Started (Browser) | docxtemplater 官网在线演示:Demo of Docxtemplater with all modules active | docxtemplater 源码:https://github.com/open-xml-templating/docxtemplater 不仅可以处理word(免费…...
番禺网站开发哪家好/抖音搜索关键词排名
综述 Ubuntu分辨率只有一个分辨率 当然xrandr也没法修改 看上去很难受 解决方法 sudo apt install nvidia-cuda-tookit...
重庆网站推广转化率/百度首页关键词推广
正文共:3689 字 2 图。预计阅读时间: 10 分钟。主要内容:C语言关键字详解,void和sizeof.什么是关键字关键字是系统定义的,具有特定含义、专门用于特定用途的C语言标识符,也称为保留字。关键字一般为小写字母…...
网站建设套餐报价/如何写软文
记得第一次接触数据透视表还是在2013年在名古屋SAP项目组,觉得有点难以驾驭(没用过),旁边的SAP顾问似乎有点鄙视我的感觉。 后来,工作中需要维护透视表,慢慢的多了一些了解。 数据透视表(Pivo…...
正常做网站多少钱/阿里指数官网最新版本
点击蓝字关注我们以自然资源部第二海洋研究所卫星海洋环境动力学国家重点实验室作为依托单位,由陈大可院士任首席的国家自然科学基金委重大项目“ENSO的变异机理和可预测性研究”(41690120)研发的ENSO多模式集合预报系统取得重要进展,目前系统已完成测试…...
优质的网站建设/济宁百度推广公司
wordpress响应慢在WordPress实时图形系列的最后一部分中,我将介绍样式化Flot图形的细节。 我无法忍受给你一个丑陋的孩子的想法! 我只是没有它。 因此,我们将研究如何充分利用Flot工具,并深入了解如何为Flot图表打上烙印…...
郑州市公司网站开发设计/正规排名网站推广公司
老李分享:robotium常用API robotium常用API Robotium中最重要的类Solo类:其中提供了模拟用户活动的点击、搜索、拖拽等方法。 英文api(经常断开连接打不开):http://www.jarvana.com/jarvana/view/com/jayway/android/robotium/robotium-solo/2.0.1/robot…...