MVC ist eine Übung in Separation of Concerns , einer UI-Architektur. Dies ist eine Möglichkeit, die Komplexität zu korrigieren, die in Benutzeroberflächen auftreten kann, wenn die Präsentation nicht vom Inhalt getrennt wird .
Theoretisch können alle Objekte ein Verhalten aufweisen, das auf den Daten beruht, die sie enthalten, und dass Daten und Verhalten eingekapselt bleiben . In der Praxis kann ein bestimmtes OOP-Objekt eine Logik aufweisen, die seinen Daten entspricht, oder es kann überhaupt keine Logik aufweisen (beispielsweise ein Datenübertragungsobjekt ).
In MVC geht die Geschäftslogik in das Modell und nicht in den Controller. Der Controller ist wirklich nur ein Vermittler, um die Ansicht und das Modell miteinander zu verbinden. Im Modell können Sie also Daten und Verhalten an derselben Stelle haben.
Aber selbst diese Anordnung garantiert keine strikte Daten- / Verhaltensfusion. Objekte, die nur Daten enthalten, können von anderen Klassen bearbeitet werden, die nur Logik enthalten. Dies ist eine durchaus akzeptable Verwendung von OOP.
Ich gebe Ihnen ein konkretes Beispiel. Dies ist ein bisschen erfunden, aber nehmen wir an, Sie haben ein Currency
Objekt, und dieses Objekt kann sich in jeder verfügbaren Währung darstellen, die an den Dollar gebunden ist. Sie hätten also Methoden wie:
public decimal Yen { get { return // dollars to yen; } }
public decimal Sterling { get { return // dollars to sterling; } }
public decimal Euro { get { return // dollars to euro; } }
... und dieses Verhalten würde mit dem Currency-Objekt gekapselt.
Aber was ist, wenn ich die Währung von einem Konto auf ein anderes übertragen oder eine Währung einzahlen möchte? Würde dieses Verhalten auch im Currency-Objekt enthalten sein? Nein, würde es nicht. Das Geld in Ihrer Brieftasche kann nicht von Ihrer Brieftasche auf Ihr Bankkonto überwiesen werden. Sie benötigen einen oder mehrere Agenten (einen Kassierer oder Geldautomaten), um dieses Geld auf Ihr Konto zu bekommen.
Dieses Verhalten würde also in ein Teller
Objekt eingekapselt Currency
und Account
Objekte als Eingaben akzeptieren , es würde jedoch keine Daten selbst enthalten, außer möglicherweise ein wenig lokalen Status (oder möglicherweise ein Transaction
Objekt), um die Verarbeitung der Eingabeobjekte zu unterstützen.