Qsnh / meedu

Meedu是一款功能强大的开源在线教育系统,适用于个人、企业或机构搭建自己的在线学习平台。它提供了完整的解决方案,满足网校搭建、在线教学、企业培训和知识付费等多种需求。

Home Page:https://meedu.vip

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

请大佬解惑,为什么在每个服务中多加一层interface,不会增加复杂度吗?

ikaijian opened this issue · comments

为什么在每个服务中多加一层interface,不会增加复杂度吗?请求大佬解答

interface是用来注册服务的,在容器中获取实例对象是以接口的方式

interface是用来注册服务的,在容器中获取实例对象是以接口的方式

这样设计好处?

没有interface怎么获取服务实例?

没有interface怎么获取服务实例?
可以很多方法可以获取到服务实例

@jeesonjian 用 interface 抽象/约束 services 是通用做法,不太清楚是否 laravel 硬性要求。

有几个好处:

  1. 随着版本迭代,可以随时替换services,只要这个service实现同一个interface即可。
  2. 代码约束。所有service都实现同一个interface。

坏处也有,一般IDE点击跳转都会跳到interface文件,看不到具体实现的方法。只能通过xdebug断点进入才知道实际调用的是哪个方法。当然,如果这些代码是你自己一手写的,那你可能不用断点都很清楚是怎么实现的。

PS: @Qsnh 做了懒处理,interface 全空,应当将这个service理应实现的所有函数都列出来,下面的service实现这些功能,后面就可以无痛切换service。

@jeesonjian 用 interface 抽象/约束 services 是通用做法,不太清楚是否 laravel 硬性要求。

有几个好处:

  1. 随着版本迭代,可以随时替换services,只要这个service实现同一个interface即可。
  2. 代码约束。所有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地址,调用不需要关心怎么实现。这样,切换微服务的话成本也较低。