Meine lange und späte Antwort, nicht einmal vollständig, aber eine gute Erklärung, WARUM ich dieses Muster, diese Meinungen und sogar einige Emotionen hasse:
1) Kurzversion: Active Record erstellt eine " dünne Schicht " " starker Bindung " zwischen der Datenbank und dem Anwendungscode. Was keine logischen, keine Probleme löst, überhaupt keine Probleme. IMHO liefert es keinen Wert, außer etwas syntaktischem Zucker für den Programmierer (der dann eine "Objektsyntax" verwenden kann, um auf einige Daten zuzugreifen, die in einer relationalen Datenbank vorhanden sind). Die Bemühungen, den Programmierern einen gewissen Komfort zu bieten, sollten (IMHO ...) besser in Tools für den Datenbankzugriff auf niedriger Ebene investiert werden, z. B. einige Variationen einfacher, einfacher, einfacher hash_map get_record( string id_value, string table_name, string id_column_name="id" )
und ähnlicher Methoden (natürlich variieren die Konzepte und die Eleganz stark mit den verwendete Sprache).
2) lange Version: In allen datenbankgesteuerten Projekten, in denen ich die "konzeptionelle Kontrolle" über die Dinge hatte, habe ich AR vermieden und es war gut. Normalerweise erstelle ich eine mehrschichtige Architektur (Sie teilen Ihre Software früher oder später in Schichten auf, zumindest in mittelgroßen bis großen Projekten):
A1) die Datenbank selbst, Tabellen, Beziehungen, sogar eine Logik, wenn das DBMS dies zulässt (MySQL ist jetzt auch erwachsen)
A2) Sehr oft gibt es mehr als einen Datenspeicher: Dateisystem (Blobs in der Datenbank sind nicht immer eine gute Entscheidung ...), Legacy-Systeme (stellen Sie sich vor, "wie" auf sie zugegriffen wird, viele Varianten möglich ... aber das ist es nicht der Punkt...)
B) Datenbankzugriffsschicht (auf dieser Ebene sind Werkzeugmethoden und Helfer für den einfachen Zugriff auf die Daten in der Datenbank sehr willkommen, aber AR bietet hier keinen Wert, außer etwas syntaktischem Zucker).
C) Anwendungsobjektschicht: "Anwendungsobjekte" sind manchmal einfache Zeilen einer Tabelle in der Datenbank, aber meistens handelt es sich ohnehin um zusammengesetzte Objekte, an die eine höhere Logik angehängt ist. Daher ist es einfach nutzlos, Zeit in AR-Objekte auf dieser Ebene zu investieren , eine Verschwendung wertvoller Codiererzeit, denn der "reale Wert", die "höhere Logik" dieser Objekte muss sowieso über den AR-Objekten implementiert werden - mit und ohne AR! Und warum möchten Sie beispielsweise eine Abstraktion von "Protokolleintragsobjekten" haben? App-Logikcode schreibt sie, aber sollte das die Möglichkeit haben, sie zu aktualisieren oder zu löschen? klingt albern und App::Log("I am a log message")
ist einige Größen einfacher zu bedienen alsle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. Und zum Beispiel: Die Verwendung eines "Protokolleintragsobjekts" in der Protokollansicht in Ihrer Anwendung funktioniert für 100, 1000 oder sogar 10000 Protokollzeilen, aber früher oder später müssen Sie optimieren - und ich wette, in den meisten Fällen werden Sie es einfach tun Verwenden Sie diese kleine schöne SQL SELECT-Anweisung in Ihrer App-Logik (die die AR-Idee völlig zerstört ..), anstatt diese kleine Anweisung in starre feste AR-Ideenrahmen mit viel Code zu verpacken und zu verbergen. Die Zeit, die Sie mit dem Schreiben und / oder Erstellen von AR-Code verschwendet haben, hätte in eine viel cleverere Oberfläche zum Lesen von Listen mit Protokolleinträgen investiert werden können (auf viele, viele Arten ist der Himmel die Grenze). Codierer sollten es wagen, neue Abstraktionen zu erfinden , um ihre Anwendungslogik zu realisieren, die zur beabsichtigten Anwendung passt, und dumme Muster nicht dumm neu implementieren, das klingt auf den ersten Blick gut!
D) die Anwendungslogik - implementiert die Logik der Interaktion von Objekten und des Erstellens, Löschens und Auflistens (!) Von Anwendungslogikobjekten (NEIN, diese Aufgaben sollten selten in den Anwendungslogikobjekten selbst verankert sein: sagt das Blatt Papier auf Ihrem Schreibtisch Sie die Namen und Positionen aller anderen Blätter in Ihrem Büro? Vergessen Sie "statische" Methoden zum Auflisten von Objekten, das ist albern, ein schlechter Kompromiss, der geschaffen wurde, um die menschliche Denkweise in [einige-nicht-alle-AR-Framework-ähnliche] zu integrieren -] AR Denken)
E) Die Benutzeroberfläche - nun, was ich in den folgenden Zeilen schreiben werde, ist sehr, sehr, sehr subjektiv, aber meiner Erfahrung nach haben Projekte, die auf AR basieren, häufig den UI-Teil einer Anwendung vernachlässigt - Zeit wurde für die Erstellung obskurer Abstraktionen verschwendet . Am Ende haben solche Anwendungen viel Zeit für Codierer verschwendet und fühlen sich an wie Anwendungen von Codierern für Codierer, die innen und außen technisch orientiert sind. Die Programmierer fühlen sich gut an (harte Arbeit endlich erledigt, alles fertig und korrekt, gemäß dem Konzept auf Papier ...), und die Kunden "müssen nur lernen, dass es so sein muss", denn das ist "professionell". ok, sorry, ich schweife ab ;-)
Zugegeben, das alles ist subjektiv, aber es ist meine Erfahrung (Ruby on Rails ausgeschlossen, es kann anders sein, und ich habe keine praktische Erfahrung mit diesem Ansatz).
In bezahlten Projekten hörte ich oft die Forderung, zunächst einige "aktive Datensatz" -Objekte als Baustein für die übergeordnete Anwendungslogik zu erstellen. Nach meiner Erfahrung ist dies auffällig oftwar eine Art Entschuldigung dafür, dass der Kunde (in den meisten Fällen ein Softwareentwickler) kein gutes Konzept, keine große Sicht und keinen Überblick darüber hatte, was das Produkt letztendlich sein sollte. Diese Kunden denken in starren Rahmen ("in dem Projekt vor zehn Jahren hat es gut funktioniert ..."), sie können Entitäten ausarbeiten, sie können Entitätsbeziehungen definieren, sie können Datenbeziehungen auflösen und grundlegende Anwendungslogik definieren, aber dann hören sie auf und gib es dir und denke, das ist alles, was du brauchst ... ihnen fehlt oft ein vollständiges Konzept von Anwendungslogik, Benutzeroberfläche, Benutzerfreundlichkeit und so weiter ... ihnen fehlt die große Sicht und ihnen fehlt die Liebe für die Details, und sie möchten, dass Sie dieser AR-Art der Dinge folgen, denn ... nun, warum hat es in diesem Projekt vor Jahren funktioniert und die Leute beschäftigt und still gehalten? Ich weiß es nicht. Aber die "Details" trenne die Männer von den Jungen oder ... wie war der ursprüngliche Werbeslogan? ;-);
Nach vielen Jahren (zehn Jahre aktive Entwicklungserfahrung) läutet meine Alarmglocke, wenn ein Kunde ein "aktives Aufzeichnungsmuster" erwähnt. Ich habe gelernt, zu versuchen, sie in diese wesentliche Konzeptionsphase zurückzubringen , sie zweimal überlegen zu lassen, zu versuchen, ihre konzeptionellen Schwächen aufzuzeigen oder sie überhaupt zu vermeiden, wenn sie nicht erkennbar sind (am Ende wissen Sie, ein Kunde, der dies noch nicht tut weiß, was es will, denkt vielleicht sogar, dass es weiß, aber nicht, oder versucht, Konzeptarbeit kostenlos an MICH zu verlagern, kostet mich viele wertvolle Stunden, Tage, Wochen und Monate meiner Zeit, das Leben ist zu kurz ...).
Also endlich: DIESES ALLES ist der Grund, warum ich dieses alberne "aktive Aufnahmemuster" hasse, und ich tue es und werde es vermeiden, wann immer es möglich ist.
EDIT : Ich würde dies sogar als No-Pattern bezeichnen. Es löst kein Problem (Muster sollen keinen syntaktischen Zucker erzeugen). Es schafft viele Probleme: Die Wurzel all seiner Probleme (in vielen Antworten hier erwähnt ..) ist, dass es nur das gute alte, gut entwickelte und leistungsfähige SQL hinter einer Schnittstelle verbirgt, die nach der Musterdefinition extrem begrenzt ist.
Dieses Muster ersetzt Flexibilität durch syntaktischen Zucker!
Denken Sie darüber nach, welches Problem löst AR für Sie?