1

私はDependency Injection の原則を実行しようとしていますが、そうするのに苦労しています。

定期的にデータベースにアクセスして製品のリストを取得し、それらの製品に対して一連のテストを実行して安全性を判断する機能があります。

1 つまたは複数の製品が安全でないことが判明した場合は、ProductRecallオブジェクトをインスタンス化してディスパッチすることにより、リコールを発行する必要があります。

関数は次のようになります: (疑似コード)

void SafteyInspector::CheckProductSaftey()
{
  database.getProducts( list_of_products )

  foreach( list_of_products as p )
  {
    if ( !runBatteryOfTests( p ) )
      unsafe_products.insert( p );
  }

  if ( !unsafe_products.empty() )
  {
    ProductRecall * recall = 
          new ProductRecall( unsafe_products );  // Oh no!
    recall->dispatch();
  }
}

ProductRecall問題は、コールグラフの真ん中にあるオブジェクトを「新規」にしていることです。これは、依存性注入の原則に違反しています。書かれているように、オブジェクトCheckProductSaftey()も作成しないとテストできません。ProductRecall

ただし、安全でない製品のリストを決定するのはオブジェクトであるため、オブジェクトProductRecallをオブジェクトに渡すことはできません。SafetyInspectorSafetyInspector

私はすべてにコンストラクター注入を使用しており、引き続き使用したいと考えています。ProductRecallsまた、いつでも複数発行する可能性があるため、単一のProductRecallオブジェクトをSafetyInspectorat 構造に渡すことは必ずしもできないことに注意してください。

助言がありますか?ありがとう!

4

2 に答える 2