ファクトリ その2
ファクトリその1の続き
設計
1. 不変条件のどれかが満たされずに生成が失敗した場合どうなるかを決める
- 例外をThrow
- Nullを戻す
あまり、Nullは返したくないので、基本は例外を返すですね。
2. パラメータを慎重に選択する
特に、パラメータが新たな依存関係を作っていないかに注意。
安全なのは、構築するオブジェクトの構造の下位部分。
こんなFactoryなら(注:図はValueオブジェクトなど便宜上端折ってます)Customerとか、Itemとか作成しようとしているオブジェクトの構成要素が候補ですかね。
もうひとつは既に集約内で依存関係が出来ている要素ですね。下のファクトリメソッドのような感じです。
(注:図はValueオブジェクトなど便宜上端折ってます)
不変条件のロジックはファクトリが持つかオブジェクトが持つか?
オブジェクトを生成した後に不変条件のチェックが入る場合はオブジェクトが持つのがいいが、生成した後にもうチェックがない場合はファクトリが持つと生成したオブジェクトがシンプルになります。
エンティティファクトリと値オブジェクトファクトリ
値オブジェクトファクトリは値オブジェクトが不変なので、完全にすべての要素を生成する必要があります。
エンティティファクトリは集約を生成するのに必要な本質的な属性だけを受け取ることが多い。その詳細は後から追加すればいいということです。
エンティティと言えば同一性。識別子はプログラムで生成することもユーザーが指定することもできますが、ユーザーが指定する場合はファクトリの引数で渡せばいいですね。
プログラムで生成する場合には、ファクトリの内部で制御するのがよいです。
明日に続く。意外とファクトリの話し深いわ・・・