web-dev-qa-db-ja.com

Javaコンポーネント間を通過するデータの疎結合

2つのコンポーネントが互いに通信しているとしましょう。最初のものは2番目のものから「結果を取得」関数を呼び出します。結果を返すにはどうすればよいですか?

例えば、

SomeObject getResults(String name);

うまくいきますが、それが最善の方法かどうかはわかりません。この方法では、両方のコンポーネントがSomeObjectタイプに結合されているように見え、私は本当にそれを避けたいと思っています。しかし、代替案は何でしょうか?

結果をListとして返すこともできますが、これにより結果を解釈する責任が最初のコンポーネントに移ります。

それで、どうすればいいですか?この種の問題に最適な設計アプローチは何ですか?

2
Cap Baracudas

完全な分離などはありません。関数から返されるデータに意味を与えるには、それを何らかの方法で解釈する必要があります。これは、データに関するある種の事前知識があることを意味します。

したがって、トレードオフを比較検討する必要があります。

DTOを使用した密結合

  • タイプセーフティ
  • 使いやすさ
  • ハイパフォーマンス
  • データ型の急増

動的オブジェクトを使用した疎結合

  • 交換、相互運用、モジュール化が簡単
  • よりシンプルなインターフェイスコントラクト
  • パフォーマンスが低い
  • より複雑

必要に応じて、エンコードされたすべてのテキストをテキストとして(つまり、シリアル化して)受け渡し、受信側でデコードすることにより、最大限のデカップリングを提供できます。しかし、これは計算が非常に複雑でコストがかかるため、通常は、高度なデカップリングの利点がコストを上回るマシン境界でのみ使用されます。

さらに読む
プロトコルバッファ

3
Robert Harvey

疎結合の概念は、他のオブジェクトに関する知識を削除することではなく、その知識(したがって疎結合および高い凝集力はしばしば一緒に議論されます)。通常、完全な分離はドメインオブジェクト(dataを保持するJavaクラス、たとえば、Student、Car、Job、Result)には適用されません。重要な点は、ドメインオブジェクトを処理するさまざまなクラスが独立するように、動作を分離することです。

例:ドメインオブジェクトStudentの場合、学生が卒業する資格があるかどうかをチェックするソフトウェアを実装している可能性があります。これには、彼が十分なクレジットポイントを持っているかどうか、およびクレジットポイントのすべての請求書が支払われたかどうかを確認することが含まれる場合があります。どちらの条件もクレジットポイントを扱いますが、ビジネス的には非常に異なる条件をチェックします。したがって、これらのチェックを互いに別々に構築したいとします。

ドメインオブジェクトからの依存関係を減らす方法はinheritanceを使用することです。たとえば、未払いのStudentsをすべて返したいが、ProfessorsとContractorsにも適用される一般的なシステムを使用している場合彼らに同じインターフェースを実装させる、例えばStudent implements Payee。そうすれば、特定のクラスの代わりに常にPayeeを返すことができます。

あなたの例では、SomeObjectSomeSpecificInterfaceに実装し、そのインスタンスを返します。

1
MF.OX