当前位置: 首页 > news >正文

软件设计原则之接口隔离原则

接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计中的一个重要原则,它属于SOLID原则之一。这个原则强调客户端(即接口的调用者)不应该被迫依赖于它们不使用的方法。换句话说,一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则的主要目的是使系统更加模块化,易于维护和扩展。

目录

  • 接口隔离原则的核心思想
  • 接口隔离原则的优点
  • 应用场景
  • 接口隔离的比方
  • 应用开发实例
  • 缺点

接口隔离原则的核心思想

高内聚低耦合: 接口的设计应尽量做到高内聚,即接口中的方法都围绕一个共同的目标;同时接口间的耦合度要低,每个接口只承担单一的职责。
小接口优于大接口: 如果一个大接口中的部分方法被部分调用者使用,而另一部分方法被其他调用者使用,那么这个大接口就应该被拆分成几个小接口,让调用者只依赖它们需要的接口。
客户端不应依赖它不使用的方法: 一个接口如果有一些方法是不被某类使用的,那么这个接口对于这些类来说就是过于庞大,需要拆分成更小的接口。

接口隔离原则的优点

降低系统间的耦合度: 通过拆分接口,使得各个类之间的依赖关系更加明确,减少了不必要的依赖,从而降低了系统间的耦合度。
提高系统的灵活性:由于接口变小、职责单一,使得接口易于被替换和修改,提高了系统的灵活性。
增强系统的可维护性: 由于每个接口都相对较小,易于理解和维护,同时当接口需要修改时,影响的范围也较小。

应用场景

当一个接口中的方法被不同的类以不同的方式使用时: 这些方法应该被拆分到不同的接口中。
当系统的扩展性要求较高时: 通过遵循接口隔离原则,可以更容易地添加新的接口和实现类,而不需要修改现有的接口和实现类。
当系统的维护性要求较高时: 接口隔离原则使得接口更加清晰、简单,易于理解和维护。

接口隔离的比方

就违反 ISP 规定而言,下面的图片显示了一个大垃圾箱,用来扔掉各种垃圾,没有任何隔离措施。
在这里插入图片描述

使用 ISP,下面的图像是我们现实生活中隔离的一个很好的例子。在这里插入图片描述

应用开发实例

下面是一个银行客户的例子,银行客户的类型如下:
企业客户: 为企业员工服务。
零售客户: 个人,日常银行业务。
潜在客户: 他们只是一个银行客户,还没有持有银行的产品,这只是一个记录,不同于公司和零售。
未遵守ISP
乍看起来还可以,但是对于有问题的客户来说,这是一个很大的接口,因为它强制客户端类实现不需要的方法。
如果所描述的潜在客户不持有任何产品,则必须实现产品属性。
一个潜在客户和一个零售客户都被迫拥有一个客户结构属性,但是在真实的场景中,一个公司客户拥有一个描述客户层次结构的客户结构。
潜在客户和零售客户都必须实现 BusinessType,但它只属于公司客户。
一个公司客户和一个潜在客户被迫实现一个“Occupation”属性,这个属性对于潜在客户来说不存在。
前面问题的一个解决方案是将胖接口分割成有意义的部分,换句话说,小接口,因此客户类型只实现它所需要的接口。

在这里插入图片描述

缺点

1、接口大爆炸: 如果接口拆分的非常细,可能会导致接口数量急剧增加,形成所谓的“接口大爆炸”。这会增加系统的复杂性和管理难度,因为开发者需要维护更多的接口文档和代码。
2、性能开销: 在某些情况下,细化的接口可能会导致性能下降。因为每次调用接口时都需要进行额外的类型检查和转换操作,这会增加系统的运行开销。特别是在高频调用的场景下,这种开销可能会更加明显。
3、开发成本增加: 随着接口数量的增加,开发成本也会相应增加。开发者需要为每个接口编写和维护代码,这增加了开发和维护的工作量。同时,过多的接口也可能导致团队成员之间的沟通成本上升。
4、理解和使用难度: 对于新加入项目的开发者来说,面对大量的细粒度接口可能会感到困惑和难以理解。他们需要花费更多的时间和精力来熟悉和掌握这些接口的使用方法和规则

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 10、ollama启动LLama_Factory微调大模型(llama.cpp)
  • 网闸与防火墙的区别
  • Python中排序算法之冒泡排序
  • k8s单master多node环境搭建-k8s版本低于1.24,容器运行时为docker
  • deque容器---C++
  • 第4章-06-让无头浏览器加载扩展插件
  • 小程序中使用page-container来做弹窗
  • C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码
  • 【FPGA】入门学习路线
  • 【Python系列】SQLAlchemy 基本介绍
  • 等保2.0--安全计算环境--TiDB数据库
  • ThinkPHP A表和B表一对多关联,根据B表中符合条件记录的某个字段的值对A表数据进行排序。
  • 更改网络ip地址时出现错误怎么办
  • 深度学习项目实践——qq聊天机器人(transformer)(二)配置环境与部署
  • 做影像组学+深度学习技术研究如何发表高分论文,案例解析
  • [译] 怎样写一个基础的编译器
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • extract-text-webpack-plugin用法
  • Invalidate和postInvalidate的区别
  • JAVA之继承和多态
  • Promise面试题,控制异步流程
  • Python - 闭包Closure
  • Spring Boot快速入门(一):Hello Spring Boot
  • Vue 2.3、2.4 知识点小结
  • VUE es6技巧写法(持续更新中~~~)
  • Web Storage相关
  • 初识MongoDB分片
  • 复习Javascript专题(四):js中的深浅拷贝
  • 记录:CentOS7.2配置LNMP环境记录
  • 三分钟教你同步 Visual Studio Code 设置
  • 事件委托的小应用
  • 试着探索高并发下的系统架构面貌
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序填坑清单
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #162 (Div. 2)
  • #include到底该写在哪
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (分布式缓存)Redis哨兵
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (回溯) LeetCode 77. 组合
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十二)springboot实战——SSE服务推送事件案例实现
  • .env.development、.env.production、.env.staging
  • .NET 8.0 发布到 IIS
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET 中创建支持集合初始化器的类型
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net程序集学习心得
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET学习全景图