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

2023-11-04

系列文章目录

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

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. 接口的稳定性是否高。如果一个接口经常发生变化,那么其它使用该接口的类也需要随之改变,这将增加系统的维护成本。

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

小结

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Xamarin 测试记录器选项有错误。无法记录自动化测试

    选项 gt Xamarin gt Xamarin Test Recorder 中的所有设置都有错误 我的桌面上安装了 Visual Studio 2015 企业版 以及 Xamarin 和 Xamarin Test Recorder 插件
  • 如何从对Web服务发出的请求中获取客户端IP地址

    我的 IIS 中托管有一个 Web 服务 当客户端直接使用我的服务时 我需要找出客户端 IP 地址 like http MyIpAddress MyApplication MyWebServiceClass asmx http MyIpAd
  • 从 unsigned char* 到 char* 的转换无效

    这是一个代码 1 int main int argc char argv 2 3 signed char S psc 4 unsigned char U pusc 5 char C pc 6 7 C S 8 C U 9 10 pc psc
  • Python 相当于 Bit Twiddling Hacks 中的 C 代码?

    我有一个位计数方法 我正在尝试尽可能快地实现 我想尝试下面的算法位摆弄黑客 http graphics stanford edu seander bithacks html CountBitsSetParallel 但我不知道 C 什么是
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 仅针对某些异常类型中断

    我知道异常处理是一件非常重要的事情 我们在所有项目中都在这样做 主要原因是记录客户发生的错误 这工作正常 根本不是问题 但是 当我仍在使用 Visual Studio 编码和运行应用程序时 我根本不需要任何异常处理 我希望调试器正好停在应用
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 我们什么时候应该在.NET中使用NativeMemory.Alloc()? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 NET6 C 引入NativeMemory类 但我不知道什么时候应该使用NativeMemory Alloc 而不是普通的数组实例化
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何从命名空间内重载运算符<<

    这是我能想到的最小的包含示例 首先是类的标题 每当使用 pragma once ifndef EURO H define EURO H include
  • WPF ComboBox 中具有本地化名称的枚举

    我有一个列出枚举的组合框 enum StatusEnum Open 1 Closed 2 InProgress 3
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • 代码块 - 使用大地址感知标志进行编译

    如何使用以下命令在 64 位系统上编译 32 位应用程序LARGE ADRESS AWARE使用代码块标记 我需要使用超过 2GB 的内存 应该是添加的情况 Wl large address aware到链接标志 我不使用 CodeBloc
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 这个元组创建习惯有名字吗?

    On the 增加邮件列表 http lists boost org Archives boost 2014 06 214213 php LouisDionne 最近发布了以下创建类似元组的实体的巧妙技巧 include
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • 从 cin 读取整数序列并将它们存储在向量中

    这就是我读取整数的方法std cin并将它们存储在向量中 int number vector
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐

  • JS reduce 用法

    定义 reduce 方法接收一个函数作为累加器 数组中的每个值 从左到右 开始缩减 最终计算为一个值 语法 array reduce function total currentValue currentIndex arr initialV
  • HEVC对场编码的支持

    HEVC值得注意的是它没有提供专用于隔行视频的工具 而是将隔行视频的一帧看作两个独立的场 对各个场数据分别进行编码 简化了编码器的实现 这也是因为随着数字视频技术的快速发展 视频的隔行扫描方式日渐式微 https blog csdn net
  • vue+element-ui实现表格里嵌套表格

    效果图 点击某行数据展开另一个嵌套在里面的table 核心代码 从后台请求的数据格式 代码实现
  • table 表格合并

    table 表格合并 开发工具与关键技术 DW JavaScript 作者 刘东标 撰写时间 2019 03 14 div div span colspan和rowspan这两个属性用于创建特殊的表格 span span colspan用来
  • JAVA查搜索文件内容

    上周突然遇到了个要查找历史sql的中是否包含某个字段的问题 Everting虽然可以查找某个后缀的文件 可是并不能搜索文件内容 所以就花费一点功夫自己写一个了 使用起来还是非常方便 1 单文件查找内容 2 单文件夹下读取所有文件 并查找内容
  • 【时间序列预测算法】——ARIMA 算法介绍及代码实现

    基本概念 一阶差分 时间序列在t 与t 1 时刻函数值的差值 提升时序数据的平稳性 ARIMA算法对数据平稳性有要求 二阶差分 在一阶差分的基础上再做一次 一般时序数据最多做两阶 再多则预测意义不大 自回归模型 f t
  • Google Protocol Buffer持久化框架分析

    一 三大主流开源持久化框架介绍 1 1 Google Protocol Buffer protocol buffer是google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了三种语言的实现 java c 和 pyt
  • The type or namespace name ‘MenuItemAttribute‘ could not be found类似报错处理方法

    类似报错主要是使用了UnityEditor相关的API 解决方法的话 只要将相关脚本放进Asset下的Editor文件夹之中即可 并不涉及其他的逻辑 只与UnityEditor相关 否则在打包的时候还可能会发生类似的报错
  • KEIL编译报错 Error: L6220E: Load region LR_IROM1 size (65552 bytes) exceeds limit (65536 bytes)……

    问题描述 STM32F103CBT6 KEIL编译报错 Error L6220E Load region LR IROM1 size 65552 bytes exceeds limit 65536 bytes Region contains
  • 7107小时时,加入创业公司(没有股份,当作经验吧)

    只是第一个项目是web项目 与vr无关 所以此项目耗费时间不计入1万小时之内 也不算是第五个项目 不过也算是里程碑 至少2017年有稳定项目来源了吧 主要也是学经验 以后如果开自己的公司的话 能有所借鉴 还是要努力的 才能多接触各方面 主要
  • windows 10 vs2017 x264的编译和使用测试

    做了一次更新 工具改成vs2019了 x264这个sdk非常棒 主页 x264 the best H 264 AVC encoder VideoLANhttps www videolan org developers x264 html 在
  • 01. Web漏洞靶场的搭建

    01 Web漏洞靶场的搭建 Web漏洞靶场的搭建 上 什么是Web安全 什么是Web Web是互联网的总称 全称为World Wide Web 缩写WWW 即全球广域网 也称为万维网 它是一种基于超文本和HTTP的 全球性的 动态交互的 跨
  • Vue3正式发布那么久了,你认识Pinia了吗?

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 正逐渐往全干发展 个人状态 研发工程师 现效力于中国工业软件事业 人生格言 积跬步至千里 积小流成江海 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 3项目实战 Node js
  • StringBoot+Mybatis的增删改查(四)

    整体项目链接地址 StringBoot Mybatis的增删改查 一 StringBoot Mybatis的增删改查 二 StringBoot Mybatis的增删改查 三 StringBoot Mybatis的增删改查 四 StringB
  • vue练习,写游戏

  • 【异常问题】nvcc fatal : Unsupported gpu architecture ‘compute_86‘ 解决方案

    目录 异常问题 nvcc fatal Unsupported gpu architecture compute 86 解决方案 1 报错信息 2 系统环境 3 原因分析 4 解决方案 异常问题 nvcc fatal Unsupported
  • Verilog基础语法(一)

    一 数据类型 在Verilog语言中主要有三大数据类型 寄存器数据类型 线网数据类型 参数数据类型 1 寄存器数据类型 关键字 reg reg类型数据默认初始值为不定值X 需要注意的是reg类型的数据只能在always语句和initial语
  • 基于MATLAB R2018a库函数构建KNN分类器

    基于MATLAB R2018a库函数构建KNN分类器 基于MATLAB R2018a库函数构建KNN分类器 从一个库函数fitcknn 谈起 构造函数 类的属性 Properties 方法成员 Methods 构建和使用KNN分类器 基于M
  • python高级数据类型

    序列 字符串 列表 元组 在python中 序列就是一组按照顺序排列的值 数据集合 python中存在三种内置的序列类型 字符串 列表 元组 优点 支持索引和切片的操作 特征 第一个正索引为0 指向的是左端 第一个索引为负数 指向的是右端
  • 深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

    系列文章目录 C 高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 LSP 接口隔离原则 系列文章目录 1 接口隔离原则的定义和解读 2 案例解读 3 如何判断一个接口是否符合接口隔离原则 小结 1