Ich brauche wirklich eine ehrliche, nachdenkliche Debatte über die Vorzüge des derzeit akzeptierten Paradigmas für das Design von Unternehmensanwendungen .
Ich bin nicht davon überzeugt, dass Entitätsobjekte existieren sollten.
Mit Entitätsobjekten meine ich die typischen Dinge, die wir für unsere Anwendungen erstellen, wie "Person", "Konto", "Bestellung" usw.
Meine aktuelle Designphilosophie lautet:
- Der gesamte Datenbankzugriff muss über gespeicherte Prozeduren erfolgen.
- Wenn Sie Daten benötigen, rufen Sie eine gespeicherte Prozedur auf und iterieren Sie über einen SqlDataReader oder die Zeilen in einer DataTable
(Hinweis: Ich habe auch Unternehmensanwendungen mit Java EE erstellt. Java-Leute ersetzen bitte meine .NET-Beispiele durch das Äquivalent.)
Ich bin kein Anti-OO. Ich schreibe viele Klassen für verschiedene Zwecke, nur keine Entitäten. Ich gebe zu, dass ein großer Teil der Klassen, die ich schreibe, statische Hilfsklassen sind.
Ich baue kein Spielzeug. Ich spreche von großen Transaktionsanwendungen mit hohem Volumen, die auf mehreren Computern bereitgestellt werden. Webanwendungen, Windows-Dienste, Webdienste, B2B-Interaktion, wie Sie es nennen.
Ich habe OR Mappers verwendet. Ich habe ein paar geschrieben. Ich habe den Java EE-Stack, CSLA und einige andere Entsprechungen verwendet. Ich habe sie nicht nur verwendet, sondern diese Anwendungen in Produktionsumgebungen aktiv entwickelt und gewartet.
Ich bin zu dem kampferprobten Schluss gekommen, dass Entitätsobjekte uns in die Quere kommen und unser Leben ohne sie so viel einfacher wäre.
Betrachten Sie dieses einfache Beispiel: Sie erhalten einen Supportanruf zu einer bestimmten Seite in Ihrer Anwendung, die nicht ordnungsgemäß funktioniert. Möglicherweise wird eines der Felder nicht so beibehalten, wie es sein sollte. Bei meinem Modell öffnet der Entwickler, der das Problem gefunden hat, genau 3 Dateien . Eine ASPX-, eine ASPX.CS- und eine SQL-Datei mit der gespeicherten Prozedur. Die Lösung des Problems, bei dem es sich möglicherweise um einen fehlenden Parameter für den Aufruf der gespeicherten Prozedur handelt, dauert nur wenige Minuten. Bei jedem Entitätsmodell wird der Debugger jedoch immer gestartet, der Code wird schrittweise durchlaufen, und möglicherweise werden 15 bis 20 Dateien in Visual Studio geöffnet. Als Sie an den unteren Rand des Stapels getreten sind, haben Sie vergessen, wo Sie angefangen haben. Wir können nur so viele Dinge gleichzeitig im Kopf behalten. Software ist unglaublich komplex, ohne unnötige Ebenen hinzuzufügen.
Entwicklungskomplexität und Fehlerbehebung sind nur eine Seite meines Problems.
Lassen Sie uns nun über die Skalierbarkeit sprechen.
Ist Entwicklern klar, dass sie jedes Mal, wenn sie Code schreiben oder ändern, der mit der Datenbank interagiert, eine gründliche Analyse der genauen Auswirkungen auf die Datenbank durchführen müssen? Und nicht nur die Entwicklungskopie, ich meine eine Nachahmung der Produktion. Sie können also sehen, dass die zusätzliche Spalte, die Sie jetzt für Ihr Objekt benötigen, den aktuellen Abfrageplan ungültig gemacht hat und ein Bericht, der in 1 Sekunde ausgeführt wurde, jetzt nur noch 2 Minuten dauert weil Sie der Auswahlliste eine einzelne Spalte hinzugefügt haben? Und es stellt sich heraus, dass der Index, den Sie jetzt benötigen, so groß ist, dass der DBA das physische Layout Ihrer Dateien ändern muss?
Wenn Sie zulassen, dass Benutzer mit einer Abstraktion zu weit vom physischen Datenspeicher entfernt sind, verursachen sie Chaos mit einer Anwendung, die skaliert werden muss.
Ich bin kein Eiferer. Ich kann überzeugt sein, wenn ich falsch liege, und vielleicht bin ich es auch, da es einen so starken Druck auf Linq zu SQL, ADO.NET EF, Hibernate, Java EE usw. gibt. Bitte denken Sie über Ihre Antworten nach, wenn mir etwas fehlt Ich möchte wirklich wissen, was es ist und warum ich mein Denken ändern sollte.
[Bearbeiten]
Es sieht so aus, als ob diese Frage plötzlich wieder aktiv ist. Nachdem wir nun die neue Kommentarfunktion haben, habe ich mehrere Antworten direkt kommentiert. Vielen Dank für die Antworten, ich denke, das ist eine gesunde Diskussion.
Ich hätte wahrscheinlich klarer sagen sollen, dass ich über Unternehmensanwendungen spreche. Ich kann beispielsweise ein Spiel, das auf dem Desktop einer anderen Person ausgeführt wird, oder eine mobile App wirklich nicht kommentieren.
Eine Sache muss ich hier oben als Antwort auf mehrere ähnliche Antworten anführen: Orthogonalität und Trennung von Bedenken werden oft als Gründe für Entity / ORM angeführt. Gespeicherte Prozeduren sind für mich das beste Beispiel für die Trennung von Bedenken, die mir einfallen. Wenn Sie allen anderen Zugriff auf die Datenbank außer über gespeicherte Prozeduren nicht zulassen, können Sie theoretisch Ihr gesamtes Datenmodell neu gestalten und keinen Code beschädigen, solange Sie die Ein- und Ausgaben der gespeicherten Prozeduren beibehalten. Sie sind ein perfektes Beispiel für die vertragliche Programmierung (nur solange Sie "select *" vermeiden und die Ergebnismengen dokumentieren).
Fragen Sie jemanden, der schon lange in der Branche tätig ist und mit langlebigen Anwendungen gearbeitet hat: Wie viele Anwendungs- und UI-Ebenen sind gekommen und gegangen, während eine Datenbank weiterlebt? Wie schwierig ist es, eine Datenbank zu optimieren und umzugestalten, wenn 4 oder 5 verschiedene Persistenzschichten SQL generieren, um auf die Daten zuzugreifen? Du kannst nichts ändern! ORMs oder Code, der SQL generiert, sperren Ihre Datenbank in Stein .