Anwenden des MVC-pattern auf die GUI-Entwicklung
Ich bin primär ein web-Entwickler, aber ich habe ein sehr gutes Verständnis von C++ und C#. Jedoch, vor kurzem habe ich das schreiben eines GUI-Anwendung, und ich haben begonnen, sich zu verirren, wie man in den Griff, die Beziehung zwischen meinem controller und view-Logik. In PHP ist es sehr einfach war - und ich könnte schreiben, dass meine eigenen MVC-Muster, mit geschlossenen Augen - vor allem, weil, wie PHP ist zustandslos und Sie regenerieren das gesamte Formular pro Anfrage. Aber in der Anwendung, Programmiersprachen, bekomme ich sehr schnell verloren.
Meine Frage ist: wie würde ich mich trennen, mein controller von der view? Sollte die Ansicht Anhängen, um Ereignisse aus der controller - oder sollte die view implementieren eine Schnittstelle, die der controller interagiert mit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich du wäre würde ich aussetzen Ereignisse aus einer Schnittstelle, die Sie anzeigen. Dieses würde Ihnen erlauben, damit der controller zentral für die gesamte Interaktion.
Den controller zuerst geladen und instanziiert der Ansicht, ich würde dependency injection, so dass Sie nicht erstellen Sie eine Abhängigkeit auf die Ansicht selbst, sondern nur auf der Oberfläche.
Der controller Zugriff auf das Modell und laden von Daten in die Ansicht.
Der controller binden würde, um Ereignisse definiert, die auf die view-Schnittstelle.
Der controller würde dann mit dem speichern der Daten zurück an das Modell über ein Ereignis.
Wenn Sie wollten, könnten Sie auch einen event-Makler, die zum erlöschen der müssen, deklarieren Sie ein interface-per-view. Auf diese Weise konnten Sie binden an Veranstaltungen über Attribute.
Diese würde lassen Sie mit dem Controller in Abhängigkeit vom jeweiligen Modell und der view-Schnittstelle, die anzeigen, dass Sie abhängig von den Daten und dem Modell ohne Abhängigkeiten.
Einige Beispiele der oben genannten design-thinking gefunden werden kann in der KABINE und die Smart Client Software Factory Link Zum Smart Client. Verwenden Sie das MVP-Muster, aber es könnte ebenso leicht angewendet werden, um das MVC-Muster.
Fast jedem GUI-framework (von MFC-SWT zu was auch immer) ist schon MVC basiert. In der Tat, das MVC-Muster wurde zunächst von Smalltalk-80 und später den ersten wirklich verwendet werden, für die GUI-Entwicklung.
Doppel-check und Blick auf die standards und empfohlenen Praktiken für Ihre GUI-toolkit der Wahl. Manchmal MVC nicht ein gutes Muster, mit zu arbeiten bei der Lösung eines bestimmten Problems oder der Arbeit mit einem bestimmten toolkit.
Denken Sie daran: MVC ist eine große Muster, aber ist nicht eine one-size-fits-all-Lösung, versuchen Sie nicht, und zwingen Sie ein problem in MVC bei Ereignis-basierten oder funktionalen Stil der Programmierung wird Ihr Leben leichter machen.
Vorstellen, dass dieser GUI:
Den Zergling-Einheit, die dem Benutzer präsentiert wird, wie ein alien-Symbol. Sie können sehen, dass es in seiner idle-animation. Rufen Sie diese Ansicht.
Bewegt sich der Spieler das Gerät, indem Sie es anklicken und ein Zielverzeichnis. Sie können subtitute der Spieler für eine AI, wenn Sie wollen. Rufen Sie dies dem Controller.
HP und attack-Bereich des Gerätes wird berechnet jedes Spiel Rahmen, wenn die Einheit im Kampf ist. Sie können diese Daten ändern, um den Zergling in eine range-Einheit. Nennen dies das Modell.
Halten, diese Analogie im Auge und erweitern Sie es für Ihre MVC-designs.
Die wichtig Sache für Sie zu erinnern, ist, dass in MVC setup muss der Controller wissen, welche Ansicht zu rufen, aber der Blick muss wissen, nichts von Steuerung.
Also Ihrer Ansicht muss ein verallgemeinerter Weise für die Controller, um mit ihm zu interagieren, so dass Sie können mehrere verschiedene Controller rufen Sie die gleiche Ansicht (eine standardisierte grafische Ausgabe einiger Daten, wie parameter, zum Beispiel).
Dies gibt Ihnen die Flexibilität:
etwas, das man nur HTML
Ausgabe für die, die Sie bekommen können Weg mit
schreiben einer neuen PDF-Ansicht aufgerufen werden
vom Controller mit den gleichen
Parameter wie der HTML-Ansicht.
Wenn Sie halten Ihre Sicht losgelöst von spezifischen Controller, und setzen das wissen um die Ansicht zu nennen, von Ihrem Controller, du bist gut auf deinen Weg.
Dein controller sollte auf jeden Fall binden Ereignisse definiert eine Schnittstelle, die view implementiert.
Wie Sie gehen über das tun dies kann der schwierige Teil. Dependency injection? Ein Blick Fabrik? Über die view instanzieren der controller es will? Es hängt wirklich davon ab, wie Komplex die Anwendung ist zu sein.
Etwas wirklich schnell und einfach würde ich anfangen, mit mit jeder Ansicht, die bauen es um den controller und dann den Blick auf andere Optionen, wenn es benötigt wird, um größer zu werden. Ich persönlich denke, dass eine vollständige dependency injection-framework ist overkill für ein halbes Dutzend Formen :]