私は擬似コードで単純なエンティティを持っています: 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 ファクトリーは、これらすべてのどこに当てはまりますか?