我在伪代码中有一个简单的实体: Order
class Order{
private int quantity;
private Date orderDate;
private Date shippingDate;
public Order(int quantity, Date orderDate, Date shippingDate){
if(quantity <= 0){ throw new Exception("Invalid quantity")}
if(shippingDate < orderDate){ throw new Exception("Invalid shippingDate")}
if(...more validation...){....throw Exceptions...}
//assign values if everything is OK
}
}
description、quantity、orderDate 和 shippingDate 都是从 Web 表单中读取的,每个表单都是由多个验证器配置的文本字段:
quantityField= new TextField('txt_quantity');
quantityFiled.addNotNullValidator().addNumaricValidator().addPositiveIntegerValidator()
如您所见,验证逻辑在TextField
验证和实体验证之间是重复的。我试图通过创建类、类和类
来将值对象的概念引入我的实体。所以我的实体变成了这样:Quantity
OrderDate
ShippingDate
Order
class Order{
private Quantity quantity;
private OrderDate orderDate;
private ShippingDate shippingDate;
public Order(Quantity quantity, OrderDate orderDate, ShippingDate shippingDate){
//assign values without validation I think??!!
}
}
例如,类 Quantity 将是:
类数量{
private int quantity;
public Quantity(int quantity){
if(quantity <= 0){ throw new Exception("Invalid quantity")}
this.quantity=quantity;
}
}
现在的问题:
- 聚合根不应该是负责验证整个聚合的吗?我的
Quantity
班级不是违反了吗? - 如何
Quantity
在 Web 表单验证的构造函数中重用验证?我认为验证代码是重复的,所以我怎样才能验证一次或至少重用验证逻辑。 - 由于所有值对象都将验证自己,这是否意味着我不应该验证实体中的任何内容?
- 由于
ShippingDate
依赖于OrderDate
验证,我应该如何验证发货日期? - DDD 工厂适合所有这些吗?