Ich habe mich schon eine ganze Weile gefragt warum Microsoft Extension Methods eingeführt hat. Diese sind zusammen mit LINQ ins Spiel gekommen und werden in VS durch einen kleinen blauen Pfeil beim Intellisense hervorgehoben. Besonders häufig trifft man sie, eben dank LINQ, bei Collections an.
Der Grund warum ich diese Extrafunktionalität nicht verstehen konnte war die, in meinen Augen, damit verbundene Redundanz. Man hat nicht nur eine Datei in der die Klassendefinition hinterlegt ist, nein, man führt noch eine mit. Dies geht soweit, dass man verschiedene Extensions auch in unterschiedlichen Klassen und Namespaces hinterlegen kann. So etwas „Tolles“ kann im Alltagsgebrauch schnell zu Fehlern führen wie sie bei Redundanz immer auftreten („Ich habe nichts an der Klasse geändert!“).
Letzteres ist aber Thema des Projektmanagements und soll nicht Gegenstand dieses Posts sein, zumal man die Methoden ja auch der Klasse hinzufügen kann wenn man ihre Quellen hat. Vielmehr möchte ich den Sinn hervorheben. Denn Extensions bieten mir die Möglichkeit Klassen zu erweitern auf die ich eigentlich keinen Zugriff habe und diese Erweiterungen auch anderen Entwicklern zur Verfügung zu stellen.
Da ich zurzeit damit beschäftigt bin Daten von einer Modelstruktur auf eine andere zu mappen und zurück, bin ich auf ein Problem gestoßen. Den in Model A liegen Datumsangaben immer als Nullable vor, in Model B jedoch nicht. Was also tun?
Da DateTime immer mit Ticks = 0 und somit dem 1.1.1970 initialisiert wird, ist das Vorgehen eigentlich recht einfach. Ich muss nur auf Ticks == 0 prüfen und weiß, dass die Daten auf „der anderen Seite“ nicht gesetzt wurden.
Schreibe ich jetzt aber in jede if Anweisung genau diese Abfrage (es gibt sehr viele solcher Fälle) habe ich bei späteren Änderungen an dieser Logik ein riesiges Problem. Denn dann darf ich für jeden Fall den ganzen Mist noch mal umschreiben. Die Clean Code Developer sagen deshalb “DRY!!!” (don’t repeat yourselfe) und genau das kann ich mit Extension-Methods machen. Indem ich eine Methode an DateTime hänge die „IsEmpty“ heißt, sind die if Anweisungen leichter zu verstehen und die eigentliche Logik wird nur an einem einzigen Ort vorgehalten: in der Extension-Method.
public static class DateTimeExtensions { public static bool IsEmpty(this DateTime dateTime) { return dateTime.Ticks == 0; } }
Die Zauberworte um Extensions zu bauen lauten this und static. Denn eine Extension muss statisch sein und auf irgend eine Art angeben an welchen Typ sie „angehangen“ wird. Um dieses „Anhängen“ auszulösen bedarf sie darüber hinaus noch mindestens einem Parameter (immer der erste) dem das this entsprechend voran gestellt wird. Die restliche Parameterliste kann frei gewählt werden.
Kommentare