am 11. März 2010
Model View Controller ist mitlerweile so etwas wie ein Mantra für Fullstack-Framework-Nutzer geworden. Ähnlich wie beim buddhistischen OOOOm erlangt man nach einer gewissen Zeit den Zustand der absoluten Konzentration. Es wird einfach als gegeben hingenommen, dass die Nutzung des MVC-Patterns die Lösung aller unserer Probleme in der Programmierung von Webanwendungen ist.
Zuerst einmal kommt das Pattern aus der “normalen” Anwendungsentwicklung und ist gedacht für die Trennung zwischen Anzeige(fenster), also der View, der Daten (Model) und der Businesslogik (Controller). Hier werden jetzt die ersten aufschreien und sagen: Die Logik gehört nicht in den Controller sondern in die Models. Und sie haben recht. Aber ich auch. Denn: Es ist gar nicht definiert wo genau die Logik sein soll. Manche sagen: Thin Controller, Big Models. Andere Big Controller, Thin Models. Es gibt keinen Standard für die Verortung von Businesslogik.Jedenfalls keinen, der im MVC-Pattern beschrieben ist.
Die heutigen PHP Fullstack-Frameworks setzen die Logik teilweise in den Controller, teilweise in die Models. Einige gehen auch einen anderen Weg und führen eine Zwischenschicht zwischen Controller und Model ein. Ich nenne sie mal Functional Model. Ein Model ist für mich einfach eine Schicht, die mir Daten bereit stellt. Entweder aus der Datenbank oder egal von wo. Das heisst es ist eigentlich ein DAO (Data Access Object). Ich bin aber ein Fan von Thin Controllern. Und jetzt komme ich in die Bedroullie: Wohin kommt denn bitte nun meine Business-Logik? Ich würde sie in die Functional-Models bauen. Diese stellen dem Controller und ggf. der View die erforderlichen Daten bearbeitet und validiert zur Verfügung; bzw. auch anders herum beim Speichern von Daten. Wichtig ist, dass diese Zwischenschicht in beiden Richtungen funktioniert und zum Beispiel die Validierung von Daten vornimmt.
Die Idee an den Function-Models ist, dass sie die Logik zusammenfassen können. Das heisst man kann zum Beispiel Helper-Klassen einsetzen, die ggf. auch in anderen Teilen des Systems genutzt werden können und vermeidet Redundanzen. Auf der anderen Seite könnnen mehrere Models (DAOs) in einem Functional Model genutzt werden und sie können sehr einfach verändert werden, weil sie komplett unabhängig von der Businesslogik funktionieren.
Ich frage also: Was ist eure Meinung zu der Frage, wohin die Businesslogik gehört und wie geht ihr mit DRY im Bezug auf Models um, wenn ihr eure Logik in die Models packt?