Führt der traditionelle Einsatz des Controllers in MVC zu einer Verletzung des Grundsatzes der einfachen Verantwortung?

8

Wikipedia beschreibt das Prinzip der einfachen Verantwortung auf folgende Weise:

  

Das Prinzip der einheitlichen Verantwortung besagt, dass jedes Objekt eine einzige Verantwortung haben sollte und dass diese Verantwortung vollständig von der Klasse verkapselt werden sollte. Alle seine Dienste sollten eng an dieser Verantwortung ausgerichtet sein.

Der traditionelle Einsatz des Controllers in MVC scheint einen Programmierer zu einer Verletzung dieses Prinzips zu führen. Nehmen Sie einen einfachen Gästebuch-Controller und sehen Sie sich an. Der Controller kann zwei Methoden / Aktionen haben: 1) Index () und 2) Submit (). Der Index () zeigt das Formular an. Das Submit () verarbeitet es. Stellen diese beiden Methoden zwei unterschiedliche Verantwortlichkeiten dar? Wenn ja, wie kommt Single Responsibility ins Spiel?

    
Byron Sommardahl 22.04.2010, 23:22
quelle

2 Antworten

8

Ja, tut es.

Und wenn Sie der SRP folgen möchten, disaggregieren Sie Ihren Controller in einen Dispatcher und Aktionen; Der Dispatcher sendet die Kontrolle an seine Aktionen und zur Kompilierzeit (C ++ - Vorlagen) oder zur Laufzeit (Java XML, was auch immer) würden Sie Dispatcher und Aktionen erstellen.

Warum sehen wir das nicht öfter? Da es sich bei Controllern häufig um "Ad-Hoc" -Implementierungen handelt, handelt es sich um konkrete Klassen auf Blattebene, die nicht verallgemeinert werden und nicht unterklassifiziert werden sollen. Hier wird die Klasse mehr verwendet, um Code bequem zu gruppieren, die Aktionen sind fast sicher nicht öffentlich (wahrscheinlich privat, vielleicht geschützt), "nur" interne Implementierungsdetails.

Die Entscheidung, wie die Entscheidung getroffen werden soll, die Anzahl und die Vielfalt der möglichen Aktionen, ist hoch, und Dispatching und Aktion sind eng miteinander verknüpft. In der Praxis ist es oft einfacher, den Code an einer Stelle zusammenzufassen.

    
tpdi 22.04.2010, 23:31
quelle
4

Nein, tut es nicht.

Dem MVC-Muster oder seinen Variationen, die zu einer Verletzung des Grundsatzes der einfachen Verantwortung führen, ist nichts innewohnendes. Ob die Implementierung eines Controllers gegen SRP verstößt oder nicht, hängt davon ab, ob das eingekapselte Verhalten mehr als nur einen Grund hat, sich zu ändern (wie jede andere Klasse), nicht aufgrund einer vorausgesetzten Verwendung des Musters.

Das Beispiel, das Sie angeben, ist eine Teilmenge einer Anwendung für grundlegende Formulare über Daten, bei der der Controller lediglich CRUD-Operationen für ein bestimmtes Modell bereitstellt. CRUD-Operationen sind in der Natur ziemlich zusammenhängend, so dass dies in der Regel keine Verletzung von SRP darstellt. Wenn mehrere Methoden auf einem einzelnen Controller verdächtig werden, tritt dies auf, wenn die Methoden unterschiedliche Verhaltensinteraktionen innerhalb der Domäne darstellen.

Das heißt, selbst wenn jemand argumentieren sollte, dass CRUD vier separate, nicht zusammenhängende Probleme darstellt, ist dem MVC-Muster nichts inne, das Sie dazu zwingt, jede dieser Aktionen innerhalb desselben Controllers zu vereinfachen.

Für ein wenig Geschichte auf dem MVC-Muster sowie einige Diskussion seiner Anwendung in der Web-Entwicklung, Checkout Interaktive Anwendungsarchitekturmuster .

    
Derek Greer 23.05.2010 20:45
quelle