【Python】新手入门学习:详细介绍接口分隔原则(ISP)及其作用、代码示例

news2024/12/25 9:49:49

【Python】新手入门学习:详细介绍接口分隔原则(ISP)及其作用、代码示例
在这里插入图片描述

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

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

🌵文章目录🌵

  • 🔌一、什么是接口分隔原则(ISP)?
  • 🛠️二、ISP原则的作用
  • 📘三、如何实现ISP原则
  • 🔍四、ISP原则在实际项目中的应用
      • 示例一:用户管理系统
      • 示例二:支付系统
      • 示例三:插件式架构
  • 🚫五、违反ISP原则的后果
  • 💡六、总结

🔌一、什么是接口分隔原则(ISP)?

  接口分隔原则(Interface Segregation Principle,简称ISP)是面向对象设计原则中的一条重要原则。其核心思想是:客户端不应该被强制依赖于它们不使用的接口。换句话说,一个类对另一个类的依赖性应当是最小的,或者说,一个接口应该小而完备,只提供客户端真正需要的方法。

  ISP原则鼓励我们将大型的接口拆分成更小、更具体的接口,这样客户端只需要关心它们所感兴趣的接口部分,而不需要被强制实现或依赖它们不需要的方法。这有助于降低类之间的耦合度,提高系统的可维护性和可扩展性。

🛠️二、ISP原则的作用

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

  1. 降低耦合度:通过拆分接口,将不同功能的接口分离,减少了类之间的依赖关系,降低了耦合度。这样,当某个接口发生变化时,只有依赖该接口的类会受到影响,而不会波及到整个系统。

  2. 提高代码的可读性和可维护性:小接口更加专注于单一职责,使得代码更加清晰、易于理解。同时,由于每个接口都相对较小,当需要修改或扩展功能时,可以更加精准地定位到相关的接口和类,降低了维护成本。

  3. 增强系统的灵活性:通过将接口拆分成更小的部分,客户端可以根据需要选择实现或依赖不同的接口组合,从而更加灵活地构建系统。这有助于实现系统的模块化设计和插件式扩展。

📘三、如何实现ISP原则

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

# 定义两个接口,分别对应不同的功能集合
class Readable:
    def read(self):
        pass

class Writable:
    def write(self):
        pass

# 实现Readable接口的类
class TextFile(Readable):
    def read(self):
        return "Reading from a text file..."

# 实现Writable接口的类
class DataStorage(Writable):
    def write(self):
        return "Writing to a data storage..."

# 客户端代码只依赖于它需要的接口
class Client:
    def __init__(self, readable: Readable):
        self._readable = readable

    def process_data(self):
        content = self._readable.read()
        print(f"Processing data: {content}")

# 使用示例
text_file = TextFile()
client = Client(text_file)
client.process_data()  # 输出:Processing data: Reading from a text file...

# 注意:Client类并不依赖于Writable接口,它只依赖于它实际使用的Readable接口。
# 这遵循了接口分隔原则,因为Client类没有被强制依赖于它不需要的接口。

  在这个示例中,我们定义了两个接口:ReadableWritable,它们分别代表读取和写入的功能。TextFile 类实现了 Readable 接口,而 DataStorage 类实现了 Writable 接口。Client 类只依赖于 Readable 接口,并通过构造函数注入一个实现了该接口的对象。因此,Client 类并没有被迫依赖于它不需要的 Writable 接口,这符合ISP原则。

  通过这样设计,我们可以很容易地替换 TextFile 类为其他实现了 Readable 接口的类,而不需要修改 Client 类的代码。同样,如果我们将来需要添加写入功能到 Client 类中,我们可以添加一个新的接口依赖,而不是将现有的接口扩展为更大的接口,从而保持接口的简洁和专注。

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

在实际项目中,ISP原则的应用是广泛而重要的。以下是一些实际场景中ISP原则的应用示例:

示例一:用户管理系统

假设我们正在开发一个用户管理系统,其中包含用户的基本信息、认证信息和订单信息等功能。如果我们将所有这些信息都放在一个大的User接口中,那么任何需要用户基本信息的模块都会被迫实现或依赖整个User接口,包括那些与订单信息无关的模块。

根据ISP原则,我们应该将User接口拆分成多个小接口,如BasicUserInfoAuthenticationInfoOrderInfo等。这样,不同模块可以根据自己的需要选择实现或依赖相应的接口,降低了模块之间的耦合度。

示例二:支付系统

在支付系统中,我们可能需要处理多种支付方式,如信用卡支付、支付宝支付、微信支付等。如果我们将所有支付方式的方法都放在一个大的Payment接口中,那么每个支付处理类都需要实现所有支付方式的方法,即使某些方法并不适用。

