一般的系统设计都需要系统设计架构图,图中会将系统整体按照几个不同维度的模块进行拆分,以达到模块之间高内聚、低耦合的效果,协同完成系统的各项功能。同样,在应用程序设计的时候,我们也需要对模块、接口进行拆分,这种拆分的依据(原则)就是接口隔离原则。
一、接口隔离原则概念
接口隔离原则(Interface Segregation Principle,ISP)目的是为了实现不同模块、接口之间高内聚、低耦合。对于接口(或模块,下同)的客户端(使用方)来说,客户端不应该依赖它不需要的接口方法。比如客户端仅需要A功能的方法,但是由于不合理的接口设计,客户端依赖A接口时还提供了功能B方法。在系统程序内部,不同功能也会有相互依赖关系,这种类间的依赖关系也应当是建立在最小的接口之上。
为什么要隔离,或者说为什么要建立在最小接口之上?接口隔离原则要求接口对客户端的承诺越少越好,这样如果某客户端需要发生改动,就能更小限度的影响其他客户端,有利于程序的稳定性、扩展性、可维护性。
二、接口隔离原则应用
根据接口隔离原则的目的,可以通过以下几个方面设计、评价接口的设计。
2.1 低耦合
对于设计的接口来说,接口应尽可能小,不要出现臃肿的接口。但是如果接口无限制划分,如一个方法一个接口,也会导致类激增、项目复杂化、不易维护的情况。如何衡量接口划分的最小粒度呢?单一职责原则。
前面说了,单一职责的划分是针对接口和类的。对于接口而言,也是根据业务逻辑进行划分的。如前所述,对于客服中心而言,手机就需要一个接口即可。而对于手机制造厂商来说,手机就需要提供2个接口向外提供服务了,分别是协议管理服务【客户只关系协议处理】以及数据传送服务【客户只关系数据传送】。
2.2 高内聚
接口高内聚指的是接口要尽可能少暴露public方法。接口是对外的约定,越少对系统的开发更有利更可控、更容易后期降低成本。
比如在商品库存服务中,扣减库存存在以下两种情况:① 单品扣减 ② 多品扣减;如果你同时暴露两个接口出去,在后续产品迭代时就要维护两个接口,比如参数校验、接口限流等。完全可以统一使用一个多品扣减接口代替,将单品扣减内聚在自身服务中,不暴露出去。后续只需要维护多品一个接口即可。
3. 定制服务
项目改造阶段,在有必要的情况下,需要考虑拆分系统接口,降低系统风险。因为在项目迭代的过程中,接口依赖的下游层次不齐,使得不同业务之间影响严重。比如有的下游响应耗时低,有的下游响应耗时高。这将导致自身接口性能下降,可以根据耗时情况进行接口拆分,提供长耗时接口,使得短耗时接口稳定性提高,并且也提高了系统监控、维护能力。