📚
DDDにおける集約について
集約とは?
一貫性を保つためにまとめて管理されるオブジェクトの集合のこと。
DDDでは集約ルートが唯一の入口となり、外部から内部のエンティティや値オブジェクトに直接アクセスすることを禁止する。リポジトリ操作の単位とも言える。
具体例
注文(Order)と注文商品(OrderItem)に関する集約について具体例を記載する。
Orderを集約ルートとし、OrderItemが内部のエンティティとする。
Order集約ルート
package entity
type Order struct {
id int
customerID int
items []*OrderItem
}
OrderItem内部エンティティ
package entity
type OrderItem struct {
id int
productID int
quantity int
price int
}
func (i *OrderItem) ChangeQuantity(newQty int) error {
if newQty <= 0 {
return errors.New("quantity must be greater than zero")
}
i.quantity = newQty
return nil
}
- OrderItemは単独では使われず、必ずOrderのitemsとして管理される。
- ChangeQuantity()は OrderItem内でのみ呼ばれる内部メソッド。
Orderリポジトリインターフェース
package repository
type OrderRepository interface {
Save(order *entity.Order) error
FindByID(id int) (*entity.Order, error)
}
- Save()はOrder集約をまとめて保存する(OrderItem など内部エンティティを意識しない)
- FindByID()はOrder単位で取り出す(内部のitemsも含まれるが、呼び出し側は集約ルートを通して操作)
Discussion