遵循ISP原则,我们可以将Payment接口拆分成多个小接口,每个接口对应一种支付方式。这样,每个支付处理类只需要实现它所支持的支付方式对应的接口,减少了代码的冗余和复杂性。

示例三:插件式架构

在构建插件式架构的系统中,ISP原则的应用尤为重要。通过将功能拆分成小接口,我们可以轻松地添加或替换插件,而无需修改核心代码。每个插件只需要实现它所关心的接口,与其他插件保持独立。这种设计使得系统更加灵活和可扩展。

🚫五、违反ISP原则的后果

违反ISP原则会导致一系列不良后果,包括:

  1. 代码冗余和复杂性增加:当大型接口包含大量方法时,实现该接口的类需要处理许多与其职责无关的方法,导致代码冗余和复杂性增加。

  2. 耦合度过高:违反ISP原则会导致类之间的耦合度过高,使得系统难以维护和扩展。当一个接口发生变化时,所有依赖该接口的类都可能受到影响。

  3. 灵活性降低:大型接口限制了客户端的选择和灵活性。客户端无法根据需要选择性地实现或依赖接口的部分功能,而是被迫实现整个接口。

  4. 测试困难:当接口过于庞大且包含多种功能时,测试也变得困难。测试人员需要针对接口中的每个方法进行测试,增加了测试的工作量和复杂度。

  因此,遵循ISP原则对于保持代码的清晰度、灵活性和可维护性至关重要。通过拆分大型接口为多个小接口,我们可以降低耦合度、提高代码的可读性和可测试性,并增强系统的灵活性和可扩展性。

💡六、总结

  接口分隔原则(ISP)是面向对象设计中的重要原则之一,它强调客户端不应该被强制依赖于它们不使用的接口。通过拆分大型接口为多个小接口,我们可以降低类之间的耦合度、提高代码的可读性和可维护性,并增强系统的灵活性和可扩展性。

  在实际项目中,我们应该仔细审查代码库中的接口,识别并拆分那些违反ISP原则的大型接口。通过合理地设计小接口,我们可以使代码更加清晰、易于理解和维护,同时提高系统的可测试性和可扩展性。

  最后,记住ISP原则的核心思想:将接口设计得小而完备,只提供客户端真正需要的方法。这将有助于我们构建出更加健壮、灵活和易于维护的软件系统。

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

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

相关文章

c++中多种类型sort()排序的用法(数组、结构体、pair、vector)

c中多种类型sort排序的用法 一、对数组排序1、默认排序2、自定义排序 二、对结构体进行排序三、对pair进行排序1、默认排序2、自定义排序 四、对vector进行排序1、默认排序2、去重排序3、自定义排序 一、对数组排序 1、默认排序 默认从小到大进行排序 #include <bits/std…

Windows Server 各版本搭建终端服务器实现远程访问(03~19)

一、Windows Server 2003 左下角开始➡管理工具➡管理您的服务器&#xff0c;点击添加或删除角色 点击下一步 勾选自定义&#xff0c;点击下一步 蒂埃涅吉终端服务器&#xff0c;点击下一步 点击确定 重新登录后点击确定 点击开始➡管理工具➡计算机管理&#xff0c;展开本地…

Java算法总结之冒泡排序(详解)

程序代码园发文地址&#xff1a;Java算法总结之冒泡排序&#xff08;详解&#xff09;-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,Java算法总结之冒泡排序&#xff08;详解&#xff09;http://www.byqws.com/blog/3145.html?sourcecsdn 冒泡排序…

网址如何转静态二维码?扫码跳转链接的制作步骤

一般网址想要转换成可以长期使用的二维码&#xff0c;可以通过制作静态码的方式将链接网址转二维码图片使用。这种方式只是将网址从链接的形式转换成二维码的形式&#xff0c;只要添加的网址不失效&#xff0c;那么二维码是可以长期扫码展示内容的&#xff1f;那么如何制作网址…

Mybatis八股

Mybatis是什么 Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;加载驱动、创建连接、创建statement等繁杂的过程&#xff0c;开发者开发时只需要关注如何编写SQL语句&#xff0c;可以严格控制sql执行性能&#xff0c;灵…

学成在线-生成扫码下单接口的二维码同时创建创建商品订单记录和交易支付记录

生成下单接口二维码 界面原型 打开课程支付引导界面&#xff0c;点击支付宝支付按钮商户系统生成下单的二维码接口&#xff0c;用户扫描二维码后商户系统开始请求支付宝下单 用户扫码开始请求支付宝下单&#xff0c;但是在生成下单接口的二维码前前端需要做一些操作 前端调用…

