深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

news2024/11/23 19:28:37

系列文章目录

C++高性能优化编程系列
深入理解软件架构设计系列
深入理解设计模式系列
高级C++并发线程编程

LSP:接口隔离原则

  • 系列文章目录
  • 1、接口隔离原则的定义和解读
  • 2、案例解读
  • 3、如何判断一个接口是否符合接口隔离原则?
  • 小结

1、接口隔离原则的定义和解读

Robert Martin在SOLID原则中是这样定义接口隔离原则(Interface Segregation Principle, ISP)的:客户端不应该被强迫依赖它不需要的接口。其中含义的客户端可以被理解为接口的调用者和使用者。
实际上,接口这个词汇可以应用在软件开发的很多场合中。接口既可以看作一组抽象的约定,又可以具体指系统之间相互调用的API,还可以特指面向对象编程语言中的接口等。对于接口隔离原则中的接口

2、案例解读

在这里插入图片描述

图1:接口隔离原则
图1所描绘的应用中,由多个用户操作OPS类。现在,假设User1只需要使用op1,User2只需要使用op2,User3只需要使用op3。

在这种情况下,那么很明显,User1虽然不需要调用op2、op3,但在源代码层次上也与它们形成了依赖关系。这种依赖意味着我们对OPS代码中op2所做的任何修改,即使不会影响到User1的功能,也会导致他需要被重新编译和部署。

这个问题可以通过将不同的操作隔离成接口来解决,具体实现如图2所示。

那么现在User1的源代码会依赖U1Ops和op1,但不会依赖于OPS。这样一来,我们之后对OPS做的修改只要不影响到User1的功能,就不需要重新编译和部署

任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦。

在这里插入图片描述

图2:接口隔离

3、如何判断一个接口是否符合接口隔离原则?

判断一个接口是否符合接口隔离原则可以从以下几个方面考虑:

  1. 接口的功能是否单一。接口应该只包含必需的方法,不应该包含无用或冗余的方法。
  2. 接口的职责是否清晰。接口应该只包含与其职责相关的方法,而与其职责无关的方法应该放到其他接口中。
  3. 接口的依赖是否合理。一个接口不应该依赖于它不需要的方法,它的依赖应该被限制在最小范围内。
  4. 接口的稳定性是否高。如果一个接口经常发生变化,那么其它使用该接口的类也需要随之改变,这将增加系统的维护成本。

总的来说,接口隔离原则的核心思想是“高内聚、低耦合”,即一个接口应该具有高内聚性,同时与其它接口的耦合应该尽可能地减少。

小结

依赖反转原则和接口隔离原则区别:

依赖反转原则是指高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现,而具体实现应该依赖于抽象。简单来说,就是要依赖于抽象,而不是具体实现。

接口隔离原则是指一个类对另一个类的依赖应该建立在最小的接口上。这个原则的目的是避免一个类依赖另一个类的不需要的接口,从而减少耦合性,提高灵活性和可维护性。

这两个原则有相似之处,都是通过减少类之间的依赖关系,从而提高软件的复杂性和可维护性。依赖倒置原则关注的是高层模块和底层模块之间的依赖关系,而接口隔离原则则关注的是类与类之间的依赖关系。两个原则相互补充,都是软件设计中非常重要的原则。

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

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

相关文章

CVPR 2023 医学图像分割论文大盘点

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>【医学图像分割】微信交流群 被催了很久,CVer 正式开启 CVPR 2023 论文大盘点系列!Amusi 一共搜集了13篇医学图像分割论文,这应该是目前各…

HTML 5中的文件处理之FileAPI

在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅 长的处理之一。但文件处理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/Acti…

GPT国内的一些产品真的比国外的差吗?(篇幅较长,请收藏)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 本次讨论的话题仅限于计算机视觉研究院个人观点,若有说的不对的地方勿喷,有…

k8s之docker-扩展知识(八)

一.Docker的应用场景 Web 应用的自动化打包和发布。 自动化测试和持续集成、发布。 在服务型环境中部署和调整数据库或其他的后台应用。 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 二.Docker 的优点 Docker 是一个用于开发&#…

【ChatGPT】Mr. Ranedeer:可定制个性化学习体验的 GPT-4 AI 导师提示

Mr. Ranedeer AI Tutor是一个可定制的提示,为具有不同需求和兴趣的用户提供个性化的学习体验。它使用GPT-4来释放AI的潜力,并允许您调整知识深度以匹配您的学习需求,自定义学习风格,沟通类型,语气和推理框架 。 当您使…

ISO21434 组织网络安全管理(二)

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 4.1 网络安全治理 4.2 网络安全文化 4.3 信息共享 4.4 管理系统 4.5 工具管理 4.6 信息安全管理 4.7 组织网络安全审计 五、输出 一、概述 为了实现网络安全工程,该…

自动驾驶TPM技术杂谈 ———— 车辆分类

