MVC: Vollständig bestückte Modelle oder teilweise gefüllte Modelle?


10

Dieser hat mich so lange verfolgt. Was ist Ihrer Meinung nach die bessere Programmierpraxis bei der MVC-Programmierung? Sollte man vollständig ausgefüllte oder teilweise ausgefüllte Modelle verwenden, insbesondere wenn ich weiß, dass ich für diese bestimmte Aufgabe nur 2 Felder aus dem Modellobjekt benötige, die 5 andere haben?

Manchmal scheint es nur kriminell, eine Liste von 20 Modellobjekten mit allen Werten aus der Datenbank zu füllen, wenn Sie wissen, dass Sie nur wenige davon benötigen.

Teilmodell bedeutet natürlich, dass Sie eine weitere Methode in Ihr DAO schreiben müssen, abgesehen von der, die alles abruft. Was bedeutet mehr Code zu pflegen?

Auf der anderen Seite bedeutet das Abrufen von Daten aus der Datenbank mit vollständig bestückten Modellen, dass eine Methode allen dient, aber dies wird Ihnen offensichtlich einen gewissen Leistungsaufwand bringen.

Ich kann sehen, dass ORM (wie Hibernate oder ActiveRecord of Rails) Trends in der MVC-Programmierung bevorzugt und Datenbanken wie Googles BigTable-Vollmodelle als Trend akzeptiert werden. Aber was ist, wenn Sie immer noch guten alten JDBC verwenden?

Hardware ist billig, Entwicklung ist teuer. Stimmt das wirklich, selbst wenn die App auf einige hunderttausend Anfragen pro Stunde skaliert werden muss?


1
"Auf der anderen Seite bedeutet das Abrufen von Daten aus der Datenbank mit vollständig bestückten Modellen, dass eine Methode allen dient, aber dies wird Ihnen offensichtlich einen gewissen Leistungsaufwand bringen." Wirklich? Haben Sie den Leistungsaufwand aus dieser Praxis gemessen?
S.Lott

>> Wirklich? Haben Sie einen Leistungsaufwand aus dieser Praxis gemessen? << - Ich hatte diesen erwartet. Nein, habe ich nicht. Aber es wäre interessant zu messen und sich sonst als falsch zu erweisen.
Pritam Barhate

Es ist schwer zu beweisen, dass es keine Gemeinkosten gibt. Sie können leicht über viele Details streiten, wenn Sie behaupten, dass die Messungen in bestimmten Situationen nicht gültig sind. Es ist viel schöner, wenn Sie Ihr "typisches" Setup für Datenbank, Anwendungssprache usw. verwenden und Ihre bevorzugte Konfiguration profilieren, um den tatsächlichen Overhead anzuzeigen, damit wir nicht über die verschiedenen Faktoren streiten müssen, die wir bei unseren Messungen ausgelassen haben .
S.Lott

1
Ich habe einen ausgezeichneten Artikel gefunden, der die Frage der Offenlegung Ihres Domain-Modells im Vergleich zum Senden eines DTO unter msdn.microsoft.com/en-us/magazine/ee236638.aspx behandelt .
Mayo

Antworten:


3

Sie haben zwei Möglichkeiten:

1) Lassen Sie einige Felder im Modell ungefüllt

2) Erstellen Sie ein zusätzliches "Lite" -Modell für Ihre spezifische Situation

Welche Sie wählen sollten, hängt wieder von den beiden Dingen ab:

a) Wie viele Felder des "vollständigen" Modells werden ignoriert?

b) Wie oft wird dieses "Lite" -Modell instanziiert?

Wenn es nur ein paar oder mehr Felder gibt, die nicht ausgefüllt werden können, ist es in Ordnung, mit 1) fortzufahren.

Wenn b) nur eine außergewöhnliche Einzelsituation ist, macht es möglicherweise keinen Sinn, ein zusätzliches Modell nur für einen Anwendungsfall zu erstellen.

