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

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

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

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

相关文章

Postman请求API接口测试步骤和说明

Postman请求API接口测试步骤 本文测试的接口是国内数智客(www.shuzike.com)的API接口手机三要素验证,验证个人的姓名,身份证号码,手机号码是否一致。 1、设置接口的Headers参数。 Content-Type:applicati…

三防手机与普通手机的区别在哪里?

一、三防手机和普通手机主要的区别在于其防护性能,它们是针对不同环境和使用场景设计的。三防手机一般包括防水、防尘和防摔三个方面的特点,而普通手机则往往没有这些特点。 防水性能。三防手机的防水性能通常比普通手机更强大。三防手机可以在一定程度上…

【XR806开发板试用】简单移植coremark并测试实际跑分

前言 首先,拿到板子的时候,由于xr806它是个IOT的片子,所以自然而然必然,在预想里就会有很多大佬会把文章出发点考虑在wifi/bt,各种物联网/WEB应用上。那么怎么另辟蹊径回避这个热点又体现出XR806的特色呢,…

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的条形码二维码检测系统(深度学习+UI界面+训练数据集+Python代码)

摘要:在物流和制造业中,开发一套高效的条形码与二维码识别系统显得尤为关键。本博文深入探讨了如何利用深度学习技术打造出一套先进的条形码及二维码检测系统,并且提供了一套完整的实施方案。该系统搭载了性能卓越的YOLOv8算法,并…

[LeetCode][LCR 175]计算二叉树的深度

题目 计算二叉树的深度 某公司架构以二叉树形式记录,请返回该公司的层级数。 示例 1: 输入:root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出:4 解释: 上面示例中的二叉树的最大深度是 4,沿…

【BI-Dataease】dataease设计思路

参考:https://juejin.cn/post/7089310768671227940 1、BI可视化工具的关键问题是什么? (1)各种数据源的数据结构和类型如何统一? (2)各种图表的配置属性不一致,属性如何绑定到数据…

【C++庖丁解牛】实现string容器的增删查改 | string容器的基本接口使用

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言📖push_b…

关于stm32(CubeMX+HAL库)的掉电检测以及flash读写

1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数,我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …

蓝桥杯2023年第十四届省赛真题-与或异或

一共10个电门&#xff0c;穷举310次 #include<stdio.h> #include<math.h> int main(){int a[5][5], max (int)pow(3, 10), t, op, count 0;a[0][0] a[0][2] a[0][4] 1;a[0][1] a[0][3] 0;for(int k 0; k < max; k){t k;for(int i 1; i < 5; i){fo…

vite ssr服务端渲染

阅读 Vue文档 这一章里有说过&#xff0c;vue是支持服务端渲染的。 通过createSSRApp创建vue组件实例&#xff0c;并使用renderToString将在服务器渲染好template并返回字符串结构&#xff0c;通过替换占位字符将渲染好的字符串输出到html上&#xff0c;这样的一个过程就实现了…

发送短信验证码

​​​​​​【短信验证码-快速报备签名】三网短信接口-短信-短信验证码-短信服务-三网短信接口-短信-三网短信【最新版】_商业智能_电商_金融-云市场-阿里云阿里云云市场提供 专注企业短信服务10年运营与技术积累&#xff0c;稳定、安全、快速。服务&#xff0c;建站服务&…

【word技巧】word文件如何设置打开密码?可以试试这两种方法!

Word文件想要设置密码打开文件&#xff0c;我们可以给文件设置一个打开密码&#xff0c;这样只有知道密码的人才能够打开查看文件&#xff0c;今天分享两个word文件设置打开密码的方法。 一、 打开word文档后&#xff0c;点击【文件】-【信息】-【保护文档】这里有很多选项&a…

excel统计分析——一元直线回归

参考资料&#xff1a;生物统计学 两个具有因果关系的协变量如果呈直线关系&#xff0c;可以用直线回归模型来分析两个变量的关系。直线回归&#xff08;linear regression&#xff09;是回归分析中最简单的类型&#xff0c;建立直线回归方程并经检验证明两个变量存在直线回归关…

Altium Designer怎么设置默认原理图纸张大小

Altium Designer怎么设置默认原理图纸张大小 绘制原理图时我们需要设置好原理图图纸大小&#xff0c;建议大家可以将默认原理图图纸设置为A3&#xff0c;A3图纸大小可以容纳下大部分原理图&#xff0c;这样就不用每次画原理图前去修改图纸大小&#xff0c;可以提高设计效率。 …

Redis底层数据结构之Hash

文章目录 1. Redis底层hash编码格式2. Redis 6源码分析3. Redis 7源码分析 1. Redis底层hash编码格式 在redis6中hash的编码格式分别是ziplist&#xff08;压缩列表&#xff09;和hashtable&#xff0c;但在redis7中hash的编码格式变为了listpack&#xff08;紧凑列表&#xf…

如何不依赖Unity直接解压unitypackage的内容

使用场景 我们都知道unity的资源导出是导出成.unitypackage文件,如果要里面的内容,得打开Unity,将unitypackage导入进去才能看到里面的内容。 但是很多时候我们下了几十个unitypackage资源包,又不清楚好不好用,而且导入之后编译特别慢,unity又不提供批量解压的功能,所…

好消息!电商平台订单API同步订单详情信息免申请审核调用指南!

淘宝开放平台订单类API 测试key获取 拼多多开放平台订单API列表 custom-自定义API操作 taobao.custom/pinduoduo.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&…

day08-Mybatis入门

MyBatis 是一款优秀的 持久层 框架&#xff0c;用于简化 JDBC 的开发。 官网&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 一、快速入门 1.1 Mybatis 操作数据库的步骤 准备工作(创建 springboot 工程、数据库表 user、实体类 User)引入 Mybatis 的相关依赖&…

基于Qt 和python 的自动升级功能

需求&#xff1a; 公司内部的一个客户端工具&#xff0c;想加上一个自动升级功能。 服务端&#xff1a; 1&#xff0c;服务端使用python3.7 &#xff0c;搭配 fastapi 和uvicorn 写一个简单的服务&#xff0c;开出一个get接口&#xff0c;用于客户端读取安装包的版本&#…