0

私は繰り返しこれに似たシナリオに遭遇します:

階層をモデル化するコンテナビジネスクラス。

この階層に参加し、前述のクラスによって集約されるビジネスクラス。

例を挙げましょう。

AMapには国があります。すべての国を含むことに加えて、その主な責任はそれぞれの場所と近接性を知ることであるため、ここでそれぞれがどこMapにあるかを知る必要があります。Countryこの観点から、などの機能は。isNeighbour(Country A, Country B)への正しい追加のように見えますMap。ただし、各国は、国が近くにあるかどうかを知る方法も提供する必要があります。言うspain.isNeighbour(italy)。これは確かに便利です。さて、機能と責任を複製したくない場合、どのようなアプローチを取るべきですか?

私が取り組んでいる現在の例は私の大学のためのものであり、各コースには他のコースが必要であり、次のレベルのコースもブロックします。メジャーは、すべてのコースを含み、どのコースがどのコースに先行するかを指示するものです。あるコースの依存関係を別のコースに追加したいとします。たとえば、Calculus 2を取得するには、Calculus 1が必要です...行っcalculus.addRequired(calculus2)てから、それを主要なオブジェクトに渡す必要がありcomputerScience.addRequired(calculus1, calculus2)ます。

エラーにつながる可能性があるため、両方の選択肢は必要ありませんが、同時に、各コースがその要件に答えられるようにしたいと思います。責任を正しく分配する方法がよくわかりません。

4

2 に答える 2

2

まず第一に、お互いに電話をかけるのに問題はないということです。

あなたが持つことができます

boolean Map.isNeighbour(Country A, Country B) { return A.isNeighbour(B); }

また

boolean Country.isNeighbour(Country other) { return map.isNeighbour(this, other); }

2番目は世界地図への参照が必要なようです。まず、マップを単純なファサードのように見せます。

第二に、あなたはそれが持続していると言うことです。関連するパラメータを使用してDBにクエリを実行するサービスを作成することもお勧めします。これは、マップまたはリポジトリサービスのいずれかです。これにより、完全なオブジェクトではなく、エンティティのID(countryIdなど)のみを使用してクエリを実行することもできます。

私はどちらの解決策も良くも悪くもないと信じています。唯一の違いは、他の開発者がメソッドの配置を期待しているところです。しかし、私がそれについて考えるとき、これは、特にそれが国の方法へのコールスルーでない場合、マップが国のすべての責任を持ち、したがってSRPを破ることを意味します。

于 2012-12-31T07:39:42.060 に答える
1

isNeighbour()メソッドをに入れCountryます。 Country隣人の地図が含まれます。そして、コンテナは問題の国のインスタンスでこのメソッドを呼び出すことができます。

このように、ロジックは国によって維持され、コンテナは単に国に質問に答えるために委任します。

コースの場合、Major-1のCourse-2にはCourse-1が必要ですが、Major-2では必要ない可能性があります。この場合、別のクラスを紹介します。たとえば、CourseInMajorには、特定のメジャーの特定のコースに必要なコースが含まれます。

于 2012-12-31T08:08:48.110 に答える