2009-06-06 1 views
2

私はドメインモデリングを初めて利用していますので、いくつかの初歩的な質問をしてください。私の最初の質問は、ドメイン関係をモデル化する時期を知ることです。私は、すべてのクラスが他のクラスと何らかの形で関連しているように見えることがあることが時々分かります。そして、これらの関係を直接(あるクラスのリファレンスを別のクラスに保持することによって)モデル化する必要があるかどうかは不明です。ドメインの関係をモデル化するタイミングとコンテキストリレーションを処理する方法を知ります

たとえば、Ordersのコレクションに関連するPersonクラスがあり、各OrderがProductsコレクションに関連しているとします(想像を絶する例を許してください)。これらのエンティティはそれぞれ、対応するテーブルをデータベースに持っていました。人が(その人の注文によって)関連している商品を扱うクライアントロジックを書いているのであれば、特にこのコレクションを入手するためにSQLを作り出す必要がある場合、Person.Productsコレクションを持っているようですPersons Ordersコレクションを取り戻してください。これはOKか悪い設計ですか?これを処理するにはどうすればよいでしょうか?

第2に、関係が本質的に文脈上の状況はどうですか?前の例では、personメソッドで実行したいビジネスロジックの中に、特定のProduct(つまりPersonのOrdersコレクションのサブセット)を含むPerson関連のOrdersをすべて処理する必要があると説明しています。私は非常に簡単にこのサブセットを正確に返すいくつかのSQLを構築することができます。質問はどこに結果を公開するのですか? Productパラメータを受け取り、クライアントコードがこのように見えるようにOrdersコレクションを返すメソッドをPersonに配置する必要がありますか?

person.OrdersContaining(Product p) 

は、エンティティはそれらの関係の異なるサブセットを公開するために、このような複数の方法を持っているべきか、人は1つだけ注文の収集及びサブセットは他のいくつかの方法で処理する必要がありますか?

おかげ

答えて

0

私はそれが にtemping思わ人 は(その 者の受注を通じて)に関連している製品との 取引がPerson.Productsコレクションを持っていることをいくつかのクライアントロジックを書いていた場合は、 人物注文 コレクションを取り戻す必要がなくても、このコレクションを取得するにはSQL を作成することができます。これはOKか悪い設計ですか? これを処理するより良い方法は何ですか?

ソフトウェアでエンコードする各ファーストクラスの関係は、設計意図とエンティティの適合の仕方についての声明を作成します。人と製品をぴったりと結びつけるのは、最適なものではないと考えられるかもしれません。なぜなら、人を得るたびに製品を手に入れるからです。これは、実際には存在しない人と製品の関係を意味します。

エンティティは、それらの関係の異なるサブセットを公開するために、このような複数の方法を持っているべきか、人は1つだけ注文の収集及びサブセットは他のいくつかの方法で処理する必要がありますか?

私はおそらくエンティティ上に置くのではなく、この種のものを扱うことができるOrderServiceを好むだろう - それはそうでList<Order> OrdersForPerson(Person p)のようなメソッドを持っている、となります。いくつかのフレームワークではエンティティに置くのはもっと慣れていますが、RailsのActiveRecordがここにあります。

People --- Order 

People --- Order --- Product 
):

2

は、私はここでの議論の下に2つの質問を参照してください。 People.getOrders()とOrder.getOrdersForPerson(p)の両方を公開する必要がありますか?

2)。 People.getProductsOrdered()を公開する必要がありますか?

何年も何度もOOを行った後、私は両方の質問に「いいえ」と言います。しかし、私はそれを正当化することはできますか?ヒューリスティクスは私たちをどのように導くだろうか?いくつかの提案:

a)。少ないほうが良いです。すべてのメソッドコスト。開発時間、テスト努力、ドキュメンテーション。あなたが望むものを見つけることは、より多くの方法で難しくなります。

b)。単一の責任。 People.getOrders()とOrder.getOrdersForPerson(p)osの両方が公開されていることを受け入れれば、実際にPeople-Orderの関係を担っているオブジェクトです。私はオーダーが関係するオーダーのの性質だと言うでしょうから、オーダーはその関係を所有するべきです。

c)。デカップリング。忙しい人は多くのものを注文する。おそらく、最終注文や注文サイズなどの追加の基準を取って、quialified getOrders()メソッドを持ってしまうでしょう。それを公開するには、オーダーの属性を使用します。 People.getOrders(criteria)は、今度は注文内容の詳細で表現されます。 Orderを変更する場合は、Peopleを変更する必要があります。カップリングが悪いです!この点は、製品に関する質問に対処しています。オーダーは本質的にプロダクトについて知り、あるレベルのカップリングを持つ必要があることは明らかです。人々はその本質的な関係を持っていないので、それらを製品に結びつけないでください。

d)。規模。人々は多くのことをします。彼らは注文するだけではありません。あなたが行う新しいことごとにPeopleクラスを変更する予定ですか? People.getExpenseReimbursements()、People.getHeathCareClaims()をPeople.getTrips()に追加します。確かにそうではありません。

"SQLで実装するのは簡単です"という議論には向いていません。この議論のレベルでは、良好なインターフェースを考案し、再配置をきれいにすることが重要です。

1

すべての関係はコンテキストに基づいています。

あなたは人が購入した製品のリストを提供し、ユーザーの要求した場合、彼らは定義さ人が製品に関連付けられているコンテキストを持っています。文脈がなければ、関係はありません。

アプリケーションには1つのドメインモデルが存在するという誤解が一般的です。これは真実から遠いものではありません。原則として、にはそれぞれフィーチャの異なるドメインモデルがあります。

の場合は、システムがサポートする機能のうち、のように各機能にアプローチする必要があります。既存のコードを再利用の機会として扱う。もはや、それほどではありません。そして、執拗なリファクタリングで物事を乾かしてください。

+0

非常に真です。適切なモデルはなく、有用なモデルだけです。 – CesarGon

関連する問題