2012-07-04 14 views
11

Mögliche Duplizieren:
Extension Methods vs Static Utility ClassErweiterungsmethode vs. Hilfsklasse

Ich baue eine API von allgemeinen Funktionen, die Aktionen auf Objekten in .NET basierten auszuführen. Beispielsweise; Ich habe eine Funktion erstellt, die eine Zeichenfolge überprüft, um festzustellen, ob es sich um eine E-Mail-Adresse handelt.

konnte ich entweder:

static bool IsEmailAddress(string text) 
{ 
    return IsMail(text); 
} 

oder ich könnte eine Erweiterungsmethode erstellen, die wie so verwendet werden würde:

string text = "[email protected]"; 
if (text.IsEmailAddress()) 
{ 
} 

, die besser geeignet ist, oder denken Sie, da dies eine ist Allzweckbibliothek, könnte ich es technisch in beide Richtungen implementieren und dem Entwickler erlauben zu entscheiden, welches für sie am besten ist?

+7

** BTW: ** Verwenden Sie 'Return IsMail (Text)' anstelle der if-Anweisung. –

+0

Ich würde mit Erweiterungsmethoden gehen und das Refactoring Mahmoud vorgeschlagen. –

+3

Ich denke, es liegt nicht in der Verantwortung von "string" zu wissen, was eine E-Mail-Adresse ist. Ich denke also nicht, dass dies eine Erweiterungsmethode sein sollte. – CodesInChaos

Antwort

12

Das Erstellen einer Erweiterungsmethode bedeutet, dass sie automatisch während der Intellisense angezeigt wird, wenn ein Benutzer diesen Typ verwendet. Sie müssen vorsichtig sein, wenn Sie der Liste der Methoden, die Entwickler durchsuchen, nicht viel Rauschen hinzufügen (besonders beim Erstellen eines wiederverwendbaren Frameworks). Wenn diese Methoden beispielsweise nur in einem bestimmten Kontext verwendet werden können, ist es wahrscheinlich besser, "normale" statische Methoden zu verwenden. Insbesondere bei der Implementierung von Erweiterungsmethoden für allgemeine Typen wie string.

Nehmen Sie zum Beispiel eine ToXml(this string) Erweiterungsmethode oder eine ToInt(this string) Erweiterungsmethode. Obwohl es ziemlich praktisch scheint, diese Erweiterungsmethoden zu verwenden, ist die Konvertierung von Text in XML nicht etwas, was Sie in der gesamten Anwendung tun werden, und es wäre auch so einfach, XmlHelper.ToXml(someString) zu tun.

Es gibt nur eine Sache schlimmer, und das ist eine Erweiterung Methode auf object hinzufügen.

Wenn Sie ein wiederverwendbares Framework schreiben, ist the book Framework-Design-Guidelines by Krzysztof Cwalina ein absolutes Muss.

+1

Vergessen Sie nicht, dass die Erweiterung an den Namespace gebunden ist. Daher wird intellisense für die Methoden Ihrer Erweiterung nicht angezeigt, bis Sie keinen Namespace der Erweiterung in Ihrer Clientklasse angeben. Eine andere Sache, welche Erweiterung wirklich ist? - Nach der Kompilierung - es ist eine statische Klasse mit einer statischen Methode - also würde ich lieber Erweiterungen als syntaktischen Zucker verwenden und eine gute Struktur meiner Namespaces haben, anstatt StaticHelpers zu erstellen. –

2

Ich bevorzuge Erweiterungsmethode, weil Ihr Code elegant ist, und Sie können eine Erweiterungsmethode für eine versiegelte Klasse des Frameworks definieren.

0

Eine Erweiterungsmethode ist automatisch Teil einer statischen Klasse. Dies bedeutet, dass der Konsument entweder die Erweiterungsmethoden verwenden oder die statische Methode von der Klasse aufrufen kann, wenn sie dies wünscht. Ich verwende Erweiterungsmethoden so viel wie ich kann, sie sind leichter zu entdecken, wenn sie in den richtigen Namespace eingefügt werden.

0

Durch Erweiterungsmethoden können Entwickler nicht genau wissen, wie die Hilfsklasse heißt und wo sie sich befindet, ganz zu schweigen von der Tatsache, dass sie existiert. Beachten Sie, dass Sie ihren Namespace immer noch in die using-Klausel schreiben müssen - vielleicht legen Sie sie in einen gemeinsamen Namespace auf oberster Ebene für Ihre Anwendung.

2

Die Frage ist, welches .NET Framework Sie anvisieren werden? Wenn < 3.5 dann sind Erweiterungsmethoden nicht verfügbar. Warum würden Sie sonst eine neue Klasse erstellen?