2008-09-11 15 views
7

Vor kurzem, dank der Beliebtheit der Schienen, beginnen viele Leute mit dem Einsatz von ActiveRecord als Modell. Bevor ich jedoch von Rails hörte (meine Peer-Gruppe war kein Fan von Open-Source-Sachen, wurden wir in einer .NET-Schule unterrichtet ...) und während ich mein Abschlussjahr-Projekt durchführte, fand ich diese Definition für ein Modellactiverecord als Modell, ist das eine gute Idee?

Das Modell stellt Unternehmensdaten und Geschäftsregeln dar, die den Zugriff auf und die Aktualisierung dieser Daten regeln. Oft dient das Modell als Software-Approximation für einen realen Prozess, sodass bei der Definition des Modells einfache Modellierungstechniken in der realen Welt angewendet werden.

es heißt nicht, dass das Modell eine Tabelle als was Activecord tun soll. Und normalerweise muss man innerhalb einer Transaktion ein paar nicht verwandte Tabellen abfragen und dann Daten aus verschiedenen Tabellen manipulieren ... wenn also der activerecord als Modell verwendet wird, dann müsste jeder den gesamten Logikcode in den Controller stecken (was ist in einigen PHP-Frameworks beliebt), die es schwierig macht, das ActiveRecord-Modell zu testen oder zu hacken, so dass es nicht nur die Tabelle, sondern auch andere verwandte Tabellen ...

so, was ist so toll daran, ActiveRecord als Modell in einem MVC-Architekturmuster zu missbrauchen?

+0

nein, es ist extrem schlechte Idee. –

Antwort

8

Martin Fowler beschrieb dieses Muster in Mustern der Enterprise Application Architecture zusammen mit zwei anderen Mustern oder Architekturen. Diese Muster sind gut für verschiedene Situationen und unterschiedliche Mengen an Komplexität.

Wenn Sie so nur einfache Sachen wollen, können Sie Transaction Script verwenden. Dies ist eine Architektur, die Sie in vielen alten ASP- und PHP-Seiten gesehen haben, wo ein einziges Skript die Geschäftslogik, Datenzugriffslogik und Präsentationslogik enthielt. Dies fällt schnell auseinander, wenn die Dinge komplizierter werden.

Das nächste, was Sie tun können, ist eine gewisse Trennung zwischen Präsentation und Modell hinzuzufügen. Dies ist eine aktive Aufzeichnung. Das Modell ist immer noch an die Datenbank gebunden, aber Sie haben ein bisschen mehr Flexibilität, weil Sie Ihr Modell/Datenzugriff zwischen Ansichten/Seiten/was auch immer wiederverwenden können. Es ist nicht so flexibel wie es sein könnte, aber abhängig von Ihrer Datenzugriffslösung kann es flexibel genug sein. Frameworks wie CSLA in .Net haben viele Aspekte von diesem Muster (ich denke Entity Framework sieht auch ein bisschen zu ähnlich). Es kann immer noch eine Menge Komplexität handhaben, ohne unwartbar zu werden.

Der nächste Schritt besteht in der Trennung Ihrer Datenzugriffsebene und Ihres Modells. Dies erfordert normalerweise einen guten OR-Mapper oder eine Menge Arbeit. Also nicht jeder möchte diesen Weg gehen. Viele Methoden wie domänengestütztes Design beschreiben diesen Ansatz.

Es ist also alles eine Frage des Kontextes. Was brauchst du und was ist die beste Lösung? Ich benutze sogar manchmal noch Transaktions-Skript für einfachen Single-Use-Code.

+0

+1: Erwähnen Martin Fowler ist Grund genug, um Ihren Beitrag zu verbessern. Ich glaube, dass jede Person, die über das Modellieren von Anwendungen nachdenkt, versuchen sollte, seine Bücher und Papiere zu lesen. –

1

Das großartige an der Verwendung des Rails ActiveRecord als Modell in MVC ist, dass es Ihnen eine automatische ORM (Object Relational Mapper) und eine einfache Möglichkeit bietet, Assoziationen zwischen Modellen zu erstellen. Wie Sie bemerkt haben, kann MVC manchmal fehlen.

Daher würde ich für einige komplexe Transaktionen mit vielen Modellen vorschlagen, einen Presenter zwischen Ihrem Controller und Ihren Modellen (Rails Presenter Pattern) zu verwenden. Der Präsentator würde Ihre Modelle und Transaktionslogik aggregieren und wäre leicht testbar. Sie möchten auf jeden Fall versuchen, Ihre gesamte Geschäftslogik in Ihren Modellen oder Präsentatoren und außerhalb Ihrer Controller zu halten (Skinny Controller, Fat Model).

2

Ich habe oft gesagt, dass die Verwendung von Active Record (oder ORM, die fast gleich ist) wie Business Models ist keine gute Idee. Lassen Sie mich erklären:

Die Tatsache, dass PHP Open Source ist, Free (und all diese lange Geschichte ...) bietet es mit einer großen Gemeinschaft von Entwicklern, die Code in Foren, Websites wie GitHub, Google-Code und so weiter. Sie können dies als eine gute Sache sehen, aber manchmal neigt es dazu, nicht "so gut" zu sein. Zum Beispiel: Angenommen, Sie ein Projekt konfrontiert sind und Sie möchten ein ORM-Framework verwenden, um in PHP Ihr Problem geschrieben konfrontiert, gut ... Sie werden eine Menge options to choose for haben:

  • Lehre
  • Propel
  • QCodo
  • Torpor
  • redbean

und die Liste geht weiter und weiter. Neue Projekte werden regelmäßig erstellt. Stellen Sie sich vor, Sie haben ein vollständiges Framework erstellt und sogar einen Quellcode-Generator, der auf diesem Framework basiert. Aber Sie haben keine Business-Kurse platziert, weil "warum wieder dieselben Klassen schreiben?". Die Zeit vergeht und ein neues ORM-Framework wird veröffentlicht und Sie möchten zum neuen ORM wechseln, aber Sie müssen fast jede Client-Anwendung ändern, indem Sie direkt auf Ihr Datenmodell verweisen.

Bottom line, Active Record und ORM sind in der Datenschicht Ihrer Anwendung, wenn Sie sie mit Ihrer Präsentationsebene mischen, können Sie Probleme wie dieses Beispiel, das ich gerade gelegt habe, auftreten.

Hören Sie @ Mendelt's weise Worte: Lesen Sie Martin Fowler. Er hat viele Bücher und Artikel über OO-Design geschrieben und einiges gutes Material zu diesem Thema veröffentlicht. Vielleicht möchten Sie auch in Anti-Patterns suchen, genauer gesagt in Vendor Lock In, was passiert, wenn wir unsere Anwendung von Drittanbieter-Tools abhängig machen. Schließlich schrieb ich this Blogpost, der über dasselbe Problem spricht, also, wenn Sie wollen, überprüfen Sie es heraus.

Ich hoffe, meine Antwort war von Nutzen.

+0

danke für die Antwort, tatsächlich bin ich selbst von ORM weggelenkt, nachdem ich eine Zeit lang mit ihnen gearbeitet habe, da sie manchmal sehr unflexibel sind. Durch die Arbeit in all den Jahren viel gelernt: D – Jeffrey04

+0

Doctrine 2 unterstützt True Domain Modeling (im Gegensatz zu Doctrine 1) und erlaubt, dass sich Ihr Datenbankdesign vom Design Ihres Domänenmodells unterscheidet. Ich war bisher sehr zufrieden damit. Schau es dir hier an: http://www.doctrine-project.org/ –

Verwandte Themen