Son*_*ngo 6 language-agnostic oop domain-driven-design
我有一个伪代码中的简单实体 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
}
}
Run Code Online (Sandbox Code Playgroud)
描述、数量、订单日期和发货日期都是从 Web 表单中读取的,其中每个都是由多个验证器配置的文本字段:
quantityField= new TextField('txt_quantity');
quantityFiled.addNotNullValidator().addNumaricValidator().addPositiveIntegerValidator()
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,验证逻辑在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??!!
}
}
Run Code Online (Sandbox Code Playgroud)
例如,类数量将是:
类数量{
private int quantity;
public Quantity(int quantity){
if(quantity <= 0){ throw new Exception("Invalid quantity")}
this.quantity=quantity;
}
Run Code Online (Sandbox Code Playgroud)
}
现在的问题是:
Quantity我的班级是不是违反了这一点?QuantityWeb 表单验证的构造函数中重用验证?我认为验证代码是重复的,所以我如何验证它一次或至少重用验证逻辑。ShippingDate取决于OrderDate验证,我应该如何验证发货日期?Quantity在您的领域中不能为负数,无论上下文如何,这都是完全有道理的Quantity用于确保应用程序正确使用该类。它抛出异常,这些异常是针对异常状态,而不是针对预期的工作流程。因此,它的用途与 Web 表单验证完全不同,Web 表单验证可确保用户正确使用您的应用程序。它期望无效输入并处理它。我在这里没有看到真正的重复,至少没有看到可以在不违反单一责任原则的情况下消除的重复。if(shippingDate < orderDate)计划如何在值对象中验证这一点?Date。