Entspricht dies dem ViewModel aus dem MVVM-Entwurfsmuster (Model-View-ViewModel)?
Nee.
Das wäre dies :
Das hat Zyklen. Onkel Bob hat Zyklen sorgfältig vermieden .
Stattdessen haben Sie Folgendes:
Welches sicherlich keine Zyklen hat. Sie fragen sich jedoch, woher die Ansicht ein Update kennt. Wir werden gleich darauf zurückkommen.
oder ist es ein einfaches Data Transfer Object (DTO)?
So zitieren Sie Bob von der vorherigen Seite:
Wenn Sie möchten, können Sie grundlegende Strukturen oder einfache Datenübertragungsobjekte verwenden. Oder Sie können es in eine Hashmap packen oder in ein Objekt konstruieren.
Saubere Architektur p207
Also sicher, wenn du magst.
Aber ich nehme stark an, was wirklich nervt Sie ist dies :
Dieser niedliche kleine Missbrauch von UML stellt die Richtung der Quellcode-Abhängigkeit der Richtung des Kontrollflusses gegenüber. Hier finden Sie die Antwort auf Ihre Frage.
In einer Nutzungsbeziehung:
Der Steuerungsfluss geht in dieselbe Richtung wie die Quellcode-Abhängigkeit.
In einer Implementierungsbeziehung:
Der Steuerungsfluss verläuft normalerweise in die entgegengesetzte Richtung wie die Quellcode-Abhängigkeit.
Was bedeutet, dass du dir das wirklich ansiehst:
Sie sollten in der Lage sein zu sehen, dass der Kontrollfluss niemals vom Präsentator zur Ansicht gelangen wird.
Wie kann das sein? Was bedeutet es?
Dies bedeutet, dass die Ansicht entweder einen eigenen Thread hat (was nicht so ungewöhnlich ist) oder (wie @Euphoric hervorhebt), dass der Kontrollfluss von etwas anderem in die Ansicht eintritt, das hier nicht dargestellt ist.
Wenn es sich um denselben Thread handelt, weiß die Ansicht, wann das Ansichtsmodell zum Lesen bereit ist. Wenn dies jedoch der Fall ist und die Ansicht eine grafische Benutzeroberfläche ist, fällt es schwer, den Bildschirm neu zu zeichnen, wenn der Benutzer ihn bewegt, während er auf die Datenbank wartet.
Wenn die Ansicht über einen eigenen Thread verfügt, verfügt sie über einen eigenen Steuerungsfluss. Das heißt, um dies zu implementieren, muss die Ansicht das Ansichtsmodell abfragen, um Änderungen zu bemerken.
Da der Präsentator nicht weiß, dass die Ansicht vorhanden ist, und der Präsentator nicht weiß, dass die Ansicht vorhanden ist, können sie sich überhaupt nicht gegenseitig anrufen. Sie können sich nicht gegenseitig angreifen. Alles, was passieren kann, ist, dass der Präsentator in das Ansichtsmodell schreibt und die Ansicht das Ansichtsmodell liest. Wann immer es sich anfühlt.
Nach diesem Diagramm ist das einzige, was View und Presenter gemeinsam haben, die Kenntnis des View-Modells. Und es ist nur eine Datenstruktur. Erwarten Sie also kein Verhalten.
Das mag unmöglich erscheinen, aber es kann auch dann zum Funktionieren gebracht werden, wenn das Ansichtsmodell komplex ist. Ein kleines aktualisiertes Feld ist alles, was die Ansicht abfragen müsste, um eine Änderung zu erkennen.
Jetzt können Sie natürlich darauf bestehen, das Beobachter-Muster zu verwenden, oder Sie müssen sich dieses Problem durch ein Framework verbergen, aber bitte haben Sie Verständnis dafür, dass Sie es nicht müssen.
Hier ist ein bisschen Spaß, den ich hatte, um den Kontrollfluss zu veranschaulichen:
Beachten Sie, dass Sie immer dann, wenn Sie sehen, dass der Fluss gegen die zuvor definierten Richtungen verläuft, einen Rückruf erhalten. Dieser Trick hilft uns nicht, zur Ansicht zu gelangen. Nun, es sei denn, wir kehren zuerst zu dem zurück, was der Controller genannt wird. Oder Sie können einfach das Design ändern , um zur Ansicht zu gelangen. Das behebt auch das Problem, dass mit Data Access und seiner Benutzeroberfläche ein Jojo-Problem begonnen hat .
Das einzige andere, was Sie hier lernen müssen, ist, dass der Use Case Interactor so ziemlich alles in beliebiger Reihenfolge aufrufen kann, solange er den Moderator zuletzt anruft.