Wie viel Geschäftslogik sollte in der Controllerschicht vorhanden sein?


39

Manchmal ist eine Geschäftslogik im Controller-Code unserer Anwendungen enthalten. Dies ist normalerweise eine Logik, die unterscheidet, welche Methoden vom Modell aufgerufen werden sollen und / oder welche Argumente sie übergeben sollen.

Ein weiteres Beispiel hierfür ist eine Reihe von Dienstprogrammfunktionen im Controller, mit denen vom Modell zurückgegebene Daten gemäß einer Reihe von Geschäftsregeln formatiert oder bereinigt werden können.

Das funktioniert, aber ich frage mich, ob es mit einer Katastrophe flirtet. Wenn es eine gemeinsame Geschäftslogik zwischen Controller und Modell gibt, können die beiden Ebenen nicht mehr voneinander getrennt werden, und jemand, der den Code erbt, kann durch diese Ungleichmäßigkeit des Standorts des Codes für die Geschäftslogik verwirrt werden.

Meine Frage ist, wie viel Geschäftslogik im Controller zulässig sein soll und unter welchen Umständen, falls vorhanden?


1
Gute Frage. Ich freue mich auf die Meinungen der Leute.
Nathan Taylor

Antworten:


20

Im Idealfall keine

Das ist aber nicht immer möglich. Ich kann Ihnen keine harten Zahlen wie 20% oder 10 Zeilen geben, das ist subjektiv, bis zu dem Punkt, an dem es nicht beantwortet werden kann. Ich kann beschreiben, wie ich Entwurfsmuster und Umstände verwende, die es erforderlich machen, sie leicht zu biegen.

Meiner Meinung nach liegt es ganz am Zweck der Anwendung. Erstellen einer einfachen REST-API zum Posten? Vergessen Sie saubere Trennung oder sogar ein Muster. Sie können eine funktionierende Version in weniger als einer Stunde erstellen. Etwas Größeres bauen? Wahrscheinlich am besten daran zu arbeiten.

Das Ziel ist es, individuell geschlossene Systeme aufzubauen. Wenn Sie anfangen, Geschäftslogik zu schreiben, die spezifisch für die Interaktion zwischen zwei Systemen ist, ist dies ein Problem. Ohne näher darauf einzugehen, kann ich keine Meinung abgeben.

Entwurfsmuster sind Formen, einige halten sich gerne strikt an sie auf der Grundlage von grundlegendem und gut geschriebenem Code. Wenn Sie sich strikt an ein Muster halten, erhalten Sie wahrscheinlich keinen schlechten Code, aber es könnte mehr Zeit in Anspruch nehmen und Sie veranlassen, viel mehr Code zu schreiben .

Entwurfsmuster sind flexibel, passen Sie sie an Ihre Bedürfnisse an. Biege sie zu sehr und sie brechen trotzdem. Wissen Sie, was Sie brauchen, und wählen Sie ein Designmuster, das dem am nächsten kommt.


10

So wenig wie möglich. Am liebsten keine.

Der Controller muss die Anforderung annehmen, den richtigen Domänendienst zur Verarbeitung der Anforderung auffordern und die Antwort an die richtige Ansicht weitergeben.

In diesem Prozess sollte die gesamte "Geschäftslogik" in den Domänendiensten vorhanden sein.

Wenn Sie über Funktionen verfügen, mit denen Domänenobjekte verwendet und daraus Ansichtsmodelle erstellt werden, kann dies in angemessener Weise mit dem Controller koexistieren. Das sollte aber Code sein, der nur aus Gründen der entsprechenden Sichten existiert. Wenn es eine Geschäftsregel zur Datenbereinigung gibt, sollte diese in Ihrer Domain / Service-Ebene (mit den entsprechenden Komponententests) vorhanden sein.


10

Der Begriff "Geschäftslogik" ist oft verwirrend, da die Menschen unterschiedliche Meinungen darüber haben, was dies bedeutet. Meiner Ansicht nach deckt der Begriff "Geschäftslogik" zwei Bereiche ab

  • Domänenlogik
  • Anwendungslogik

Domänenlogik ist eine Logik, die sich auf den Kernbereich bezieht, auf den sich Ihr Unternehmen bezieht. Wenn Sie also einen Antrag für Wirtschaftsprüfer schreiben, sind Steuerregeln, Buchhaltungsregeln usw. Teil der Domänenlogik.

Anwendungslogik ist eine Logik, die sich auf die Tatsache bezieht, dass Sie ein Computerprogramm ausführen. Dies können Dinge wie CSV-Import-Export, Assistenten usw. sein. Kann auch Dinge wie das Erstellen von E-Mails mit vergessenen Passwörtern enthalten.

Die Art von "Geschäftslogik", die Sie in die Controllerschicht einfügen können, ist Anwendungslogik. Möglicherweise sollte nicht alle Anwendungslogik dort gehen. Sie sollten jedoch niemals Domänenlogik in die Controllerschicht einfügen. Das sollte natürlich in der Domain-Schicht sein.

