Laravel:使用特征或扩展模型之间的区别

时间:2019-05-21 16:34:04

标签: laravel design-patterns traits extend

我们正在使用带有调度模块的Laravel应用程序。该模块具有可放在议程中的三种类型的类:任务,事件和部门。因此,我们提出了以下类图: Class Diagram 现在,我们的问题是:如果要实现此图,应该使用Trait还是应该扩展Plannable模型。

可计划的模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Plannable extends Model
{
    // Code
}

任务模型:

<?php

namespace App;

use App\Plannable;

class Task extends Plannable
{
    // Code
}

还是我们应该以此为特征:

可计划的特征:

<?php

namespace App\Traits;

trait Plannable
{
    // Code
}

任务模型:

<?php

namespace App;

use App\Plannable;
use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    use Plannable;
    // Code
}

2 个答案:

答案 0 :(得分:1)

当模型都具有共同的特征但行为(功能)独特时,最好使用扩展父类/抽象类。例如,CarMotorcycle都是Vehicle。它们具有共同的特征(例如前灯,指示器,引擎,变速箱等),但是如何operate()它们在每个班级都是独一无二的。

另一方面,当使用类(在这种情况下为雄辩模型)需要通用的功能(即方法)时,尽管具有不同的特性,但最好使用特质。

在不了解您的项目的情况下,您似乎正在寻找后者,尽管每个模型具有不同的特性,但每个模型都具有相同的功能(也许是addToCalendar()reschedule()等)。

答案 1 :(得分:0)

当您尝试扩展类时,意味着“是”关系,Car扩展了Vehicle,Car“是” Vehicle。在您的示例中,任务“是”可计划的。是吗?

另一方面,特征使用不同的方法,有点像“汽车使用车轮”。再次在您的示例中,Task使用Plannable。看起来比扩展好,我猜呢?

在不理解您将为该实现实现哪些功能的情况下很难说更多。我希望它能提供一些想法。