我们正在使用带有调度模块的Laravel应用程序。该模块具有可放在议程中的三种类型的类:任务,事件和部门。因此,我们提出了以下类图: 现在,我们的问题是:如果要实现此图,应该使用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
}
答案 0 :(得分:1)
当模型都具有共同的特征但行为(功能)独特时,最好使用扩展父类/抽象类。例如,Car
和Motorcycle
都是Vehicle
。它们具有共同的特征(例如前灯,指示器,引擎,变速箱等),但是如何operate()
它们在每个班级都是独一无二的。
在不了解您的项目的情况下,您似乎正在寻找后者,尽管每个模型具有不同的特性,但每个模型都具有相同的功能(也许是addToCalendar()
,reschedule()
等)。
答案 1 :(得分:0)
当您尝试扩展类时,意味着“是”关系,Car扩展了Vehicle,Car“是” Vehicle。在您的示例中,任务“是”可计划的。是吗?
另一方面,特征使用不同的方法,有点像“汽车使用车轮”。再次在您的示例中,Task使用Plannable。看起来比扩展好,我猜呢?
在不理解您将为该实现实现哪些功能的情况下很难说更多。我希望它能提供一些想法。