接口隔离原则

接口隔离原则

接口隔离原则(Interface Segregation PrincipleISP)。

英文描述:

1
Clients should not be forced to depend upon interfaces that they do not use

中文翻译:

1
客户端不应该被强迫依赖它不需要的接口

其中的“客户端”,可以理解为接口的调用者或者使用者。

一、如何理解“接口隔离”?

接口含义:

  • 对外开放的
  • 提供给别人调用的

比如说 API 接口,类的 public 方法等,都属于接口。

接口隔离:

  • 将不同业务或功能的接口分离,拆分成更细粒度的接口
  • 客户端不应该调用大而全的接口,而是细粒度的接口

接口隔离原则实际上是要求服务提供者限制对外开放的接口。

比如说,用户服务对外提供了几个接口:

1
2
3
4
5
6
public class UserService {
boolean register(String userName, String password);
boolean login(String userName, String password);
User getUser(String userId);
boolean deleteUser(String userId);
}

其中 deleteUser 接口需要相应的删除权限。

最简单的方式就是在 deleteUser 里面或代理这个接口来实现权限管理。

不过还可以从接口设计层面来处理,将接口隔离开来设计,比如说:

1
2
3
4
5
6
7
8
9
public class UserService {
boolean register(String userName, String password);
boolean login(String userName, String password);
User getUser(String userId);
}

public class RestrictedUserService {
boolean deleteUser(String userId);
}

这种方式就是接口隔离,服务提供者将不同业务的接口分离开来,限制客户端的调用。

二、为什么要“接口隔离”?

  • 防止对外暴露不应该开放的接口,比如权限限制
  • 减少对外开放的无用接口,比如大型接口服务提供了很多接口,但是很多接口很少用
  • 避免实现类依赖多余的接口,比如类接口很多,但是很多是子类不需要实现的
  • 提供更灵活的接口搭配,比如不同业务的子类可以实现通用的接口

三、如何判断“接口隔离”?

判断是否满足“接口隔离原则”,可以通过调用者使用接口的方式来判断:

  • 经常是集中调用了部分接口,接口调用频率不一样
  • 有些接口相比于其他接口,需要额外的处理某些逻辑,比如权限控制之类的
  • 部分接口调用后直接抛异常,提示不支持

这些情况,说明接口可能存在业务或逻辑不一样的部分,可以考虑一下做接口隔离。

四、如何实现“接口隔离”?

接口是否要隔离,可以从这几个方面去检查:

  • 按照业务功能进行接口分类,不同业务的应该隔离
  • 隔离必要接口和非必要接口,子类不用实现非必要接口
  • 分析常用接口和不常用接口,可以考虑做接口隔离

实际上接口是否要隔离,还是和业务挂钩的,如果没有需求推动,有时候也不一定要做接口隔离。

一般来说,设计接口时,

  • 一开始提供少量接口,随着业务发展,逐渐添加新接口
  • 然后等到某一天有需求驱动了,再将业务接口进行隔离

所以不一定要在一开始就完全设计好接口隔离,视情况而做。

作者

jiaduo

发布于

2022-11-05

更新于

2023-04-03

许可协议