接口隔离原则
接口隔离原则
接口隔离原则(Interface Segregation Principle
,ISP
)。
英文描述:
1 | Clients should not be forced to depend upon interfaces that they do not use |
中文翻译:
1 | 客户端不应该被强迫依赖它不需要的接口 |
其中的“客户端”,可以理解为接口的调用者或者使用者。
一、如何理解“接口隔离”?
接口含义:
- 对外开放的
- 提供给别人调用的
比如说 API 接口,类的 public 方法等,都属于接口。
接口隔离:
- 将不同业务或功能的接口分离,拆分成更细粒度的接口
- 客户端不应该调用大而全的接口,而是细粒度的接口
接口隔离原则实际上是要求服务提供者限制对外开放的接口。
比如说,用户服务对外提供了几个接口:
1 | public class UserService { |
其中 deleteUser
接口需要相应的删除权限。
最简单的方式就是在 deleteUser
里面或代理这个接口来实现权限管理。
不过还可以从接口设计层面来处理,将接口隔离开来设计,比如说:
1 | public class UserService { |
这种方式就是接口隔离,服务提供者将不同业务的接口分离开来,限制客户端的调用。
二、为什么要“接口隔离”?
- 防止对外暴露不应该开放的接口,比如权限限制
- 减少对外开放的无用接口,比如大型接口服务提供了很多接口,但是很多接口很少用
- 避免实现类依赖多余的接口,比如类接口很多,但是很多是子类不需要实现的
- 提供更灵活的接口搭配,比如不同业务的子类可以实现通用的接口
三、如何判断“接口隔离”?
判断是否满足“接口隔离原则”,可以通过调用者使用接口的方式来判断:
- 经常是集中调用了部分接口,接口调用频率不一样
- 有些接口相比于其他接口,需要额外的处理某些逻辑,比如权限控制之类的
- 部分接口调用后直接抛异常,提示不支持
这些情况,说明接口可能存在业务或逻辑不一样的部分,可以考虑一下做接口隔离。
四、如何实现“接口隔离”?
接口是否要隔离,可以从这几个方面去检查:
- 按照业务功能进行接口分类,不同业务的应该隔离
- 隔离必要接口和非必要接口,子类不用实现非必要接口
- 分析常用接口和不常用接口,可以考虑做接口隔离
实际上接口是否要隔离,还是和业务挂钩的,如果没有需求推动,有时候也不一定要做接口隔离。
一般来说,设计接口时,
- 一开始提供少量接口,随着业务发展,逐渐添加新接口
- 然后等到某一天有需求驱动了,再将业务接口进行隔离
所以不一定要在一开始就完全设计好接口隔离,视情况而做。