MVCS - Model View Controller Store

35

Ich habe vor kurzem beschlossen, iOS-Entwicklung zu lernen, und zu diesem Zweck habe ich iOS-Programmierung gelesen : The Big Nerd Ranch Guide . In dem Buch beschreiben die Autoren ein Entwurfsmuster MVCS - Model-View-Controller-Store , wobei die Grundidee darin besteht, dass viele Anwendungen mehrere externe Datenquellen verwenden, um die Anforderungslogik im Controller beizubehalten schlagen vor, dass die gesamte Anforderungslogik aus der Steuerung in ein separates Objekt verschoben wird.

Kurz, um das Buch zu zitieren

Model-View-Controller-Store fügt die Anforderungslogik in ein separates Objekt ein und nennt dieses Objekt einen Store (Abbildung 28.4). Die Verwendung eines Geschäftsobjekts minimiert redundanten Code und vereinfacht den Code, der Daten abruft und speichert. Am wichtigsten ist, dass die Logik für den Umgang mit einer externen Quelle in eine ordentliche Klasse mit einem klaren und fokussierten Ziel überführt wird. Dies erleichtert das Verständnis des Codes, was die Wartung und das Debuggen sowie den Austausch mit anderen Programmierern in Ihrem Team erleichtert.

Und

Das Coole an asynchronen Speichern ist, dass sich der Fluss der Anforderung und ihre Antwort an einer Stelle im Controller befinden, obwohl viele Objekte viel Arbeit für die Verarbeitung einer Anforderung leisten. Dies gibt uns den Vorteil von Code, der leicht zu lesen und auch leicht zu ändern ist.

Ich wollte mehr über dieses Muster herausfinden und sehen, was andere dazu sagen könnten, aber während ich online suchte, konnte ich nur Hinweise auf dasselbe Buch finden (ist das Muster vielleicht unter einem anderen Namen bekannt?).

Für mich scheint die Logik des Autors sinnvoll zu sein und sie scheint eine logische Erweiterung des regulären MVC-Musters zu sein, aber vielleicht liegt das daran, dass ich nicht wirklich viel Erfahrung mit dem MVC-Muster in der Praxis habe (abgesehen von meinem Einstieg in die iOS-Entwicklung) Art von verwendetem MVV mit backbone.js (das heißt, wenn Sie es als MVC betrachten ).

Ich hatte gehofft, dass vielleicht jemand mit mehr Erfahrung ein bisschen Licht ins Dunkel bringen kann, ob es offensichtliche Fehler / Probleme mit dem MVCS- Muster gibt, die mir fehlen.

