Ich dachte immer, dass die Geschäftslogik im Controller sein muss und dass der Controller, da er der „mittlere“ Teil ist, statisch bleibt und dass das Modell / die Ansicht über Schnittstellen gekapselt werden muss. Auf diese Weise können Sie die Geschäftslogik ändern, ohne etwas anderes zu beeinflussen, mehrere Modelle (eines für jede Datenbank / jeden Speichertyp) und Dutzende von Ansichten (zum Beispiel für verschiedene Plattformen) programmieren.
Jetzt habe ich in dieser Frage gelesen , dass Sie immer die Geschäftslogik in das Modell einfügen sollten und dass der Controller tief mit der Ansicht verbunden ist.
Für mich ist das nicht wirklich sinnvoll und impliziert, dass ich jedes Mal, wenn ich die Möglichkeit haben möchte, eine andere Datenbank / einen anderen Speichertyp zu unterstützen, mein gesamtes Modell einschließlich der Geschäftslogik neu schreiben muss.
Und wenn ich eine andere Ansicht haben möchte, muss ich sowohl die Ansicht als auch den Controller neu schreiben.
Kann jemand erklären, warum das so ist oder ob ich irgendwo einen Fehler gemacht habe?
quelle
Sie und große Teile der Programmierwelt scheinen die Rollen der MVC-Teile falsch zu verstehen. Kurz gesagt sind sie:
Modell = Domänenlogik
Ansicht = Ausgangslogik
Controller = Eingangslogik
Dies bedeutet, dass das Modell für die gesamte Geschäftslogik verantwortlich ist: Alles, was mit dem Zeichnen von Widgets auf einem Bildschirm, dem Ansteuern eines Druckers, dem Ausgeben von Daten als HTML, dem Parsen von HTTP-Anforderungen usw. zusammenhängt, gehört nicht zum Modell.
Viele der modernen sogenannten "MVC" -Frameworks machen MVC jedoch überhaupt nicht oder sie kennzeichnen ihre Teile falsch. Was als "Modell" bezeichnet wird, ist häufig die Persistenzschicht des Modells, während sich die Geschäftslogik in dem befindet, was sie als "Controller" bezeichnen. Der eigentliche Controller ist in der Regel nur ein zentraler Einstiegspunkt mit einer Routing-Tabelle und einer Codestelle in den einzelnen Controllern, um die eingegangenen Eingaben an die richtigen Geschäftsprozesse weiterzuleiten. Was diese Frameworks "Ansicht" nennen, ist wirklich ein bisschen von allem: etwas Präsentationslogik (Ansicht), ein bisschen Eingabehandhabung und Validierung (Controller) und etwas mehr Geschäftslogik (Modell). Der Löwenanteil der aktuellen Ansicht wird normalerweise als "Vorlagen" bezeichnet.
Vielleicht möchten Sie auch etwas über die Multi-Tier-Architektur lesen. Wo MVC eine Art von Einbahnstraße ist (der Fluss ist Controller -> Modell -> Ansicht), ist Multi-Tier eine Zwei-Wege-Sache (Präsentation -> Logik -> Daten -> Logik -> Präsentation) und ziemlich viele Frameworks, die so tun, als ob sie MVC ausführen, sind dreistufig und kennzeichnen Presentation für View, Logic für Controller und Data für Model neu.
quelle
Um Geschäftslogik wirklich zu isolieren und sie von der Infrastruktur der Präsentationsschicht zu trennen, sollte sie von Anwendungsdiensten gekapselt werden. Die MVC-Architektur ist eine Möglichkeit, die Präsentationsschicht zu implementieren. Sie sollte in diesem Bereich bleiben und die gesamte Geschäftslogik an diese Anwendungsdienste delegieren. Stellen Sie sich Ansichtsmodelle als Adapter zwischen der Ansicht und den Daten vor, die angezeigt und / oder gelesen werden müssen. Der Controller vermittelt die Interaktion zwischen Ansichtsmodellen, Ansichten und Anwendungsdiensten, die die Geschäftslogik hosten.
Anwendungsdienste implementieren Geschäftsanwendungsfälle und sind von der Präsentationsschicht entkoppelt, sei es MVC oder etwas anderes. Anwendungsdienste können wiederum Transaktionsskripts oder ein domänengesteuertes Design hosten .
Zum Speichern kann der Anwendungsdienst auf ein Repository oder eine beliebige Abstraktion eines Persistenzmechanismus verweisen . Verschiedene Implementierungen können unterstützt werden, indem der Datenzugriff in eine Schnittstelle abstrahiert wird. In der Regel sind diese Abstraktionen undicht und können nur teilweise über Implementierungen hinweg portiert werden. Oft ist es ein vergeblicher Versuch, eine vollständige Portabilität zu erreichen.
AKTUALISIEREN
Mein Vorschlag basiert auf der hexagonalen Architektur . In einer hexagonalen Architektur steht Ihr Domänenmodell (Geschäftslogik) im Mittelpunkt. Dieser Kern wird von Anwendungsdiensten gekapselt, die als Fassade fungieren . Anwendungsdienste sind einfache Klassen, deren Methoden den Anwendungsfällen in Ihrer Domäne entsprechen. Ausführliche Informationen zu Anwendungsdiensten finden Sie unter Dienste im domänengesteuerten Design . Das Codebeispiel enthält einen
PurchaseOrderService
Anwendungsdienst für eine Einkaufsdomäne. (Beachten Sie, dass ein Anwendungsdienst nicht die Verwendung eines domänengesteuerten Designs impliziert.)In einer hexagonalen Architektur ist eine MVC-Präsentationsschicht ein Adapter zwischen Ihrem Domänenmodell (Geschäftslogik) und einer GUI. Das Domänenmodell kennt die Präsentationsschicht nicht, aber die Präsentationsschicht kennt das Domänenmodell.
Diese Lösung hat sicherlich bewegliche Teile als eine Lösung, die Geschäftslogik in die Steuerung einfügt, und Sie sollten die Nachteile und Vorteile abwägen. Der Grund, warum ich dies vorschlage, liegt darin, dass ich es bevorzuge, die Geschäftslogik von der Präsentationsebene zu entkoppeln, um der Komplexität entgegenzuwirken. Dies wird wichtiger, wenn die Anwendung wächst.
quelle
Kommt darauf an, was Sie unter Geschäftslogik verstehen. Jede "Logik", die den Inhalten des Modells Bedeutung verleiht, sollte im Modell enthalten sein. In der verknüpften Frage scheint die Antwort mit der höchsten Bewertung "Geschäftslogik" als etwas zu definieren, das sich auf Daten bezieht. Das macht Sinn, wenn man bedenkt, dass die Daten eines Unternehmens sein Geschäft sind!
Ich habe einmal ein Beispiel von dem Schöpfer von Rails gesehen (glaube ich), der genau das tat - ohne "Geschäftslogik" in das Modell aufzunehmen. Sein Beispiel war eine Controller-Klasse und Methode für die Registrierung und Anmeldung von Apps. Ein im Klartext angegebenes Kennwort wurde verschlüsselt, bevor es in das Modell (eine Datenbank) eingefügt oder von diesem abgefragt wurde.
Ich kann mir kein besseres Beispiel für etwas vorstellen, das keine Steuerungslogik ist und direkt zum Modell gehört.
Das Modell könnte eine Schnittstelle zu unzähligen Datenspeichern sein und die Portabilität beeinträchtigen. Hier könnte man Verwirrung darüber finden, ob die Modellschnittstelle tatsächlich der "Controller" ist oder nicht.
Im Allgemeinen verknüpft der Controller das Modell und die Ansicht (die das Fleisch und die Kartoffeln der App sind). In der Cocoa-Entwicklung kann es so einfach sein, dass der Controller über die XCode-GUI (Controller-Objekte und -Bindungen) verwaltet wird.
Der GoF-Abschnitt "Design Patterns" auf MVC, lose zitiert:
In MVC dreht sich alles um Benutzeroberflächen. Der Fokus liegt auf dem Modell und der Ansicht - Definieren und Anzeigen von Daten. Beachten Sie das "Anmelde- / Benachrichtigungsprotokoll" - hier kommt Ihr Controller ins Spiel. Sie können alle gewünschten Ansichten erstellen. Solange sie sich an das Protokoll halten, müssen Sie niemals das Modell oder den Controller berühren.
Wenn Sie speziell von Web-Entwicklung sprechen, sind viele gängige Web-Frameworks mit dem Begriff MVC und seinen Komponentendefinitionen schnell und locker.
quelle
Warum führen Sie keine Serviceschicht ein?
Dann wird Ihr Controller schlanker und besser lesbar sein, und Ihre gesamten Controller-Funktionen werden reine Aktionen sein.
Sie können die Geschäftslogik innerhalb der Serviceschicht beliebig zerlegen. Die Wiederverwendbarkeit von Code ist besser und es gibt keine Auswirkungen auf Modelle und Repositorys.
quelle