Wenn ich ein Programm mit MVC entwerfe, ist der Controller oft die Hälfte der Zeit nutzlos.
Was ich damit meine ist Folgendes: In der Ansicht passiert etwas (z. B. ein Klick auf eine Schaltfläche). Die Ansicht benachrichtigt dann den Controller. Der Controller delegiert dann direkt an das Modell und unternimmt nichts anderes, da er nichts zu tun hat.
Zum Beispiel:
Der Benutzer drückt die Taste 'Farbe Blau'> Ansicht teilt dem Controller mit controller.colorBlue()
> Controller teilt dem Modell mit model.colorBlue()
> Modellfarben etwas Blaues.
In diesem Beispiel scheint der Controller nutzlos zu sein. Es fügt nichts hinzu. Die Ansicht hätte genauso gut direkt mit dem Modell sprechen können.
In der anderen Hälfte der Zeit führt der Controller jedoch eine Art Vermittlung zwischen Ansicht und Modell durch.
Meine Frage lautet: Wie häufig ist dies in MVC-Strukturen? Ist es vernünftig, dass die Hälfte der Zeit, die mein Controller benötigt, unnötig erscheint? Oder ist das ein Problem? Ist das üblich? Wie soll ich das angehen?
Wenn meine Frage nicht klar genug ist, sagen Sie es bitte.
quelle
controller.colorBlue()
tatsächlich tatsächlich angerufen wirdmodel.setColor(0, 0, 255);
. Ein Grund für die Trennung zwischen Modell und Ansicht ist, dass häufig mehrere Benutzeroberflächenelemente einen einzelnen Status im Modell darstellen (z. B. wird ein Element im Menü aktiviert, die Symbolleiste gedrückt und der Zeiger ändert sich in eine Füllung Das Symbol all entspricht dem aktuell ausgewählten Werkzeugfeld im Modell. Bei der MVC-Trennung müsste sich das Modell nicht um die Synchronisierung der verschiedenen UI-Elemente kümmern.Antworten:
Sie unterschätzen die Bedeutung einer Abstraktionsebene zwischen Ihrer Benutzeroberfläche und Ihrem Modell. Der Controller erfüllt diese Funktion zu 100 Prozent.
Ihr Beispiel
model.colorBlue()
ist etwas spekulativ. In einem realen Modell wäre dies wahrscheinlich eine CRUD-Methode. Ihre Schaltfläche könnte also eine Schaltfläche "Kunde erstellen" sein, Ihre Controller-MethodeCreateCustomer()
und Ihr ModellCreateCustomer()
. Sicher, Sie gehen gerade durch den Anruf.Aber was ist, wenn Sie die Funktionsweise des Modells ändern müssen? Wenn Ihre Ansicht Ihr Modell direkt aufruft, wird Ihre Anwendung unterbrochen, wenn Sie das Modell ändern. Controller-Methoden bieten einen "Zugriffspunkt" für Ihre Ansicht. Sie können eine einfache Änderung an der Controller-Methode vornehmen, indem Sie möglicherweise den Model-Aufruf in ändern
CreateCustomerWithVerification()
, und alles funktioniert weiterhin.Die gleiche Begründung gilt für eine Service-Schicht. Anstatt einfach CRUD-Methoden in Ihrem Modell zu haben, sollten Sie Geschäftsaktionen durchführen. Auf diese Weise halten Sie die Geschäftslogik von Ihren Controllern fern und ermöglichen die Verwendung des Modells an einem anderen Ort, möglicherweise in einer WPF-Anwendung.
Stellen Sie sich den Controller als "Switchyard" vor. Es sollte ein Vermittler sein, der Anforderungen zwischen Ihrer Benutzeroberfläche und Ihrem Modell vermittelt, aber Controller-Methoden sollten so wenig Logik wie möglich enthalten.
quelle
Beim Codieren könnte man so denken:
In Ihrem Fall scheinen Sie die Domänenlogik in das Modell einzufügen, und dies würde Ihnen Probleme bereiten, wenn Sie sie ändern möchten: Sie müssen Methoden wie "model.colorBlue" in ein neues Modell kopieren.
Und was würde passieren, wenn sich die Definition von "blau" ändert? Sie müssen es 2 Modelle ändern. Auch in Controller sollten Sie nicht direkt in Ihre Datenbank schreiben, aber wie Lie Ryan betonte , sollten Sie verwenden
model.setColor
.Gleiches gilt für Ansichten. Wenn Sie anfangen, Logik oder Validierung anzuzeigen, müssen Sie alle Funktionen kopieren, wenn Sie die Ansicht ändern möchten.
quelle