Jack
quelle
2
RobotLegs in ActionScript verwendet das "S" in MVCS als Service. Aber es wird im Wesentlichen auf die gleiche Weise verwendet. Es gibt also mindestens ein weiteres Beispiel dafür.
Amy Blankenship
1
In MVC ist der Store normalerweise Teil des Modells. Es wird der DAO- Teil davon genannt.
Florian Margaine
@FlorianMargaine verwenden im Gegensatz zum Controller (was in diesem Buch impliziert zu sein scheint (es heißt: "In MVC liegt die Verantwortung für die Anforderungslogik bei den Controller-Objekten")? Und sehen Sie einen offensichtlichen Nachteil, wenn Sie ihn in eine eigene Ebene verschieben ?
Jack

Antworten:

18

Bei MVCS-Entwurfsmustern tendiert "Speichern" zur Speicherlogik. Im Falle von iOS ist dies normalerweise eine Core Data-Implementierung. Wenn Sie eine Core Data-backed-Vorlage in Xcode erstellen, sehen Sie den "Store" -Aspekt dieses Entwurfsmusters in der AppDelegate-Klasse.

Um dies auf die nächste Ebene zu heben, erstelle ich häufig eine Singleton-Manager-Klasse, die das Einrichten des Core Data-Stacks und das gesamte Abrufen / Speichern des Stacks übernimmt. Wie Sie bereits erwähnt haben, ist es damit sehr einfach, diese Methoden nicht nur aufzurufen, sondern bei Bedarf anzupassen, anstatt Aufrufe überall in verschiedenen View-Controllern zu speichern / abzurufen.

Das "Store" -Paradigma ist jedoch nicht auf Core Data beschränkt. Ihr Geschäft ist möglicherweise nur ein Webdienst. Vielleicht haben Sie eine Klasse, die mit Facebook, Twitter, Yelp oder einer anderen REST-basierten API interagiert. Ich habe festgestellt (und folge ebenfalls dem Trend), dass solche Klassen auch als Manager bezeichnet werden. Sie verwalten buchstäblich alle internen Details, sodass Ihre anderen Klassen genau das eingeben oder herausholen können, was sie benötigen.

Soweit offensichtliche Mängel oder Probleme mit diesem Entwurfsmuster ... Wie bei jedem Entwurfsmuster besteht das auffälligste Problem darin, sicherzustellen, dass Sie Ihr Projekt so eingerichtet haben, dass es dem Paradigma entspricht. Besonders bei einem Designmuster, das Ihnen neu ist, kann dies manchmal der schwierigste Teil sein. Der Vorteil des Aufteilens Ihrer "Store" -Logik in eine eigene Klasse liegt in der Tatsache, dass die Code-Wartbarkeit erheblich vereinfacht wird.

jmstone
quelle
Vielen Dank für die Einsicht, die dem Ansatz, den ich eingeschlagen habe, tatsächlich ähnelt, da ich eine Singleton-Manager-Klasse habe, die sich mit dem Kerndatenstapel und einer Web-API befasst.
Jack
Hallo @jimstone, ich bin etwas verwirrt in Bezug auf die Store-Logik. Können Sie bitte helfen? Angenommen, ich habe 5 Modelle, für jede habe ich 2 Klassen, von denen eine die Vernetzung und andere Zwischenspeicherung von Objekten (Kerndaten und andere Dinge) aufrechterhält. Sollte ich nun für jedes Modell eine separate Store-Klasse haben, die eine Funktion mit Netzwerk- und Cache-Funktionsaufrufen aufruft, oder eine einzelne Store-Klasse, die alle Netzwerk- und Cache-Funktionsaufrufe für jedes Modell hat, so greift der Controller immer auf eine einzelne Datei für Daten zu.
Meteore
18

"Speichern" klingt in diesem Zusammenhang sehr nach einem Repository oder Service . In diesem Fall ist dies ein äußerst verbreitetes Muster. Die Fehler / Probleme hängen von Ihrer Implementierung und der Problemdomäne ab.

Auf einer allgemeinen Ebene klingt es so, als würde das Buch "Speichern" verwenden, um eine Ebene der Geschäftslogik + eine Ebene der Datenabruflogik darzustellen, die einen Satz von Daten verarbeitet, die möglicherweise Teil Ihrer Anwendung sind oder nicht.

Zum Beispiel ist das Einhüllen der Twitter-API in einen "Store" eine gute Möglichkeit, diese Logik zu unterteilen.

Bei der weiteren Gedanken
Verwendung dieser Definition von MVC (von der ich denke, dass sie genau richtig ist) ist der Store wirklich eine Teilmenge des Modells. Die Abgrenzung, ob es sich um eine Erweiterung von MVC oder um ein Datenabrufmuster handelt, ist nicht besonders nützlich. Sie sehen am Ende aus wie derselbe Code.

Fazit: Ich denke, Sie werden dem Rat, den sie vorschlagen, in Ordnung sein (scheint insgesamt solide zu sein).

Zachary Yates
quelle
1
Durchlesen der von Ihnen bereitgestellten Links Es klingt ähnlich, außer dass es hier als Erweiterung des MVC-Musters verwendet wird.
Jack
5
+1, es hört sich so an, als hätten sie sich gerade einen neuen Namen für das Repository-Muster ausgedacht (ein Repository ist eine Art von Service).
MattDavey