依存関係の逆転は良いです、それは:
これらの理由により、クラス内でオブジェクトをインスタンス化することは避けています。代わりに、依存関係としてファクトリクラスを渡すことを好みます。ただし、オブジェクトの種類によってはこれが過剰かどうか疑問に思っています。
値オブジェクトは、定義により、単純な構造を持つ単純なオブジェクトです。
私の経験では、インスタンス化ロジックに複雑さはほとんどありません。値オブジェクトは他のデータ型と見なすことができるため、ユニットテストは危険にさらされず、すべてのクラスは何らかの説明のデータ型に依存する必要があるため、結合は問題ではありません(警告、My Concernを参照)。
関連する特別なケースは、コレクションオブジェクトのケースです。
私の意見では、値オブジェクトのようなコレクションオブジェクトは、実際のインスタンス化を必要としないということです。実際には、特殊な形式の配列です。値オブジェクト。
class PencilCase
{
private $pencils=[];
public function construct()
{
// blah blah
}
public function emptyPencils()
{
$pencils = $this->pencils;
$this->pencils = [];
return new PencilsCollection($pencils);
}
}
class PencilsCollection implements \Traversable
{
public function __construct($pencils=[])
{
// blah blah
}
}
使用されているデータ型の一部を提供しているパッケージを変更したい場合があるため、一般にこのタイプの結合を回避しました。上記の例では、Dixon
によって提供される値オブジェクトを使用していて、Staedtler
によって提供される値オブジェクトに変更する場合があります。
このタイプのリファクタリングは高価になる可能性があります。
ファクトリーと注入された依存関係を持つ値とコレクションオブジェクトをインスタンス化する必要がありますか、それともクラス内でインスタンス化する必要がありますか?
ファクトリーで値とコレクションオブジェクトをインスタンス化する必要があります[..]。
いいえ、通常、値オブジェクトの作成は非常に簡単で、ファクトリーは必要ありません。
ほとんどの場合、値オブジェクトと必要な依存関係をインスタンス化する Money :: fromString() のような、ある種の静的コンストラクタを使用します。
[..]注入された依存関係、またはクラス内でインスタンス化する必要があります
ユースケースによって異なります。前述のMoney
を使い続けましょう-ちょうど金額があり、Currency
が別のソースから取得されるユースケースがある場合があります。そのような場合-Currency
をMoney
コンストラクターに整数で注入します。
また、通貨コード付きの金額を含む文字列があり、Money::fromString
を使用して、内部でCurrency
インスタンスを作成する場合もあります。
同じことがコレクションにも当てはまります。検証が必要な値オブジェクトの配列よりも特定のインターフェイスを期待する方が簡単だからといって、一部のコレクションがクラス内でインスタンス化されてから注入されるという状況になります。