简单的车辆DDD模型 - 到ValueObject techincal状态是否

时间:2015-05-13 14:48:57

标签: php domain-driven-design value-objects

我正在开发一些我使用Vehicle模型的PHP应用程序。

该模型应包含一些数据,可能包含有关车辆控制,排放控制和一些常规服务的逻辑。这是代码:

class Vehicle extends Entity {
    protected $name;
    protected $registrationNumber;
    protected $registrationCountry;
    protected $seatsCapacity;
    protected $obtainDate;
    protected $color;
    protected $comment;
    protected $naviSerialNumber;
    protected $fuelCardNumber;
    protected $techicalStatus;
    protected $transferStatus;
    protected $ownership;
}

其中$technicalStatus应该是此类的实例:

class VehicleTechnicalStatus extends ValueObject {
    protected $tachoValue;
    protected $vehControlDate;
    protected $vehControlValidDue;
    protected $emissControlDate;
    protected $emissControlValidDue;
    protected $lastRegServiceTachoValue;
    protected $lastRegServiceDate;
    protected $serviceInterval;
}

当然,它将包含有关车辆控制日期,服务等的一些逻辑。

将此类设为ValueObject是否正确?它没有任何标识,但在Vehicle中它会经常更改(替换为ValueObject并且应该是不可变的。)

设计是否正确?或者我应该将所有这些属性和业务逻辑方法直接放到Vehicle类?

1 个答案:

答案 0 :(得分:0)

  

将此类设为ValueObject是否正确?它没有任何标识,但在Vehicle中它会经常更改(替换为,它是一个ValueObject,应该是不可变的)。

是。从根本上说,值对象是特定于域的类型,它们由其他特定于域的类型和域不可知原语组成。

也就是说:如果PHP有一个原生的VehicleTechnicalStatus类型,你只需要使用它,但它不会让你自己滚动。

  

或者我应该将所有这些属性和业务逻辑方法直接放在Vehicle类中吗?

如果在VehicleTechnicalStatus实体之外使用Vehicle - 特别是,如果您希望将VehicleTechnicalStatus作为参数传递给某个函数,那么您可能需要将其视为封装类型,与Vehicle属性包不同。你会失去一些复杂性(两个不同的模块而不是一个大的模块),但你获得了上下文 - 当你处理技术状态时,你可以完全关注你的注意力,而不会分散车辆中其他不相关的领域。