【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):passclass 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 = readabledef 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.mzph.cn/news/741136.shtml

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

相关文章

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

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

<机器学习初识>——《机器学习》

目录 一、人工智能概述 1 人工智能应用场景 2 人工智能发展必备三要素 3 人工智能、机器学习和深度学习 二、人工智能发展历程 1 人工智能的起源 1.1 图灵测试 1.2 达特茅斯会议 2 发展历程 三、 人工智能主要分支 1 主要分支介绍 1.1 分支一:计算机视觉…

linux 启动命令

添加权限 drwxr-xr-x -rwxr-xr-x <strong>第一位&#xff1a;-代表文件&#xff0c;d代表目录<br> 用户、组用户、其他用户都是rwx形式&#xff0c;其中r表示读、w表示写、x表示可执行&#xff0c;-表示没有权限&#xff0c;拿用户组举例&#xff0c;r只能出…

c++中string的模拟实现(超详细!!!)

1.string的成员变量、&#xff08;拷贝&#xff09;构造、析构函数 1.1.成员变量 private:char* _str;size_t _size; //string中有效字符个数size_t _capacity; //string中能存储有效字符个数的大小 1.2&#xff08;拷贝&#xff09;构造函数 //构造函数string(const char* …

【Linux进阶之路】HTTP协议

文章目录 一、基本概念1.HTTP2.域名3.默认端口号4.URL 二、请求与响应1.抓包工具2.基本框架3.简易实现3.1 HttpServer3.2 HttpRequest3.2.1 version13.2.2 version23.2.3 version3 总结尾序 一、基本概念 常见的应用层协议&#xff1a; HTTPS (HyperText Transfer Protocol Sec…

C# 8.0+版本项目 string不可为空

1.在某一次新建项目的时候发现&#xff0c;新建的项目&#xff0c;写的测试接口&#xff0c;接口的入参有string的参数&#xff0c; 但是调用接口的时候string的参数没有传报了400&#xff0c;很奇怪&#xff0c;也没有语法错误之类的。 2.解决办法 在项目上右键->属性->…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Span)

作为Text组件的子组件&#xff0c;用于显示行内文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件从API Version 10开始支持继承父组件Text的属性&#xff0c;即如果子组件未设置…

单片机开发-实现Zigbee的LED灯交替闪烁

前言 前提须知&#xff1a; 1.本文所讲的单片机开发的代码&#xff0c;使用软件是IAR Embedded Workbench&#xff1b; 2.本文所讲的内容与全国职业院校技能大赛“物联网应用开发”赛项Zigbee模块题目类似&#xff1b; 3.单片机Zigbee内容以收入到我的专栏“单片机Zigbee当…

C# 数据结构初始化长度

在C#中&#xff0c;各个数据结构的初始化长度是动态的&#xff0c;下面是一个例子&#xff0c;展示了如何初始化各个数据结构并演示它们的长度&#xff1a; using System; using System.Collections.Generic;class Program {static void Main(){// 初始化数组int[] intArray …

直播美颜SDK的商业化应用:如何为直播平台带来更多商业机会?

直播过程中的自然环境和摄像头本身的限制可能会影响用户的体验&#xff0c;因此直播美颜SDK的商业化应用应运而生&#xff0c;它为直播平台带来了更多商业机会。 直播美颜SDK是一种集成在直播平台中的软件开发工具包&#xff0c;它能够对直播过程中的视频流进行实时的美颜处理…

双指针算法———C++

首先说明双指针&#xff0c;何为双指针顾名思义就是序列中有两个指针来分别配合调控遍历这序列。 与其生硬讲解&#xff0c;不如举个例子。 例题&#xff1a;给定一段序列&#xff0c;里面有一些单词&#xff0c;并且每个单词都是以空格隔开。 题目要求是将每个单词为一行重…

WPF制作带图标和文字的按钮模板(通过附件属性实现)

1.界面模板代码部分 <Window.Resources><Style x:Key"IconButton" TargetType"Button"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"Button"><Border x:Name"borde…

算法D45 | 动态规划7 | 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 这道题目 爬楼梯之前我们做过&#xff0c;这次再用完全背包的思路来分析一遍 代码随想录 Python: 翻译成背包问题&#xff0c;即&#xff1a;在容量为n的背包里&#xff0c;装入重量为1/2的物品&#xff0c;可以重复利用物品&#x…

快速安装mysql 5.7 服务步骤(包含clinet)及常见问题

1、centos上如何安装MySQL&#xff1a; 1.1.下载并安装mysql yum Repo&#xff1a; # 下载 wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm # 安装 rpm -ivh mysql57-community-release-el7-9.noarch.rpm 1.2.进入yum.repos.d目录&#xff0c;安…

C语言每日一题(63)复写零

题目链接 力扣网 1089 复写零 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不…

【C++ Primer Plus学习记录】简单文件输入/输出

有时候&#xff0c;通过键盘输入并非最好的选择。例如&#xff0c;假设您编写了一个股票分析程序&#xff0c;并下载了一个文件&#xff0c;其中包含1000种股票的价格。在这种情况下&#xff0c;让程序直接读取文件&#xff0c;而不是手工输入文件中所有的值&#xff0c;将方便…

惬意了解 —— 前端发展史

下拉底部&#xff0c;参与投票&#xff5e;&#xff5e; 前端发展史&#xff1a;从洪荒时代到现代 前端开发已经走过了将近20年的历程&#xff0c;从最早的纯静态页面到如今的现代前端框架&#xff0c;我们见证了前端技术的蓬勃发展。让我们一起回顾这段历史。 洪荒时代&…

深入联合文件系统

Union File System&#xff08;联合文件系统&#xff0c;UnionFS&#xff09;是一种轻量级的高性能分层文件系统&#xff0c;它支持将文件系统中的修改信息作为一次提交&#xff0c;并层层叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下&#xff0c;应用看到的…

2024年A特种设备相关管理(锅炉压力容器压力管道)证考试题库及A特种设备相关管理(锅炉压力容器压力管道)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;证考试题库及A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#…

【天池课堂】零基础入门数据挖掘-课程汇总

写在前面&#xff1a; 如果你现在很迷茫&#xff0c;但是又对数据挖掘感兴趣&#xff0c;建议先看看以下两个视频直播&#xff0c;两位大佬亲身讲述自己和数据挖掘的前世今生。 《如何入门数据挖掘竞赛》 鱼遇雨欲语与余。天池明星选手&#xff0c;武汉大学硕士&#xff0c;天…