为啥要继承一个空接口

刚开始接触队列的时候,看到这里继承了一个空接口,心里一直犯嘀咕,这是什么操作呀
为啥要继承一个空接口
后来问了大神,他是这么说的

为啥要继承一个空接口

  • 表示我这里有一个约定的队列规范,虽然是空的,但是有扩展空间(一般升级版本添加新功能),扩不扩展另说。 如果要增加功能,添加规范接口,再让所有实体类实现新增接口,最后打个新版本发布。 这是常见套路。重要的是规范的版本号,不同版本规范有不同功能,实体类怎么实现的不重要(因为你实现了就有那些功能)。

  • 写程序的时候,定义一些接口,代表各种功能模块,互相依赖。便于扩展。依赖于接口,只要是实现它的任意对象都可以。写死具体某个对象是比较低级的做法。

  • // $app 表示依赖注入容器实例
    $app->get(ShouldQueue::class); // 容器获取这个接口的实体,具体是那个实现它的类的对象,对照关系一般放在配置文件,便于修改调整。理论上,一个框架除了应用开发目录,最好只有配置目录或文件能让人改,这样算好的设计

  • 改下配置,就更换了实现类,工厂(依赖注入容器)生产水果(接口),要苹果还是香蕉(实体类),跟工厂约定(调整配置文件:水果 => 苹果)一下即可。

  • $container->get(接口名);
    $container->make(接口名, 参数组);
    通过接口名从容器中获取实体对象,具体哪类对象,由配置文件决定。
    比如有个标准输出接口,有两个实体类,一个是标准文件输出,一个是控制台输出。
    你想直接输出控制台,还是输出记录到某个指定文件,由配置文件决定。

    那么,问题来了。既然配置文件决定一个接口对应一个实体类,哪我想用多个实体类怎么办?比如 hyperf 框架,是基于控制台的,如果把控制台输出当作日志,那么还有用户访问请求日志,都是日志,咋办?

  • 都是日志,你要根据用户。控制台这块,主要是负责服务器运行,用户日志负责用户访问请求。这个两类,那么可以继承最基础的日志接口,写两个子接口(控制台、用户),根据用途。

  • 服务器日志接口、用户访问日志接口,都继承基础日志接口。算是一个细分,比如吃东西,你可以吃饭,也可以吃零食;吃饭可以吃面,或稀饭;吃零食可以吃辣条或薯片。根据需要细分。不需要就没必要。都是吃的,如果只需要决定是正餐还是零嘴,对 $container (依赖注入容器)来说,一个规范接口即可;如果要细分,就要多个。

  • 现在常用框架都实现了依赖注入容器,$container->get(接口名),用接口名,加上配置文件,方便更改实体类。如果写死某个实体类,其实也能改配置(实体类A => 实体类B,这种对应关系的逻辑性和规范性很差)

  • 我们定义接口名、类名,方法名、属性名、变量名,这些都要语义化,让人一看就知道大致是做什么用的,最理想的代码是,完全语义化、规范化,没有注释。每个方法/函数都是单一性功能、简洁。
    完美~

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12
Summer

src/Illuminate/Console/Scheduling/Schedule.php:

/**
 * Add a new job callback event to the schedule.
 *
 * @param  object|string  $job
 * @param  string|null  $queue
 * @param  string|null  $connection
 * @return \Illuminate\Console\Scheduling\CallbackEvent
 */
public function job($job, $queue = null, $connection = null)
{
    return $this->call(function () use ($job, $queue, $connection) {
        $job = is_string($job) ? Container::getInstance()->make($job) : $job;

        if ($job instanceof ShouldQueue) {
            // 走队列
            $this->dispatchToQueue($job, $queue ?? $job->queue, $connection ?? $job->connection);
        } else {
            // 现在执行
            $this->dispatchNow($job);
        }
    })->name(is_string($job) ? $job : get_class($job));
}
2年前 评论
lxm0087 (楼主) 2年前
抄你码科技有限公司 2年前
ModStart 1年前
pndx

感觉laravel用的模式是真的多,看的越多不懂的越多。

2年前 评论

在面向对象开发中,实现空接口的意义是很重大的。抛开今后的可扩展性不谈,在当前,就可以使用 if ($user instanceof SomeInterface) 来做许多操作。

2年前 评论
lxm0087 (楼主) 2年前

laravel的空接口会判断有没有继承该接口来处理一些流程,队列的这个空接口该说是有一个对应的处理流程的

2年前 评论
deatil (作者) 2年前
lxm0087 (楼主) 2年前

你文中说的都很有道理。

但我觉得 ShouldQueue 纯粹是为了告诉 Laravel 当前任务是否可以在队列中进行。

可以看下文档中事件队列消息通知发送邮件等部分

2年前 评论

啊,我想进来回答你的问题,愚人节啊

2年前 评论
Summer

src/Illuminate/Console/Scheduling/Schedule.php:

/**
 * Add a new job callback event to the schedule.
 *
 * @param  object|string  $job
 * @param  string|null  $queue
 * @param  string|null  $connection
 * @return \Illuminate\Console\Scheduling\CallbackEvent
 */
public function job($job, $queue = null, $connection = null)
{
    return $this->call(function () use ($job, $queue, $connection) {
        $job = is_string($job) ? Container::getInstance()->make($job) : $job;

        if ($job instanceof ShouldQueue) {
            // 走队列
            $this->dispatchToQueue($job, $queue ?? $job->queue, $connection ?? $job->connection);
        } else {
            // 现在执行
            $this->dispatchNow($job);
        }
    })->name(is_string($job) ? $job : get_class($job));
}
2年前 评论
lxm0087 (楼主) 2年前
抄你码科技有限公司 2年前
ModStart 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!