Contents
When an Entity requires domain-specific validation, perform it inside the Entity’s own methods. (エンティティがドメイン固有の検証を必要とする場合、エンティティ自身のメソッド内で実行する)
解説
ドメイン層のエンティティは、自身のビジネスルールを理解し、検証する責任を持つべきです。検証ロジックをエンティティ外部に配置すると、ビジネスルールが分散し、変更時の整合性維持が困難になります。エンティティ内部にドメイン検証を配置することで、ビジネスロジックがカプセル化され、ルールの変更が局所化されます。これは、ドメイン駆動設計における重要な原則です。
具体例
// 悪い例(検証がエンティティ外部)
type Order struct {
Amount float64
Status string
}
func ValidateOrder(order Order) error {
if order.Amount < 0 {
return errors.New("amount must be positive")
}
if order.Status != "pending" && order.Status != "completed" {
return errors.New("invalid status")
}
return nil
}
// 良い例(検証がエンティティ内部)
type Order struct {
amount float64
status string
}
func NewOrder(amount float64) (*Order, error) {
o := &Order{amount: amount, status: "pending"}
if err := o.validate(); err != nil {
return nil, err
}
return o, nil
}
func (o *Order) validate() error {
if o.amount < 0 {
return errors.New("amount must be positive")
}
return nil
}
func (o *Order) Complete() error {
if o.status != "pending" {
return errors.New("only pending orders can be completed")
}
o.status = "completed"
return nil
}