Ein anderer Ansatz besteht darin, ein "Lite" -Modell zu definieren und das "vollständige" Modell davon zu erben.


Danke für die Antwort. Es ist sinnvoll, je nach Bedarf ein Lite-Modell zu erstellen. Aber manchmal frage ich mich, ob eine solche Strategie nicht zu viele Modellklassen erzeugt. Vor allem, wenn ich Modelle spezifisch für Ansichten und nicht spezifisch für Geschäftslogik mache.
Pritam Barhate

3

Wenn Ihre Ansicht nur 2 Eigenschaften aus dem Modell benötigt, haben Sie (wahrscheinlich) das falsche Modell für diesen Anwendungsfall! Ich würde versuchen, ein Modell zu erstellen, das der Ansicht entspricht, die zusätzlichen DB-Lookups speichern und nur die Daten auffüllen, die Sie benötigen. Wenn eine nachfolgende Ansicht mehr Details benötigt, müssen Sie sich fragen, ob ich die zusätzlichen Daten später erhalte oder ob ich alles im Voraus erhalten soll ...

Alternativ können Sie sich eine Art verzögerte Auswertung ansehen, sodass die Werte bei Bedarf ausgefüllt werden. Dies kann gut funktionieren, ist aber offensichtlich mehr Arbeit und kann zu mehreren Roundtrips zur DB führen, was nicht besonders gut ist, wenn Sie am Ende viel tun.

Wenn Sie jedoch im Grunde genommen ein paar zusätzliche Felder aus einer Tabelle oder Ansicht auswählen, sind die Kosten für das Abrufen dieser zusätzlichen Daten in jeder Hinsicht gleich Null (OK, es befinden sich mehr Bytes auf der Leitung, aber die größten Kosten sind wahrscheinlich Wenn Sie also die Möglichkeit haben, zusätzliche Daten zu benötigen, würde ich das Modell wahrscheinlich vollständig füllen, sobald Sie zufrieden sind, dass Sie das richtige Modell haben .

Hardware ist billig, aber keine Menge an Hardware kann dazu führen, dass ein schlechtes Design eine gute Leistung erbringt.


2
>> Wenn Ihre Ansicht nur 2 Eigenschaften aus dem Modell benötigt, haben Sie das falsche Modell! << - Muss nicht immer getragen werden. Typischer Fall ist die Liste der Suchergebnisse in Geschäftsanwendungen. Zum Beispiel werden in einem CRM - Kunden - meistens nur der Name und ein oder zwei wichtige Felder in einer Suchliste angezeigt. Dem CRM sind jedoch noch einige andere Felder zugeordnet.
Pritam Barhate

1
Frage sagt, dass in diesem Fall nur 2 Eigenschaften benötigt werden.
Steve

-2

Das Modell ist kein DAO.

Und noch etwas: Wenn Sie sagen, dass Sie 20 Modelle haben (Kunden aus Ihrem Beispiel), dann ist das kein MVC-Modell. Das Domänenmodell wird nicht direkt einer einzelnen Tabellenzeile zugeordnet. Stattdessen sollte es für alle Vorgänge verantwortlich sein, die mit Ihren "Kunden" durchgeführt werden.

In Ihrem Beispiel ist "Kunde" kein Domänenmodell, sondern nur ein Objekt innerhalb des Modells.

Bei der Interaktion mit der Datenbank sollte diese Verantwortung an ein Data Mapper- Objekt delegiert werden, das wissen sollte, wie Ihre Instanzen der Kundenklasse gespeichert und abgerufen werden.


PS: Wenn das Modell über Datenbanklogik verfügt, wird die Domänengeschäftslogik in den Controller übertragen.
Mefisto

1
Eine Klasse, die alles für Kunden erledigt, ist eine schlechte Idee, da es schwierig sein wird, sie zu warten.
Andy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.