Object Creation


オブジェクトの生成

CargoのFACTORIESとコンストラクター

色々なオブジェクトの生成方法があっても、原始的な(primitive)コンストラクターを必要とする。その方法はCargoにFACTORYメソッドを作成させる方法と独立したFACTORIESを設けることである。(サンプルコード)両方方法とも空のDelivery HistoryとnullのDelivery Specificationを持ったCargoを生成する。

CargoとDelivery Historyは相互参照の関係である。Cargoを生成するコンストラクターまたはFACTORYの中で、Delivery Historyを生成し、その際コンストラクターの引数にCargo自身を渡すことで相互参照の参照を生成している。(サンプルコード)

Delivery HistoryはCargoからしか呼び出されないので、Cargoのコンポジションは外から見えないようにカプセル化される。

Handling Eventの追加

Handling Eventの原始的なコンストラクターはHandlingを一意に識別するCargoのIDとイベントタイプ、生成時刻の組を引数に指定される。(サンプルコード)

Handling Eventの属性は一度生成されたら変更されることはないので、イベントタイプ毎にHndling Eventに簡単なFACTORY METHODを持つと便利だ。(サンプルコード)

Handling Eventは様々な子クラスを持つので、基底クラスであるHandling EventクラスにイベントごとのFACTORY METHODを追加することでインスタンス生成の実装を抽象化することができる。

残念なことにことは簡単にこれだけで済むわけではなく、、CargoからDelivery History、Delivery HistoryからHistory Eventへの参照と、History EventからCargoへの循環参照はインスタンス生成を複雑にしている。

この循環参照はFACTORYの中で解決されるべきであるが、ここで別の設計の話題に移ることにする。

DDD