1.如何理解“接口隔离原则”?
接口隔离原则,它对应 SOLID 中的英文字母“I”。对于这个原则,最关键就是理解其中“接口”的含义。
接口隔离原则的英文翻译是“ Interface Segregation Principle”,缩写为 ISP。Robert Martin 在 SOLID 原则中是这样定义它的:“Clients should not be forced to depend upon interfaces that they do not use。”直译成中文的话就是:客户端不应该被强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。
在这条原则中,我们可以把“接口”理解为下面三种东西:
- 一组 API 接口集合
它可以是某个微服务的接口,也可以是某个类库的接口等等。在设计微服务或者类库接口的时候,如果部分接口只被部分调用者使用,那我们就需要将这部分接口隔离出来,单独给对应的调用者使用,而不是强迫其他调用者也依赖这部分不会被用到的接口。例如:后台管理系统删除用户的接口。
- 单个 API 接口或函数
函数的设计要功能单一,不要将多个不同的功能逻辑在一个函数中实现。部分调用者只需要函数中的部分功能,那我们就需要把函数拆分成粒度更细的多个函数,让调用者只依赖它需要的那个细粒度函数。比如,count() 实现的几种函数。
- OOP 中的接口概念
比如 Java 中的 interface。那接口的设计要尽量单一(避免一个大而全的Config接口),不要让接口的实现类和调用者,依赖不需要的接口函数。如:Redis、MySQL、Kafka部分配置信息热更新,新的监控功能需求。
2. 接口隔离原则与单一职责原则的区别
单一职责原则针对的是模块、类、接口的设计。
而接口隔离原则相对于单一职责原则,
- 一方面它更侧重于接口的设计,
- 另一方面它的思考的角度不同。
它提供了一种判断接口是否职责单一的标准:通过调用者如何使用接口来间接地判定。如果调用者只使用部分接口或接口的部分功能,那接口的设计就不够职责单一。