2017-05-19 1 views
1

This video Googleのクリーンコード会談では、newはテストには悪いと言われています。新しいキーワードを避けて、別のパターン(工場など)を使用すべきですか?

PHPの良い習慣は何でしょうか?ファクトリクラスを作成して、それぞれのメソッドを持つ異なるオブジェクト型をインスタンス化して、疎結合を可能にする必要がありますか?または、newインスタンスを初期化する単一のメソッドを持つジェネリック初期化メソッド(オートローダー?)が適切ですが、後者には戻り値の型が指定されていないため、IDEのコード補完が暗くなります。

+1

そのビデオの長さは50分以上です。 **なぜ彼らは 'new'キーワードが悪いと思うのですか**要約できますか? – rickdenhaan

+0

TL; DR:指定されたクラス名と緊密に結合し、テストするのが非常に難しい –

答えて

2

ビデオが正しいです。コードの一部にnewがある場合はいつでも、テストするのが難しくなります。基本的には、テストしているものをそのクラスから分離する方法はありません。これは、あなたのユニットテストが実際に信頼できるものであるためには、そのクラス(あなたのnewステートメントにあったもの)を十分にカバーする必要があることを意味します。

すべてのインスタンスを(クラスまたはメソッドのいずれかの)依存関係として渡すのが最も良いオプションですが、通常は特定のレイヤーでのみ機能します。たとえば、正しく書かれていれば、コントローラーをすべてnewステートメントから取り除くことは非常に簡単です。コンストラクタ内の依存関係としてサービスを渡すだけで、Requestアブストラクションまたは明示的な値を "アクションコール"に渡します。

したがって、(おそらくいくつかのDIコンテナを使用して)依存関係を渡すことが最良の方法です。テストするのが最も簡単です。しかし、これは普遍的に利用可能ではありません。

残りのコードは、おそらくnew演算子と工場の組み合わせで(少なくとも部分的に)終了します。

あなたは工場で::classを使用してのDocblockコメントを追加することの両方によって、IDE関連の問題を軽減することができます。

/** @var \Mapper\SalesSomething\Invoice $invoice */ 
$invoice = $this->factory->create(Invoice::class); 

私の個人的な好みは、次のとおりです。

  • コントローラ:のみを経由して、依存関係などの関連オブジェクトDIC
  • サービス:マッパーのための工場、依存関係のあるリポジトリ、ドメインエンティティnew
  • マッパーは:工場

経由しかし、それはちょうど私のアプローチ

です:DIC経由でのみ依存関係として
  • プレゼンテーションオブジェクト/ウィジェットを関連オブジェクト:依存関係のない
  • ビュー:唯一のコンストラクタに
  • エンティティの依存関係します
  • +0

    あなたの洞察を共有してくれてありがとう。 docblocksを追加すると、すでにEclipse用のトリックが実行されます。 – Code4R7

    関連する問題