19

雇用主を管理ソフトウェアにするプロジェクトを開始したばかりです。私は、情報を見つけることができないように見える、ちょっとした、しかし潜在的に単純なクエリを持っています。

オブジェクト間に双方向の「has a」関係を持たせることは賢明/良い習慣ですか。たとえば、あるClientオブジェクトが' has a' を持ち、Site次にSite'has a'がClientできます。ClientClientSite

public class Client {
    Site site;
}

public class Site {
    Client client;
}

これに異議を唱えるものはありますか (しゃれは意図されていません)、それとも問題ありませんか? 私は現在、プロジェクトのモックアップ UML を作成していますが、これは私を悩ませてきました。

4

5 に答える 5

4

これに異論はありますか、それとも問題ありませんか?

これに対する決定的な答えはありません。最良の答えは、アプリケーションの設計によって異なります。

いつ使用するか

オブジェクトClientがオブジェクトに移動し、Siteオブジェクトがオブジェクトに移動する必要がある場合、コード内の現在の例は問題ありSiteません。Clientそれでも、おそらくこれらの要素を関連付ける何らかの方法が必要になるでしょう。おそらく、クラスの 1 つまたは両方に id フィールドを追加することによってです。

Hibernate のようにクラスを自動的にバインドするのに役立つフレームワークを使用している場合は、循環参照を維持することは問題になりません。

使用しない場合

無限ループが発生するため、基本的にテキストのシリアライズ用です。Raibaz's answerで既に述べたように、Jackson のようなライブラリは、シリアル化ClientまたはSiteJSON 文字列へのクラス化中に無限ループに陥ります1。これはString、XML で JAX-WS Web サービスを介してオブジェクトを渡すなど、他のデータにシリアル化する場合にも有効であることに注意してください (詳細: jax-ws Web サービスのジェネリック クラスはどうなりますか? )。

1これは、@SimonAndréForsberg が指摘したように、Jackson ライブラリなど@Somethingの特定のライブラリに属する​​注釈 () を使用して解決できますが、このソリューションの欠点は、クラスがライブラリと密結合することです。@JsonManagedReference@JsonBackReference

于 2013-08-09T14:38:12.863 に答える
2

オブジェクト間に相互関連があることはよくあることです。

たとえば、一部のユーザー インターフェイス ツールキットでは、ビジュアル コンポーネントがその子への参照を持ち、各子がその親への参照を持つ場合があります。

has-aという用語は、あるオブジェクトの所有権を別のオブジェクトに伝えるためによく使用されます。これが当てはまる場合、関係は通常一方向です。

これらの用語の適切な定義の 1 つは、Booch、Rumbaugh、および Jacobson による「The Unified Modeling Language User Guide」に記載されています。

集約 -- 2 つのクラス間の単純な関連付けは、ピア間の構造的な関係を表します。つまり、両方のクラスが概念的に同じレベルにあり、どちらが重要かということはありません。場合によっては、1 つのクラスがより大きなもの (「全体」) を表し、小さなもの (「部分」) で構成される「全体/部分」の関係をモデル化したい場合があります。このような関係は集約と呼ばれ、全体のオブジェクトが部分のオブジェクトを持つことを意味する「has-a」関係を表します。

于 2013-08-09T14:27:44.720 に答える
2

それは一般的ですが、子オブジェクトをその親からどの程度疎結合にするかを検討します。子オブジェクトから親への参照がある場合、別の親/親なしでオブジェクトを再利用することはできません。

于 2013-08-09T14:36:33.273 に答える
1

可能な限り、一方通行の関係に固執するようにします。双方向の関係では、2 つのクラスが結合され、そのうちの 1 つが変更されると、もう 1 つのクラスが 2 つ変更されます。そのような関係が本当に自然なのか自問自答してください...

必要な場合は、両方がインターフェイスであるか、少なくとも 1 つがインターフェイスであることを確認してください。

于 2013-08-09T14:37:50.077 に答える