AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CodeRage 2022: Observer - simpel und elegant

Ein Thema von Rollo62 · begonnen am 15. Jun 2022 · letzter Beitrag vom 16. Jun 2022
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#1

CodeRage 2022: Observer - simpel und elegant

  Alt 15. Jun 2022, 17:25
Hallo Uwe,

ich habe gerade mal durch deinen Vortrag geschaut.
Vielen Dank für die sehr schöne Session, da zeigst Du wirklich perfekt wie man von den ollen Events weg zu einem schönen, schlanken Design kommen kann.
Alles sehr schön sauber getrennt und modular lauffähig, fast schon ein halbes MVVM

Was mich da umtreibt sind die Validators, wo es laut Deiner Aussage auf die Reihenfolge der AddXxx Einträge ankommt.
Das fände ich als einzige Stelle verbesserungswürdig, um solche blöden Fehler sauber abzufangen.
observables.jpg

Was ich mich frage ist, ob man nicht die Reihenfolge der AddXxx während des Aufrufs testen kann und
bei falscher Reihenfolge von AddValidator eine Exception werfen kann.

Weil Du in erster Linie class helper benutzt hast ist durch das modulare Design wohl keine einfache Abfrage möglich, welcher Oberserver/Validator dem Control bereits zugewiesen wurde.
Das Verwenden von Interposern, um irgendwelche Variablen zu den Controls hinzuzufügen, ist auch nicht so elegant.

Im letzten Teil hast Du dann im TObservableDataWrapper diese Observer zusammengefasst, das würde einen solchen Test wohl ermöglichen,
aber packt natürlich wieder verschiedenen Dinge zusammen.
Dieser Wrapper sollte solche Probleme mit der Reihenfolge doch abfangen können.

Gibt es da eine schöne Lösung die jeweils zu jedem Control gehörenden Oberserver/Validatoren zu ermittlen,
oder ist das vielleicht schon in Deiner Lösung drin ?
Das Video ging jetzt schön flott, ich muss da sicher nochmal in Ruhe reinschauen, wird es die verschiedenen Ausbaustufen nochmal separat auf deinem GitGub-Account geben ?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#2

AW: CodeRage 2022: Observer - simpel und elegant

  Alt 15. Jun 2022, 18:52
Was mich da umtreibt sind die Validators, wo es laut Deiner Aussage auf die Reihenfolge der AddXxx Einträge ankommt.
Das fände ich als einzige Stelle verbesserungswürdig, um solche blöden Fehler sauber abzufangen.
Also, erstmal ist es nicht unbedingt ein Fehler, einen Observer vor einem Validator zu registrieren. Es kommt halt darauf an, was ich mit dem Observer erreichen will. Der Observer könnte z.B. jede Eingabe loggen und möchte da vielleicht auch die ungültigen Eingaben mitbekommen. Dann muss sogar der vor dem Validator kommen.

Im gezeigten Fall wird der Wert in die Instanz übertragen, aber das soll nur für gültige Werte passieren. Wenn man jetzt dort nochmal die Abfrage macht, kann der Validator ja auch später kommen:
Delphi-Quellcode:
  MyStringEdit.AddObserver(procedure(AValue: string) begin if Data.IsMyStringValidNoMsg(AValue) then Data.MyString := AValue end);
  MyStringEdit.AddValidator(Data.IsMyStringValid);

Was ich mich frage ist, ob man nicht die Reihenfolge der AddXxx während des Aufrufs testen kann und
bei falscher Reihenfolge von AddValidator eine Exception werfen kann.
Das ist sicher aktuell nicht so einfach möglich, da ja am Ende alle Observer von TCustomEditObserver abgeleitet sind und sich lediglich durch den Code im FOnNotifyValue unterscheiden.
Leider kann man auch keine Prioritäten für die Observer mitgeben, da die in einem private Dictionary verwaltet werden und man an die jeweiligen Listen nicht wirklich herankommt.

Weil Du in erster Linie class helper benutzt hast ist durch das modulare Design wohl keine einfache Abfrage möglich, welcher Oberserver/Validator dem Control bereits zugewiesen wurde.
Das Verwenden von Interposern, um irgendwelche Variablen zu den Controls hinzuzufügen, ist auch nicht so elegant.
Die class helper sind da ja aus einem bestimmten Grund: TCustomEdit ist die Basisklasse für eine ganze Reihe von Controls, die nun alle mit dem class helper abgedeckt werden. Eine Ableitung oder ein Interposer müsste ja für jede dieser Ausprägungen erfolgen.

Im letzten Teil hast Du dann im TObservableDataWrapper diese Observer zusammengefasst, das würde einen solchen Test wohl ermöglichen,
aber packt natürlich wieder verschiedenen Dinge zusammen.
Dieser Wrapper sollte solche Probleme mit der Reihenfolge doch abfangen können.
Das sind ja auch selbst geschriebene Klasse, die auch noch eine eigene TObserver-Ableitung verwenden. Da könnte man eventuell was machen, aber das hilft nicht bei den Control-Observern.

Gibt es da eine schöne Lösung die jeweils zu jedem Control gehörenden Oberserver/Validatoren zu ermittlen,
oder ist das vielleicht schon in Deiner Lösung drin ?
Nein, und ich kann da auch im Moment keine Möglichkeit entdecken. Wie oben schon erwähnt, kann man einen registrierten Observer nicht mehr als Validator erkennen.

Das Video ging jetzt schön flott, ich muss da sicher nochmal in Ruhe reinschauen, wird es die verschiedenen Ausbaustufen nochmal separat auf deinem GitGub-Account geben ?
Die Schritte aus den CodeRage-Sessions gibt es in einem separaten Repo, unabhängig von der CmonLib: https://github.com/UweRaabe/CodeRageDE2022
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von MEissing
MEissing

Registriert seit: 19. Jan 2005
Ort: Egelsbach
1.384 Beiträge
 
Delphi 12 Athens
 
#3

AW: CodeRage 2022: Observer - simpel und elegant

  Alt 16. Jun 2022, 10:29
(Github Source im YouTube Video verlinkt. Danke!)
Matthias Eißing
cu://Matthias.Eißing.de [Embarcadero]
Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: CodeRage 2022: Observer - simpel und elegant

  Alt 16. Jun 2022, 10:51
Gibt es da eine schöne Lösung die jeweils zu jedem Control gehörenden Oberserver/Validatoren zu ermittlen,
oder ist das vielleicht schon in Deiner Lösung drin ?
Nein, und ich kann da auch im Moment keine Möglichkeit entdecken.
Es gibt immer einen Weg: Add priority to observers to better control execution order
Miniaturansicht angehängter Grafiken
16-06-2022_11-50-26.png  
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#5

AW: CodeRage 2022: Observer - simpel und elegant

  Alt 16. Jun 2022, 14:34
Hallo Uwe,

ja super, das macht die Sache noch runder und kann man sicher an zig Stellen gut gebrauchen.

Danke für die Mühe, schaue ich mir nächste Woche nochmal genauer an.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz