MVC:完全に実装されたモデルまたは部分的に満たされたモデル?


10

これは長い間私を悩ませてきました。MVCプログラミングを行うとき、プログラミングの実践として優れていると思いますか?特にこの特定のタスクのために、他に5つあるモデルオブジェクトの2つのフィールドのみが必要であることがわかっている場合、完全に入力されたモデルまたは部分的に入力されたモデルを使用する必要がありますか?

ほんの数個のモデルオブジェクトが必要になることがわかっている場合に、20個のモデルオブジェクトのリストにデータベースのすべての値を入力することは、犯罪のように思われることがあります。

もちろん、部分モデルは、すべてをフェッチするメソッドとは別に、DAOにもう1つのメソッドを記述する必要があることを意味します。維持するコードが増えるということですか?

一方、完全にモデルが設定されたDBからすべてを取得するということは、1つの方法ですべてを処理できることを意味しますが、これにより明らかにパフォーマンスのオーバーヘッドが発生します。

私はORM(HibernateやActiveRecord of Railsなど)がMVCプログラミングの傾向を支持しており、GoogleのBigTableフルモデルのようなデータベースが受け入れられる傾向を示しています。しかし、古き良きJDBCをまだ使用している場合はどうでしょうか。

ハードウェアは安価で、開発にはコストがかかります。アプリが1時間あたり数十万リクエストにスケーリングする必要がある場合でも、それは本当ですか?


1
「一方で、モデルが完全に入力された状態でDBからすべてを取得するということは、1つの方法ですべてを処理できることを意味しますが、これにより明らかにパフォーマンスのオーバーヘッドが発生します。」このプラクティスのパフォーマンスオーバーヘッドを測定しましたか?
S.Lott、2011

>>本当?このプラクティスによるパフォーマンスのオーバーヘッドを測定しましたか?<<-これは予想されていました。いいえ、していません。しかし、測定し、それ以外の場合は間違っていることが証明されると興味深いでしょう。
Pritam Barhate

オーバーヘッドが存在しないことを証明するのは困難です。状況によっては測定値が有効でないと主張する多くの詳細を簡単に理解することができます。データベースやアプリケーション言語などの「典型的な」設定を使用し、実際のオーバーヘッドが何であるかを示すために好みの構成をプロファイリングすると、測定から除外したさまざまな要因をくまなく調べる必要がなくなります。 。
S.Lott、2011

1
msdn.microsoft.com/en-us/magazine/ee236638.aspxで、ドメインモデルを公開することとDTOを送信することの問題を扱った優れた記事を見つけました。
Mayo

回答:


3

次の2つのオプションがあります。

1)モデルの一部のフィールドを未入力のままにします

2)特定の状況に合わせて追加の「ライト」モデルを作成する

どちらを選択するかは、次の2つの要素によって異なります。

a)「フル」モデルのフィールドがいくつ無視されるか

b)この「ライト」モデルがインスタンス化される頻度

未入力のフィールドが2つ以上ある場合は、1)で問題ありません。

b)が例外的な個別の状況である場合、1つの使用例だけのために追加のモデルを作成しても意味がありません。

別のアプローチは、「ライト」モデルを定義し、それから「フル」モデルを継承することです。


答えてくれてありがとう。必要に応じて軽量モデルを作成することは理にかなっています。しかし、時々私はそのような戦略があまりにも多くのモデルクラスを作成しないのだろうか?特に、ビジネスロジック固有のモデルではなく、ビュー固有のモデルを作成している場合はなおさらです。
Pritam Barhate

3

ビューがモデルの2つのプロパティのみを必要とする場合、(おそらく)そのユースケースに対して間違ったモデルがあります!ビューに合わせてモデルを作成し、追加のDBルックアップを保存して、必要なデータのみを入力することを検討します。後続のビューにさらに詳細が必要な場合は、質問する必要があります。後で追加のデータを取得するか、それともすべて前に取得する必要がありますか?

別の方法として、ある種の遅延評価を見ることができるので、必要なときに値が入力されます。これはうまく機能しますが、明らかにより多くの作業であり、DBへの複数のラウンドトリップを引き起こす可能性があります。

つまり、基本的にテーブルまたはビューからいくつかの追加フィールドを選択している場合、その追加データを取得するためのコストは、すべての意図と目的に対してゼロです(OK、ネットワーク上のバイト数が多くなりますが、最大のコストはおそらく接続の作成と破棄に含まれるため)、追加のデータが必要になる可能性がある場合は、適切なモデルが得られたら、モデルにデータを完全に入力します

ハードウェアは安価ですが、ハードウェアの量が少ないと、悪いデザインをうまく実行できません。


2
>>ビューでモデルの2つのプロパティのみが必要な場合は、モデルが間違っています!<<-常に身につける必要はありません。典型的なケースは、ビジネスアプリケーションでの検索結果のリストの表示です。たとえばCRMの場合-顧客-ほとんどの場合、名前と1つまたは2つの重要なフィールドのみが検索リストに表示されます。ただし、CRMには、その顧客に関連する他のかなりの数のフィールドがあります。
Pritam Barhate

1
この場合、必要なプロパティは2つだけであると質問は述べています。
スティーブ

-2

モデルはDAOではありません。

また、20のモデル(例では顧客)があるとすると、それはMVCモデルではありません。ドメインモデル、単一のテーブル行に直接マップされません。代わりに、「顧客」で行われるすべての操作を担当する必要があります。

あなたの例では、「顧客」はドメインモデルではなく、モデル内の単なるオブジェクトです。

データベースとのやりとりに関しては、その責任はデータマッパーオブジェクトに委任される必要があります。データマッパーオブジェクトは、Customerクラスのインスタンスを格納およびフェッチする方法を知っている必要があります。


PSモデル内にデータベースロジックがある場合は、ドメインビジネスロジックをコントローラーにプッシュします。
mefisto 2011

1
顧客のためにすべての操作を行う1つのクラスは、保守が困難になるため、お勧めできません。
アンディ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.