いくつかの依存関係を持つクラスがあります。現在、これらはコンストラクターで設定されています。
class Thing
{
public function __construct()
{
$this->dependencyA = new DependencyA();
$this->dependencyB = new DependencyB();
$this->dependencyC = new DependencyC($this);
$this->dependencyD = new DependencyD($this);
}
}
これは IoC と DI に関して設計が不適切なので、依存関係がコンストラクターに存在するように再設計したいと考えています。
public class Thing
{
public function __construct(
$dependencyA, $dependencyB, $dependencyC, $dependencyD)
{
$this->dependencyA = $dependencyA;
$this->dependencyB = $dependencyB;
$this->dependencyC = $dependencyC;
$this->dependencyC->setThing($this);
$this->dependencyD = $dependencyD;
$this->dependencyD->setThing($this);
}
}
これにより、テストがはるかに簡単になりますが、クライアントがすべての依存関係をインスタンス化する必要はありません。これらは厳密に の内部クラスですThing
。以下で提案されているように、これは静的ファクトリの良い候補でしょうか? ただし、これにより、依存関係として必要なThing
依存関係をインスタンス化する方法が変更されます (つまり、コンストラクターではなくセッターを介して依存関係を設定する必要があります)。私が提案する解決策は以下のとおりです。より良いアプローチはありますか?
private class Thing
{
public function __construct(
$dependencyA, $dependencyB, $dependencyC, $dependencyD)
{
$this->dependencyA = $dependencyA;
$this->dependencyB = $dependencyB;
$this->dependencyC = $dependencyC;
$this->setThing($this);
$this->dependencyD = $dependencyD;
$this->setThing($this);
}
public static function createThing()
{
return new Thing(
new DependencyA(),
new DependencyB(),
new DependencyC(),
new DependencyD());
}