请大佬解惑,为什么在每个服务中多加一层interface,不会增加复杂度吗?
ikaijian opened this issue · comments
为什么在每个服务中多加一层interface,不会增加复杂度吗?请求大佬解答
interface是用来注册服务的,在容器中获取实例对象是以接口的方式
interface是用来注册服务的,在容器中获取实例对象是以接口的方式
这样设计好处?
没有interface怎么获取服务实例?
没有interface怎么获取服务实例?
可以很多方法可以获取到服务实例
@jeesonjian 用 interface 抽象/约束 services 是通用做法,不太清楚是否 laravel 硬性要求。
有几个好处:
- 随着版本迭代,可以随时替换services,只要这个service实现同一个interface即可。
- 代码约束。所有service都实现同一个interface。
坏处也有,一般IDE点击跳转都会跳到interface文件,看不到具体实现的方法。只能通过xdebug断点进入才知道实际调用的是哪个方法。当然,如果这些代码是你自己一手写的,那你可能不用断点都很清楚是怎么实现的。
PS: @Qsnh 做了懒处理,interface 全空,应当将这个service理应实现的所有函数都列出来,下面的service实现这些功能,后面就可以无痛切换service。
@jeesonjian 用 interface 抽象/约束 services 是通用做法,不太清楚是否 laravel 硬性要求。
有几个好处:
- 随着版本迭代,可以随时替换services,只要这个service实现同一个interface即可。
- 代码约束。所有service都实现同一个interface。
坏处也有,一般IDE点击跳转都会跳到interface文件,看不到具体实现的方法。只能通过xdebug断点进入才知道实际调用的是哪个方法。当然,如果这些代码是你自己一手写的,那你可能不用断点都很清楚是怎么实现的。
PS: @Qsnh 做了懒处理,interface 全空,应当将这个service理应实现的所有函数都列出来,下面的service实现这些功能,后面就可以无痛切换service。
这里我是懒得写interface中的stub了,严格来说是需要写的。
至于控制器的提示,meedu的代码中都通过注释实现,如:
/**
* @var ConfigService $configService
*/
$configService = app()->make(ConfigServiceInterface::class);
面向 interface
编程可将具体实现与调用分离,具体的实现可以是一个PHP的对象,也可以是一个API地址,调用不需要关心怎么实现。这样,切换微服务的话成本也较低。