PHPのアプリケーションのアーキテクチャについては約12の記事が執筆されていますが、JavaとC#の開発者はこの問題に焦点を当てています。 その本質は、あるプロパティが別のプロパティに厳密に依存していることにあります。
次の状況を想像してください。
セッターを使用する<?php class Page { private $content; public function setContent($content) { $this->content = $content; } } class PageBuilder { private $page; public function setPage($page) { $this->page = $page; } public function setContent($content) { $this->page->setContent($content); return $this; } public function build() { return $this->page; } }
$pageBuilder = new PageBuilder(); $pageBuilder->setPage(new Page()); $pageBuilder->setContent('Test content'); $pageBuilder->build();
この例は、
$ pageBuilder-> build()が潜在的に危険であり、
$ pageBuilder-> setPage(new Page())が以前に呼び出さ
れなかった場合、致命的なエラーにつながる可能性があることを示しています。 もう1つのよくある間違いは、
init()または
初期化()メソッドの使用です。
$pageBuilder = new PageBuilder(); $pageBuilder->init(); $pageBuilder->setContent('Test content'); $pageBuilder->build();
init()メソッドの呼び出しを忘れると、問題も発生します。 このコードは、貧弱なアプリケーションアーキテクチャの好例です。 初期化メソッドは、定義によるものではないコンストラクターのように動作しようとします。
時間的カップリングを回避するには、常にルールを使用する必要があります。
- クラスインスタンスは、作成後すぐに使用できる状態になっている必要があります。
- コンストラクターは、クラスプロパティの初期化以外のロジックを実行しないでください。
コンストラクター依存性注入
このソリューションは、ほとんどの場合最適であり、推奨されます。 Symfony、Laravel、またはその他の最新のフレームワークの依存性注入メカニズムを使用できます。
抽象工場
抽象ファクトリーを追加して、コードを少し変更します。
ご覧のとおり、
Pageクラスのインスタンスは明示的な呼び出しなしで作成され、ビルダーで使用できます。
おわりに
アプリケーションの複雑さ、コードレビュー、またはその他の要因に関係なく、一時的なカップリングは常に回避する必要があります。 また、コンストラクターは注入に関連するロジックのみを実行する必要があることを忘れないでください。 そうしないと、クラスのインスタンス化中にパフォーマンスが低下するリスクがあります。
便利なリンク