我有一段伪代码,描述了一个简单的实体 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
}
}
描述、数量、订单日期和发货日期都是从网络表单中读取的,每个表单都是一个文本字段,由多个验证器进行配置:
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”将会是:
class 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 工厂在所有这些中起到了什么作用?
Customer
,但你展示的是Order
的代码。 - Daniel Hilgarth