2つのコンポーネントが互いに通信しているとしましょう。最初のものは2番目のものから「結果を取得」関数を呼び出します。結果を返すにはどうすればよいですか?
例えば、
SomeObject getResults(String name);
うまくいきますが、それが最善の方法かどうかはわかりません。この方法では、両方のコンポーネントがSomeObject
タイプに結合されているように見え、私は本当にそれを避けたいと思っています。しかし、代替案は何でしょうか?
結果をList
として返すこともできますが、これにより結果を解釈する責任が最初のコンポーネントに移ります。
それで、どうすればいいですか?この種の問題に最適な設計アプローチは何ですか?
完全な分離などはありません。関数から返されるデータに意味を与えるには、それを何らかの方法で解釈する必要があります。これは、データに関するある種の事前知識があることを意味します。
したがって、トレードオフを比較検討する必要があります。
必要に応じて、エンコードされたすべてのテキストをテキストとして(つまり、シリアル化して)受け渡し、受信側でデコードすることにより、最大限のデカップリングを提供できます。しかし、これは計算が非常に複雑でコストがかかるため、通常は、高度なデカップリングの利点がコストを上回るマシン境界でのみ使用されます。
さらに読む
プロトコルバッファ
疎結合の概念は、他のオブジェクトに関する知識を削除することではなく、その知識(したがって疎結合および高い凝集力はしばしば一緒に議論されます)。通常、完全な分離はドメインオブジェクト(dataを保持するJavaクラス、たとえば、Student、Car、Job、Result)には適用されません。重要な点は、ドメインオブジェクトを処理するさまざまなクラスが独立するように、動作を分離することです。
例:ドメインオブジェクトStudent
の場合、学生が卒業する資格があるかどうかをチェックするソフトウェアを実装している可能性があります。これには、彼が十分なクレジットポイントを持っているかどうか、およびクレジットポイントのすべての請求書が支払われたかどうかを確認することが含まれる場合があります。どちらの条件もクレジットポイントを扱いますが、ビジネス的には非常に異なる条件をチェックします。したがって、これらのチェックを互いに別々に構築したいとします。
ドメインオブジェクトからの依存関係を減らす方法はinheritanceを使用することです。たとえば、未払いのStudent
sをすべて返したいが、Professor
sとContractor
sにも適用される一般的なシステムを使用している場合彼らに同じインターフェースを実装させる、例えばStudent implements Payee
。そうすれば、特定のクラスの代わりに常にPayee
を返すことができます。
あなたの例では、SomeObject
をSomeSpecificInterface
に実装し、そのインスタンスを返します。