文章目录 机动车规格机动车结构机动车使用性质机动车和挂车分类接近角定义离去角定义纵向通过角定义离地间隙定义前后轴之间的离地间隙轴下离地间隙 机动车规格 机动车规格分类 分类 说明 汽车 载客汽车 大型 车长大于或等于 6000mm 或者乘坐人数大于或等于20 人的载客汽车。 …

【微信小程序开发】第 4 节 - 创建小程序项目

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、点击 “加号” 按钮 3、项目创建完成 4、在模拟器上查看项目效果 5、在真机上预览项目效果 6、主页面的 5 个组…

安卓调试|一文归纳总结adb调试工具常规命令

欢迎关注「全栈工程师修炼指南」公众号 点击 👇 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! “ 花开堪折直须折,莫待无花空折枝。 ” 作者主页:[ https://www.weiyigeek.top ] 博客&…

FPGA PAL视频BT656解码Video Processing Subsystem去隔行工程源码 TW2867采集4路视频拼接输出 提供技术支持

目录 1、前言2、我这里已有的PAL视频解码方案3、模拟视频概述4、模拟视频颜色空间5、逐行与隔行6、BT656数据与解码BT656数据格式BT656数据解码 7、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析 8、设计思路与框架9、vivado工程详解Block Design设计SDK设计…

chatgpt赋能python:Python奇偶数求和方法详解

Python奇偶数求和方法详解 在日常的编程开发中,经常需要对数字进行分类求和,其中“奇偶数求和”更是最常见的问题之一。而Python作为一种高效、可靠的编程语言,其在求解奇偶数的优秀性能备受瞩目。接下来本篇文章将详细介绍Python奇偶数求和…

Redis为什么会这么快?Redis到底有多快?

文章目录 一、redis到底有多快?二、redis为什么这么快1、内存存储(1)虚拟存储器(虚拟内存Virtual Memory)(2)用户空间和内核空间 2、单线程(1)进程切换(上下文…

Flutter 小技巧之 3.10 全新的 MediaQuery 优化与 InheritedModel

关于 MediaQuery 我们介绍过不少,比如在之前的《MediaQuery 和 build 优化你不知道的秘密》里就介绍过,要慎重在 Scaffold 之外使用 MediaQuery.of(context) ,这是因为 MediaQuery.of 对 BuildContext 的绑定可能会导致一些不必要的性能开销&…

vue项目仿企业微信移动端(带聊天界面)

网上比较知名的网站或者软件,开源代码中都有仿其前端的。比如小米商城,京东商城,仿微信聊天页面诸如此类的。所以我潜意识觉得像那种知名公司或者软件。想找它的仿前端静态代码应该很好找。结果,当我想找仿企业微信移动端的前端静…

springboot+vue住房分配管理系统vue

本城镇保障性住房管理系统管理员,用户。管理员功能有个人中心,用户管理,房屋类型管理,房源信息管理,房源申请管理,住房分配管理,留言板管理,系统管理等。因而具有一定的实用性。 本…

c++11 标准模板(STL)(std::bitset)(四)

定义于头文件 <bitset> template< std::size_t N > class bitset; 类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作位集&#xff0c;并将它与字符串和整数相互转换。 bitset 满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssign…

华为OD机试真题 Java 实现【矩阵稀疏扫描】【2023 B卷 100分】,附详细解题思路

一、题目描述 如果矩阵中的许多系数都为零&#xff0c;那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省&#xff0c;并且在许多大的实践中都会出现矩阵稀疏的问题。 给定一个矩阵&#xff0c;现在需要逐行和逐列地扫描矩阵&#xff0c;如果某一…

使用阿里云免费Serverless函数计算产品资源安装 Stable Diffusion

喜欢用 Stable Diffusion 的小伙伴注意了&#xff01;上一篇介绍了使用谷歌的 Colab 免费资源来安装这个画图神器。 但因为资源是免费的&#xff0c;高峰时期有可能会被谷歌断掉服务的连接&#xff0c;像周末这种使用高峰&#xff0c;GPU 的资源得不到保证。 没关系&#xff0c…

WPF开发txt阅读器:需求分析和文件读写

文章目录 需求分析读取文本文件保存文本文件 需求分析 尽管现在比较主流的阅读格式已经是epub, modi之类的&#xff0c;但txt的使用范围要远比前两者广泛&#xff0c;所以做一个txt阅读器还是有必要的。 但是对于书籍阅读而言&#xff0c;纯文本不包含目录信息&#xff0c;这…

chatgpt赋能python:Python奇数偶数判断:从基础语法到优化运行

Python奇数偶数判断&#xff1a;从基础语法到优化运行 Python是一门简单易学的编程语言&#xff0c;并且在科学计算、数据处理和人工智能等领域都有广泛的应用。在Python中&#xff0c;判断一个数是奇数还是偶数是一个基础问题&#xff0c;本文将介绍Python中奇数偶数的判断方…