Jeder kennt das Problem mit den "Magic Strings" mit INotifyPropertyChanged. Ich denke auch Lösungen kennen bereits die meisten. Ich möchte hier ein paar Lösungen vorstellen die ich bereits kenne.
So, wie es wahrscheinlich jeder kennen dürfte. Im Setter wird das OnPropertyChanged-Event geworfen, der einzige Nachteil hier ist, die Bezeichnung des Propertynamen wird als String übergeben. Beim Umbenennen des Properties wird oft vergessen den Übergabeparameter (Property-Namen) zu ändern. Dafür gibt es mehrere Möglichkeiten dies zum umgehen.
Variante 1:
Hierbei erweitern wir jede Klasse um weitere Methoden. Das Zauberwort hierfür lautet Lambda-Expressions.
Das war mein erster Versuch, den ich lange in meinen Objekten hatte, aber so richtig glücklich war ich mit der Entwicklung noch nicht. Zumindest die “Magic Strings” sind verschwunden, allerdings hatte ich in jeder Klasse die 3 oben genannten Methoden. Lange hab ich DRY missachtet und irgendwann mir eine Lösung überlegt.
Variante 2:
Bzw. ist das eine Weiterentwicklung der Variante 1. Ich hab mir ein NotificationObject erstellt und diese abstrakte Klasse von INotifyPropertyChanged abgelitten.
Jetzt muss nur noch das Objekt vom NotificationObject erben und im Setter jedes Properties müssen folgende Zeilen eingefügt werden.
So weit so gut, jetzt haben wir nur noch das Problem, dass die Prüfung des Wertes auch noch in jedem Setter vorhanden ist. Auch diese lagern wir noch in die Basisklasse aus.
Fast fertig, das einzige was mich noch stört ist die Prüfung ob sich der Wert geändert hat. In jedem Property muss ich diese Prüfung vornehmen. Deswegen hab ich mich für eine Erweiterung der Klasse NotificationObject entschieden. Es gibt eine weitere “RaisePropertyChanged”-Methode der man den aktuellen und den neuen Wert übergeben kann. Diese Methode ruft eine SetValue-Methode auf und prüft ob der Wert sich geändert hat und setzt diesen. Das ganze könnte dann in etwa so aussehen.
Der Aufruf der Methode sind dann folgend aus:
Aus Clean-Code-Sicht könnte man jetzt noch über die Verwendbarkeit diskutieren, z.B. muss das Prüfen und Setzen des neuen Wertes in einer eigenen Methode erfolgen. Vorerst belasse ich diese Methode für mich, hab aber jederzeit ein offenes Ohr für Anregungen und Verbesserungen.
Variante 3:
Die dritte Variante richtet sich an bereits vorhandenen Frameworks die ein NotificationObject beinhalten. Ich selbst hab die Frameworks noch nicht eingesetzt, aber einiges dazu gelesen. Für mich ist es derzeit Overhead.
- MS Prism
- MVVM Light Toolkit
Beide Frameworks bieten ein NotificationObject und vieles vieles mehr. Aber wie gesagt für mich einfach Overhead, da ich viele Funktionen nicht benötige.
Variante 4: Eigentlich keine richtige Variante, sondern nur ein Hilfsmittel. Wer den ReSharper ab der 7. Version verwendet, hat die Möglichkeit per Attribute eine Warnung des ReSharper’s zu bekommen.
Der ReSharper schlägt automatisch beim Anlegen der Methode den Namen vor.
Ändert man die Methode erscheint eine gelbe Lampe vom ReSharper.
Fazit:
Es gibt viele Möglichkeiten für eine saubere Implementierung von INotifyPropertyChanged. Viele Frameworks unterstützen es bereits, allerdings für mich uninteressant, da es für mich einfach Overhead bedeutet.