背景
別のプロジェクトでICircularBuffer
という循環バッファ用に定義されたインターフェイスがあります。このICircularBuffer
は私たちがいたるところで使用しているものなので、CommonInterfaces
プロジェクトにあります。
さて、いくつかの非常に異なる機器を制御する別のインターフェースIEquipmentController
があります。この機器はいくつかのデータを生成します。バッファをIEquipmentController
に渡して、渡したスレッドからの参照によってバッファを非同期に読み取ることができるようにします。
問題は、IEquipmentController
とICircularBuffer
が2つの別々のプロジェクトで定義されていることです。だからこれは私の質問に私を導きます...
質問
CommonInterfaces
は至る所でどのように使用されているので、私のIEquipmentController
のプロジェクトがCommonInterfaces
プロジェクトに依存することは問題ありませんか?
または
たぶん、具体的なEquipmentController
にCommonInterfaces
...への依存関係をとらせてから、IEquipmentController
にバッファにアクセスするメソッドを定義させることができますか?したがって、実装の詳細を知らないままです(そして参照による受け渡しを完全に避けます)?この方法では、2つのインターフェース(IEquipmentController
とICircularBuffer
)が結び付けられないでしょう。
ここでの私の最善の選択肢は何ですか?そして、一般的に、インターフェイスが別のインターフェイスにアクセスするためだけに別のプロジェクトに依存することが良い考えである状況はありますか?
このタイプの依存関係には2つのオプションがあります。
バッファを受け入れるコントローラインターフェイスでメソッドを定義できます。これにより、モジュール間の結合が増加し、mayは、依存関係とコード変更に関して波及効果があります。既存の実装は更新する必要があり、バッファを気にしない可能性があります。
すべてのサブクラスでバッファを使用できますか? 「バッファーの使用」はコントローラーの機能の一部ですか?もしそうなら、これは理にかなっているかもしれません。
インターフェイスはそのままにして、バッファを実装のコンストラクタに渡します。これにより、モジュールの結合や既存のクラスの更新が回避されます。
特定の実装のみがバッファを処理する場合、またはモジュール間の変更を制限する必要がある場合、これはより強力なソリューションです。
CommonInterfacesはあらゆる場所でどのように使用されているので、IEquipmentControllerのプロジェクトがCommonInterfacesプロジェクトに依存することは問題ありませんか?
もちろん。これが、CommonInterfacesのようなプロジェクトの要点です。これらのインターフェイスをさまざまなプロジェクトで自由に再利用できるようにする必要があります。
ただし、より一般的なインターフェースを返すことを検討することをお勧めします。プロジェクトの依存関係を避けたいからではなく、実装の詳細が漏れないようにしたいからです。 IEquipmentController
のユーザーは、ICircularBuffer
を使用していることを本当に知る必要がありますか? ICircularBuffer
はおそらくIList
を実装します(または実装する必要があります)。おそらく、代わりにバッファをリストとして返すのが理にかなっています。