2009-03-24 2 views
2

Erweiterungsmethoden sind wirklich interessant für das, was sie tun, aber ich fühle mich nicht 100% confortable mit der Idee, ein "Klassenmitglied" außerhalb der Klasse zu erstellen.Wann ist die Verwendung einer Erweiterungsmethode eine gute Methode?

Ich bevorzuge es, diese Praxis so viel wie möglich zu vermeiden, aber manchmal sieht es besser aus, Erweiterungsmethoden zu verwenden.

Welche Situationen sind Ihrer Meinung nach gute Praktiken für die Verwendung dieser Funktion?

Antwort

2

Ich denke, dass der beste Ort für Erweiterungsmethoden "Helfer" -Methoden oder "Verknüpfungen" sind, die vorhandene API einfacher und sauberer machen, indem sie den Argumenten existierender Methoden Standardwerte zuweisen oder sich wiederholende Ketten von Methodenaufrufen ausblenden.

Entgegen der allgemeinen Überzeugung, dass Sie Klassen "erweitern" können, für die Sie keinen Zugriff auf den Quellcode haben, können Sie dies nicht tun. Sie haben keinen Zugriff auf private Methoden und Objekte, Sie können lediglich die öffentliche API polieren und nach Ihren Wünschen krümmen (nicht empfohlen).

1

Wenn die Klasse nicht erweiterbar ist und Sie keine Kontrolle über den Quellcode haben. Oder wenn es erweiterbar ist, aber Sie möchten den vorhandenen Typ anstelle Ihres eigenen Typs verwenden können. Letzteres würde ich nur tun, wenn die Erweiterung den Charakter der Klasse nicht ändert, sondern lediglich (IMO) fehlende Funktionalität liefert.

0

Erweiterungsmethoden sind eine großartige Möglichkeit, um Funktionen zu Klassen hinzuzufügen, die Sie nicht besitzen (keine Quelle), die sich im Framework befinden oder die Sie aus irgendeinem Grund nicht erben möchten.

Ich mag sie, aber Sie haben Recht. Sie sollten vernünftig verwendet werden.

2

Sie sind ideal für Schnittstellen (wo Sie "Composite" Verhalten hinzufügen können, die nur vorhandene Methoden auf der Schnittstelle verwendet) - LINQ to Objects ist das Paradebeispiel dafür.

Sie sind auch nützlich zum Erstellen von fließenden Schnittstellen ohne Auswirkungen auf die Typen, die verwendet werden. Mein Lieblingsbeispiel ist wahrscheinlich ungeeignet für die Produktion Code, aber praktisch für Unit-Tests:

DateTime birthday = 19.June(1976) + 8.Hours(); 

Grundsätzlich überall, die Sie wollen nicht oder kann nicht das Verhalten der Art selbst hinzufügen, aber Sie wollen es einfacher machen, zu Verwendung der Typ, Erweiterungsmethoden sind eine Überlegung wert. Wenn Sie feststellen, dass Sie eine Reihe von statischen Methoden für einen bestimmten Typ schreiben, denken Sie darüber nach, ob Erweiterungsmethoden die Aufrufe dieser Methoden nicht schöner aussehen lassen.

1

Meiner Meinung nach sind Erweiterungsmethoden nützlich, um die Lesbarkeit und damit die Wartbarkeit von Code zu verbessern. Sie scheinen am besten bei Entitäten zu sein, bei denen entweder Sie keinen Zugriff auf die ursprüngliche Klasse haben oder bei denen die Methode das "Prinzip der einfachen Verantwortlichkeit" der ursprünglichen Klasse durchbricht. Ein Beispiel für Letzteres haben wir hier DSLs. Die DSL-Modelle werden erweitert, wobei Erweiterungsmethoden verwendet werden, um T4-Templating einfacher zu machen. Dem Modell werden jedoch keine Methoden hinzugefügt, es sei denn, sie sind speziell mit dem Modell verknüpft.

1

Die ideale Verwendung für sie ist, wenn Sie eine Schnittstelle haben, die an vielen Stellen implementiert wird, so dass Sie nicht eine große Last auf Implementierungen stellen möchten, aber Sie möchten, dass die Schnittstelle bequem vom Anrufer verwendet werden kann Perspektive auch.

Also setzen Sie die "Helfer" in eine Reihe von Erweiterungsmethoden, die Oberfläche selbst bleibt schön und schlank.

interface IZoomable 
{ 
    double ZoomLevel { get; set; } 
} 

public static void SetDefaultZoom(this IZoomable z) 
{ 
    z.ZoomLevel = 100; 
}