📚

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