今天继续打卡学习极客时间上的专栏“设计模式之美”, 本篇是专栏第18节的学习笔记,介绍面向对象设计原则中的接口隔离原则。

笔记

面向对象有很多经典的设计原则:

  • SOLID5原则分别是
    • 单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖反转原则(DIP)
  • KISS - Keep It Simple, Stupid
  • YAGNI - You aren't gonna need it
  • DRY - Don't Repeat Yourself
  • LOD - Law of Demeter(迪米特法则,又叫做最少知识原则)

接口隔离原则

接口隔离原则: 接口的调用者(或使用者)不应该强迫依赖它不需要的接口。 我们可以把接口理解为下面三种东西:

  • 一组API接口集合
  • 单个API接口或函数
  • OOP中的接口概念

不同的理解方式,对应接口隔离原则也有不同的解读方式。

理解为一组API接口集合,即可以是某个微服务的向外部提供的API接口集合,也可以是某个类库的对外暴露的接口,在做微服务API接口设计或类库接口设计时需要注意如果其中只有部分接口被调用者使用,需要将这部分接口隔离出来,而不能将其他接口也暴露给调用者。

理解为单个API接口或函数,那么接口隔离原则可理解为: 函数(单个接口)的设计要功能单一,不要将多个不同的功能逻辑在一个函数(接口)中实现,也就是说我们需要把函数拆分成粒度更细的多个函数,让调用者只依赖它需要的那个细粒度函数。 从这个角度理解接口隔离原则会发现它和单一职责原则有点类似,不过还是有区别的。单一职责原则针对的是模块、类、接口的设计,而接口隔离原则一方面更侧重于接口的设计,另一方面它的思考角度不同,它提供了一种判断接口是否职责单一的标准: 通过调用者如何使用接口来间接的判定。

理解为OOP中的接口概念,理解为面向对象编程语言中的接口语法,接口的设计要尽量单一,不要让接口的实现类和调用者依赖不需要的接口函数。

个人理解

Go语言中的接口设计原则

Go的哲学追求的是保持简单,在保障可维护性的前提下尽量不要进行过度设计。 通过接口隔离原则,使用多个隔离的接口,比使用单个接口要好。因此,Go推荐使用单一接口,同时Go支持接口组合语法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
type Reader interface {
	read()
}

type Writer interface {
	write()
}

type ReadWriter interface {
	Reader
	Writer
}

参考