深入理解设计原则之接口隔离原则(ISP)

news2024/10/6 10:31:10

系列文章目录

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/598525.html

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

相关文章

网络工程师一定要会关键技能:如何进行IP子网划分?

对于所有从事IP网络方面工作的工程师来说,进行IP子网划分操作属于一个必备的关键技能,也属于必须掌握的专业内容;但对于初学者来说,真正理解IP子网划分的概念也是一件相当困难的事情。 怎样才能正确地进行子网划分操作 IP子网划…

影响现代办公室隔断设计的因素有哪些,办公室隔断设计方案要求

影响现代办公室隔断设计的因素有哪些 1. 办公空间的用途和功能要求 2. 员工数量及工作场所的布局 3. 设计风格和企业文化要求 4. 预算和材料选择 5. 环保节能和安全性要求 办公室隔断设计方案要求: 1. 合理利用空间,满足办公室的功能需求 2. 设计…

Creepypastsa VoxEdit 竞赛

召唤所有恐怖都市传闻爱好者。 通过 Creepypasta VoxEdit 竞赛,潜入黑暗领域,并释放你们的创造力!踏入阴森恐怖的神秘世界,把你最可怕的噩梦变成现实! 设计终极的 Creepypasta 体素资产 你是恐怖大师吗?是一…

RHCE 作业三

1.基于域名访问网站 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# systemctl disable firewalld [rootserver ~]# yum install httpd -y [rootserver ~]# systemctl start httpd [rootserver ~]# syst…

npm发包/发布群组过程记录

目录 创建群组 本地发包 1、初始化本地的包到群组 2、 登录npm账号 3、设置公开库 4、发布到npm上 5、升级更新发布 创建群组 打开npm的网站,登录个人账户密码--->点击右侧上方个人的头像--->在下拉框点击【add Organization】 接下来会出现一个添加群…

C语言 打印杨辉三角

杨辉三角的前五行如下&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1、首先我们可以定义定义一个5行5列的二维数组 代码&#xff1a; int main() {int arr[5][5] { 0 };初始化int i 0;int j 0;//循环输出for (i 0; i < 5; i) {for (j 0; j <5; j) {printf("…

华为OD机试之寻找相同子串(Java源码)

寻找相同子串 题目描述 给定一个字符串s&#xff0c;最多只能进行一次变换&#xff0c;返回变换后能得到的最小字符串&#xff08;按照字典序进行比较&#xff09;。 变换规则&#xff1a;交换字符串中任意两个不同位置的字符。 输入描述 一串小写字母组成的字符串s 输出描述 …

华硕天选FA506IU(R7 4600h)电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板华硕天选FA506IU 处理器AMD Ryzen 7 4600h已驱动 内存8GB DDR4 3200MHz已驱动 硬盘东芝 KXG5AZNV256G Windows 10已驱动 显卡集成显卡…

基于MapReduce的京东20年口红数据的分析与实现

基于MapReduce的京东20年口红数据的分析与实现 文章目录 基于MapReduce的京东20年口红数据的分析与实现一、前言二、数据可视化1、安装Python和Flask框架2、创建Flask应用程序3、创建基于Echarts的网页展示代码4、最终结果 三、最后我想说 一、前言 这是一个利用HadoopMapRedu…

Java设计模式(二)

系列文章目录 里氏替换原则 开闭原则 文章目录 系列文章目录前言一、里氏替换原则1.OO中的继承性的思考和说明2.里氏替换原则基本介绍 二、开闭原则1.开闭原则基本介绍 总结 前言 大家好呀&#xff0c;欢迎来到柚子的博客~让我们一起成长吧o(&#xffe3;▽&#xffe3;)ブ 提…

二、浏览器广告屏蔽插件_Adblock Plus

1、浏览器广告 在浏览器浏览内容时&#xff0c;有广告无可厚非&#xff0c;但有些网页做的太过分了。如广告影响了正常网页的浏览&#xff1b;广告内容低俗恶心。特推荐以下浏览器广告屏蔽插件。 2、浏览器广告屏蔽插件 2.1、Adblock Plus 简介 (1)这里推荐Adblock Plus插件…

有哪些代码调试工具推荐? - 易智编译EaseEditing

下面是一些常用的代码调试工具&#xff0c;它们可以帮助开发人员识别和解决代码中的问题&#xff1a; 调试器(Debugger)&#xff1a; 调试器是一种强大的工具&#xff0c;用于在代码执行过程中逐行执行和检查代码。它允许您设置断点、观察变量的值、跟踪函数调用和返回等。 …

通义千悟-阿里通义千问系列

【通义听悟】我发现了一个宝藏产品&#xff0c;推荐给你&#xff5e; https://tingwu.aliyun.com/u/T1YJJcJcc0030c30 工作学习AI助手&#xff0c;依托大模型&#xff0c;为每一个人提供全新的音视频体验。点击链接立即注册&#xff0c;公测期免费体验。 阿里的通义千问系列 …

Spring Boot如何实现分布式任务调度?

Spring Boot如何实现分布式任务调度&#xff1f; 随着互联网的快速发展&#xff0c;越来越多的企业开始将自己的业务迁移到分布式系统中。在这种情况下&#xff0c;分布式任务调度变得尤为重要。对于分布式系统中的每个任务来说&#xff0c;它需要在多个节点上定时执行&#x…

VMware虚拟机最新详细安装保姆级教程(2023年新版教程)

VMware最新详细安装保姆级教程&#xff08;2023年新版教程&#xff09; 大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大…

华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】

一、题目描述 在第一人称射击游戏中&#xff0c;玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位假设玩家每按动一次键盘&#xff0c;游戏任务会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键盘并且…

曾经作为程序员的你为什么不当程序员了?现在在做什么?

去年年底&#xff0c;我把老板开了。因为实在干不下去了。 当时正赶着公司的新产品上线&#xff0c;整个团队都在通宵加班改bug&#xff0c;好不容易才在预定时间内上线&#xff0c;我们都想着能够喘口气了&#xff0c;甚至已经约好了今晚的海底捞&#xff0c;想着请大伙儿搓一…

Go中同/异步与锁的应用~~sync包

Go中锁的实现~~sync包 go中sync包中提供了互斥锁; 在前面Go中channel文章中我们使用了time.Sleep()函数使得main函数的Goroutine阻塞至所有协程Goroutine结束,但这并不是一个很好的办法,因为我们实际应用中并不能准确知道协程什么时候结束(这里面要考虑服务器的性能,网络波动以…

日志脱敏之后,无法根据信息快速定位怎么办?

日志脱敏之殇 小明同学在一家金融公司上班&#xff0c;为了满足安全监管要求&#xff0c;最近天天忙着做日志脱敏。 无意间看到了一篇文章金融用户敏感数据如何优雅地实现脱敏&#xff1f; 感觉写的不错&#xff0c;用起来也很方便。 不过日志脱敏之后&#xff0c;新的问题就…

将Parquet文件的数据导入Hive 、JSON文件导入ES

文章目录 将Parquet文件的数据导入Hive查询parquet文件格式编译cli工具查看元数据信息查询抽样数据 创建hive表 数据存储格式采用parquet加载文件 将json数据导入ESES批量导入api原始json文件内容索引结构重组json脚本重组后的json文件bulk api调用 将Parquet文件的数据导入Hiv…