Einzelnen Beitrag anzeigen

Benutzerbild von mael
mael

Registriert seit: 13. Jan 2005
391 Beiträge
 
Delphi XE3 Professional
 
#4

AW: debuggen einer MVVM Anwendung,

  Alt 22. Dez 2017, 17:13
Wenn meine Geschäftslogik keine Verbindung mehr zu UI hat, wie suche ich dann Laufzeitfehler in meiner Anwendung, Da ich ja Informationen über die aktuellen Daten die zum Laufzeitfehler führen nicht mehr vernünftig ausgeben kann
Wenn man WPF als Beispiel nimmt, so wird in XAML (so ähnlich wie DFMs) das Aussehen der GUI beschrieben, aber auch die Bindung an das ViewModel.

Das ViewModel hält die Daten für die GUI in einer möglichst geeigneten Weise vor. Z.B. eine Liste von Personen (TPersonList), eine aktuell ausgewählte Person (TPerson), und ein Kommando (ähnlich zu TAction) die eine Suche ausführt.
Pseudocode:
Code:
TViewModel = class
  property SelectedPerson: TPerson;
  property PersonList: TPersonList;
  property SearchPersonsCommand: ICommand;
  property SearchResultList: TPersonList;
end;
Die GUI wird immer aktualisiert wenn diese Eigenschaften sich ändern (also z.B. eine neue Person hinzugefügt wird, oder die ausgewählte Person sich ändert). Umgekehrt werden Änderungen der GUI zurück ins ViewModel geschrieben (z.B. wenn TEdit.Text geändert wird der den Namen einer Person enthält). Bindings erlauben es dies mit loser Kopplung zu erreichen, da weder GUI noch ViewModel voneinander wissen müssen.

Der Trick bei Bindings ist dass man gewisse Formalismen im ViewModel einhält, so dass Bindings kurz und knapp ausdrückbar sind, oder auch im Objektinspektor schnell erstellbar sind. Z.B. hilft die RTTI der Eigenschaften den Datentyp zu bestimmen, und es gibt Standardmethoden Propertyänderungen zu beobachten.
Wenn das gut implementiert ist, sind Bindings quasi nur ein paar Klicks.


Das Debugging kann ganz klassisch erfolgen, wenn Bindings zu einer konkreten GUI bestehen (was man normalerweise gleich zusammen mit dem GUI-Entwurf macht).

Man kann aber auch das ViewModel direkt testen, denn dort ist ja schon die meiste Benutzerinteraktionslogik drin. Z.B. sollen nach einer Personensuche in einer DB alle Treffer aufgelistet werden (SearchResultList) aber auch der erste Treffer (erste Person) ausgewählt werden (also SelectedPerson gesetzt werden).


Das meiste was man also testen oder abfragen will ist im ViewModel. Zur visuellen Unterstützung kann man auch mit GUI testen.

Bindings selber zu testen ist zumindest in XAML schwierig, weil man nicht durch den XAML-Parser und Binder-Code steppen kann. Aber da gibt es Tricks wie z.B. das Hinzufügen von Value-Converters. Die werden bei jeder Bindung ausgeführt um von einem Datentyp zu einem anderen zu konvertieren (geht auch wenn z.B. beide int sind, man aber z.B. weiß, dass diese ints ineinander umgerechnet werden müssen).

Man kann dann einen Haltepunkte in die Value-Converter setzen um zu sehen ob die Bindung überhaupt ausgeführt wird bzw. wann dies geschieht.
HxD, schneller Hexeditor:
http://mh-nexus.de/hxd

Geändert von mael (22. Dez 2017 um 17:44 Uhr)
  Mit Zitat antworten Zitat