vue项目因内存溢出启动报错

前端能正常启动&#xff0c;但只要一改动就报错启动出错。 解决办法&#xff1a; 安装依赖 npm install cross-env increase-memory-limit 然后再做两件事&#xff1a;在node 在package.json 里的 script 里进行配置 LIMIT是你想分配的内存大小&#xff0c;这里的8192单位…

手势学习

1. 点击手势 Composable fun ClickableSample() {val number remember {mutableStateOf(0)}Text(text number.value.toString(),textAlign TextAlign.Center,modifier Modifier.wrapContentSize().clickable {number.value}.background(Color.LightGray).padding(horizonta…

UE5.2 SmartObject使用实践

SmartObject是UE5新出的一项针对AI的功能&#xff0c;可为开发者提供如公园长椅、货摊等交互对象的统一外观封装&#xff0c;如UE的CitySample&#xff08;黑客帝国Demo&#xff09;中就运用到了SmartObject。 但SmartObject实践起来较为繁琐&#xff0c;主要依赖于AI及行为树…

python爬虫(9)之requests模块

1、获取动态加载的数据 1、在开发者工具中查看动态数据 找到csdn的门户的开发者工具后到这一页面。 2、加载代码 import requests headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36…

iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护

iOS17.4这两天已经正式发布&#xff0c; 在iOS 17.4版本中新增了一个名为"失窃设备保护"的功能&#xff0c;并提供了一个"需要安全延迟"的选项。 iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护 当用户选择启用…

#LLM入门|Prompt#2.8_搭建一个带评估的端到端问答系统

在这一章节中&#xff0c;我们将会构建一个集成评估环节的完整问答系统。这个系统将会融合我们在前几节课中所学到的知识&#xff0c;并且加入了评估步骤。以下是该系统的核心操作流程&#xff1a; 对用户的输入进行检验&#xff0c;验证其是否可以通过审核 API 的标准。若输入…

植物病虫害:YOLO玉米病虫害识别数据集

玉米病虫害识别数据集&#xff1a;玉米枯萎病&#xff0c;玉米灰斑病&#xff0c;玉米锈病叶&#xff0c;粘虫幼虫&#xff0c;玉米条斑病&#xff0c;黄二化螟&#xff0c;黄二化螟幼虫7类&#xff0c;yolo标注完整&#xff0c;3900多张图像&#xff0c;全部原始数据&#xff…

青少年软件编程(图形化)等级考试试卷(三级)

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;三级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 总体情况姓名开始时间结束时间用时(分钟)得分得分率是否通过考试状态xXx2023-03-192023-03-1959.5769.50.7Y已评卷 一、单选题(共25题&#x…

数据结构之树(Topk问题, 链式二叉树)

一.topk问题 取N个数中最大(小)的前k个值,N远大于k 这道题可以用堆的方法来解决,首先取这N个数的前k个值,用它们建堆 时间复杂度O(k) 之后将剩余的N-k个数据依次与堆顶数据进行比较,如果比堆顶数据大,则将堆顶数据覆盖后向下调整 时间复杂度(N-k)*log(N) 总共的时间复杂度…

2024年独立站C端只靠SEO还有机会吗?(川圣SEO)蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 2024年独立站C端只靠SEO还有机会吗&#xff1f;#蜘蛛池SEO 都2024年了&#xff0c;你的外贸独立站推广还需要…

Xilinx 7系列FPGA的配置流程

目录 1.4配置流程 1.4.1 设备上电 ​编辑1.4.2 清除配置寄存器 1.4.3 采样模式引脚 1.4.4 同步 ​编辑1.4.5 检测设备ID ​编辑1.4.6 加载配置数据 1.4.7 CRC校验 1.4.8 启动序列 1.4配置流程 对于所有配置模式&#xff0c;7系列的基本配置流程都是相同的&…

高速USB3.0接口控制器芯片--T630

T630芯片是方寸微电子自主研发的USB3.0超高速控制器&#xff0c;具有功能丰富、性能强劲、扩展性强等特点&#xff0c;可广泛应用于视频采集卡、视频会议摄像头、监控摄像头、数字摄录机、工业照相机、测量和测试设备、医疗成像设备、打印机、扫描仪、指纹采集终端等众多电子产…

记事小本本

记事小本本 实现效果 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

TRANSCEIVER 中的LPM和DFE模块

接收端都使用了通信中常用的LPM和DFE 本质上是高通滤波器&#xff0c;一个是单项被动&#xff0c;而常用的DFE用 了反馈。参见这篇不错的文章。 赛灵思7系列FPGA GT收发器中的RX均衡器_lpm和dfe-CSDN博客