オブジェクトモデルの「ビューポイント」
-
22-09-2019 - |
質問
我々は2つのドメインの種類があります。のユーザーと場所の
私たちは、のLocationRepository の上のメソッドを持っています。のGetUserLocations()の
既存の実装ます:
var user = UserRepository.GetUser(userId);
var locations = LocationRepository.GetUserLocations(userId);
私には、のユーザーのからユーザーに関連付けられている場所を検索するために、より理にかなっているすなわちを入力します。
var user = UserRepository.GetUser(userId);
var locations = user.GetLocations();
私は後者の実装がよりきれいに読み込み、APIクライアントとして、私は少数の種類(すなわち、のLocationRepository は必要ありません)に対処しなければならないと思います。私はのLocationRepository のに「ファサード」を記述する必要があります一方、維持するために、より多くのコードが存在します。
私の本能に万一Iの行為とのLocationRepository からユーザーのタイプのファサードを作成するか、または私は現状に満足してシーケンス図でライブする必要があります?
(それは間違っている「の視点」から取得されているように、すなわち検索位置情報フィールの)ことは私に間違った「と感じています」解決
私は、保守性の観点からこれを接近するでしょう。私はLocationRepositoryのファサードでそれをやってすることは「右に感じる」ということに同意し、おそらくコードは少し読みやすくなります。
トレードオフは、あなたが言ったように、維持するために、より多くのコードになります。しかし、我々は約どのくらいのコードを話していますか?それはたくさんある、とあなたは、多くの場合、それを更新する必要があるでしょうか?それとも、一度それを書いて、それを忘れて、それが簡単にユニットテスト可能持つことができますか?それはかつてのなら、それを飲み込む、現在の実装で行く、そしてそれは本当に機能には影響しません自分自身を思い出させます。それは後者だ場合、それは価値が他の場所でその良い感じ、より読みやすいコードのための努力に入れている可能性があります。
他のヒント
それは私たちのものをモデル化するために確かに可能である何かます:
Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
.Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
.OfType<User>().CreateNew("John Doe");
多分リポジトリインスタンスは「エンド開発者」に表示されてはならず、モデルの中にカプセル化されます。
しかし、私たちはUniverse.Instance
への容易なアクセスを持っていない可能性がありますので、我々は実際にどのようなデータを取得する場所する必要がある1つまたは複数の「エントリポイント」を行います。
UPDATE:
私は唯一の「ビンビンバンがあると想定しているとしてそれは、近い現実の世界に来るので、可能な限り低いとしてそこに「リポジトリファサードのエントリポイント」の数を維持するための目標とすべき一方ではと思います「どこすべてがから来て、最終的にはすべての既存のデータを生み出した;-) ...現実の世界をモデル化する能力が限られているので、当然の一方で、今日のシステムは、常に我々が行う必要があり、大きな妥協している、と述べた。すなわち、 ...
上のパフォーマンスへの影響などがあります :あなたがあなたの具体的な例では行くことができます。一つの方法は、しかし、のように、常に最新のデータを取得するためのあなたのリポジトリを使用することです
LocationRepository.Instance.GetUserLocations(userId);
...あなたがのように、プロパティに結果を保持するために、あなたのUser
モデルクラスを使用するのに対します:
var locations = myUser.Locations;
このプロパティは、最初の要求でLocationRepositoryからデータをロードして、結果を保持するために遅延ロード技術を使用します。簡単にあなたのライブラリーを使用する開発者のために何かを作る場所は一度だけロードされていることをこれが通信します、。あなたはLocationRepository.GetUserLocation(のuserId)もエンドの開発者には見えないかにしたい場合は、その後、決めることができます。そのルートを行くときあなたはまた、いくつかの暗黙のの種類だけでなく、明示的なリフレッシュメカニズムと寿命管理を構築する必要があることに注意してください。
このオーバーすべてのアプローチは、私にとって非常に有用であることが証明されています。このような性質はもう1行のコードで新しい値で瞬時に同期リフレッシュすることができないようしかし、らのSilverlightの非同期世界は今、いくつかの新しい警告を追加します。私たちはリフレッシュを要求すると、我々は今、レバレッジ結合技術を有し、および/またはその後、リフレッシュ値をさらに処理できるように、コールバックを使用します。
すべてのすべてで、私は信じている究極の目標は、まだ新しいシングルUserRepository
インスタンスを作成し、ユーザーのストレージに追加し、同様にして明らかに責任を持って、ちょうど別の通常のドメインの種類として例えばUser
を見ることであろう使用可能なすべてのユーザーにフィルタされたビュー(クエリ)を提供します。 myUser.Locations
ならびにmyLocations.ByUser["John Doe"]
が同じ結果への参照を保持することを許容されるであろう。このUserRepository
は、単に例えばCompanyStaff
のように、それを保持するための責任が別のクラスのプロパティである可能性があります。さらにそのアイデアを運ぶと、そのUniverse.Instance
の事を私にもたらしたものです。 ; - )