Sie haben über Logik gesprochen, um Daten zu formatieren oder zu bereinigen. Die Formatierung muss auf jeden Fall eine Anwendungslogik sein. Bereinigung hingegen kann eine Domänenlogik sein, wenn die Bereinigung von Daten auf Domänenregeln basiert. Das kommt auf den Kontext an.


4

Controller sollten in Bezug auf die Domänenlogik sehr einfach zu bedienen sein.

Controller sollten Aufgaben delegieren, z. B. das Abrufen eines Datensatzes aus dem Datenspeicher über eine abstrahierte Service- / Repository-Schicht und das Zurückgeben von Daten an den Datenspeicher durch denselben (oder einen verwandten) Service. Was die Mechanik und Feinarbeiten zwischen diesen Operationen betrifft, gehören sie normalerweise an einen anderen Ort als den Controller.

Oft füge ich meinen Controllern kleine Datenbereinigungsmethoden hinzu, mit denen Daten im Geschäft gespeichert werden, und obwohl dies eine effektive Lösung ist, passt es nicht gut zur beabsichtigten Rolle des Controllers. Im Idealfall sollte alles, was Ihr Modell modifiziert, validiert oder analysiert, sehr nahe am Modell selbst erfolgen, wenn nicht sogar innerhalb des Modells. Wenn Sie beispielsweise ein Modellobjekt vor dem Speichern "bereinigen" müssen, sollten Sie eine SanitizeInputs () -Methode für das Modell oder als Teil des Dienstes in Betracht ziehen, der das Speichern des Modells verwaltet.


3

Aus einer pragmatischen Sicht habe ich festgestellt, dass Sie entweder eine Logik in Ihrem Controller oder ein Controller-Verhalten in Ihrem Modell haben, wenn Sie versuchen, etwas zu tun, für das es keinen guten musterkonformen Ansatz gibt. Zweifelsohne, wenn Sie eine App schreiben, hinter der keine große Infrastruktur steckt.

Sie können in beide Richtungen gehen, aber ich versuche normalerweise zu überlegen, ob das seltsame Bit wahrscheinlich in mehr als einer Controller-Aktion auftaucht, wenn dies im Modell der Fall ist. Wenn das unklar ist, versuche ich zu überlegen, ob es an einer Stelle "passender" ist als an der anderen. Andernfalls habe ich es normalerweise in das Modell eingefügt, nur um es vom Controller fernzuhalten (persönliche Präferenz für kleinere Controller und stärkere Datenobjekte, YMMV)

Eine dritte Möglichkeit wäre, die Gebrauchsgegenstände als separate Gebrauchsklasse zu bezeichnen, aber das ist nach Meinung vieler auch etwas gegen das Muster.

Nur weil Sie nicht streng nach einem Muster vorgehen, müssen Sie nicht unbedingt mit Katastrophen flirten. Wenn Sie nicht wirklich eine erhebliche Menge an Code für die Wiederverwendung von diesem Projekt erwarten, würde ich mir viel mehr Sorgen machen, dass das Projekt für sich selbst konsistent ist (dh: Kippen Sie nicht auf die Stelle, an der Sie diese Bits platziert haben, sobald Sie einen Ort ausgewählt haben). als eine Umschreibung, die aus irgendeinem Grund einen Teil der Projektmitte retten will. Dokumentieren / kommentieren Sie, wo und warum Sie vom allgemeinen Muster abgewichen sind, und definieren Sie das erwartete Muster für diese Anwendung.

MVC war an einem Punkt eine Abweichung von etablierten Mustern.


3

Wie viele andere interessante Konzepte in der Programmierung ist MVC ein leistungsstarkes Paradigma, um einer Familie enger oder ähnlicher Strategien Struktur und Fokus zu verleihen, um bestimmte Szenarien zu implementieren.

Wie viele andere Programmierkonzepte vereinfacht MVC die Realität, verwirft kleine Details und bietet ein grobes Drahtmodell, dem man folgen kann. Wie viele andere Vereinfachungen der Realität bringt es die Struktur, wie sie ein menschlicher Verstand sieht, ins Chaos.

Trotzdem ist MVS wie viele andere Programmierkonzepte nur eine Vereinfachung der Realität. Es ist nicht perfekt und es ist nicht gründlich. Aus diesem Grund ist es nicht möglich, ein reales Szenario in ein übervereinfachtes Modell einzufügen. Daher stellen sich viele ähnliche Fragen.

  • Wie viel Logik sollte in eine Steuerung fließen?

  • Soll eine Ansicht eine bedingte Logik enthalten?

  • Soll ein Modell zusätzliche Daten enthalten, die nicht direkt in Unternehmenseinheiten gefunden wurden?

Dies sind alles Fragen, die bei dem Versuch entstanden sind, den Code präzise und vollständig an die konzeptionelle Idee von MVC anzupassen.

Meine Antwort an Sie lautet: Versuchen Sie es nicht. MVC sorgt für Struktur. Erstellen Sie Ihre Anwendung auf dieser Grundlage, aber erwarten Sie nicht, dass sie perfekt passt. Es wird Abweichungen geben, das ist normal. Pass einfach auf, um sie unter Kontrolle zu halten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.