2010-04-23 15 views
21

Ich nenne normalerweise meine C# -Schnittstellen als IThing. Ich erstelle eine Erweiterungsmethode Klasse für IThing, aber ich weiß nicht, wie ich es nennen soll. Auf der einen Seite, es ThingExtensions zu nennen scheint zu implizieren, es ist eine Erweiterung Klasse zu einigen Thing Klasse anstelle von IThing Schnittstelle. Außerdem wird die Erweiterungsklasse bei der alphabetischen Anzeige von Dateien außerhalb der erweiterten Benutzeroberfläche sortiert. Auf der anderen Seite macht es die Bezeichnung IThingExtensions so, als ob es sich um eine Schnittstelle selbst handelt, anstatt um eine Erweiterungsklasse für eine Schnittstelle. Was würdest du vorschlagen?C# -Namenskonvention für Erweiterungsmethoden für die Schnittstelle

Edit: gibt es keine Thing Klasse, die IThing, als Antwort auf einige der Kommentare implementiert.

+0

Sollte zu migrierenden [Programmierer] (http://programmers.stackexchange.com), denn es befasst sich nicht mit einer Codierung Problem, sondern bezieht sich auf die Entwicklung der Praxis (wie man Namenserweiterungsmethoden). –

+0

Kam hier auf der Suche nach einer klaren gewinnenden Antwort und war eigentlich nicht überrascht, keinen zu finden ... Ich war gezwungen, sowohl Ihre Frage und ** sowohl ** Reeds und Jareds Antworten zu verbessern! –

Antwort

20

Ich bevorzuge definitiv den Namen ThingExtensions über IThingExtensions. Der Grund dafür ist, dass für die meisten Programmierer ein I Präfix für einen Typ bedeutet, dass es eine Schnittstelle ist. Dies ist ein sehr häufiges Muster und Teil der .Net Design Guidelines.

Durch das Hinzufügen eines I Präfixes für den Fall der Erweiterungsmethode werden sowohl Annahmen als auch etablierte Richtlinien verletzt.

Es gibt auch Vorrang in the Base Class Library. Die Mehrzahl der für IEnumerable verfügbaren Erweiterungsmethoden sind im Typ Enumerable enthalten.

+3

Ich stelle mir vor, dass es eine Klasse namens 'Thing' gibt, die' IThing' implementiert, daher wäre es verwirrend, wenn es 'ThingExtensions' genannt wird, aber an' IThing's funktioniert. Aber @Sarah Vessels gibt dies nicht an ... –

+1

BCL = Base Class Libraries –

+0

@klausbyskov: Es gibt eigentlich keine 'Thing' Klasse, die' IThing' implementiert. Ich werde meine Frage aktualisieren. –

0

Ich würde es vorziehen, es in einen Ordner (und Namespace) namens Extensions und benennen es IThingExtensions.

3

Die meisten Programmierer weiß, dass ich in einer statischen Klasse für eine Anwendung alle ihre Erweiterungsmethoden setzen ExtensionMethods (oder so ähnlich) genannt, unabhängig von der Klasse die Erweiterungen ändern, und dann setzen sie diese Klasse in ihre Haupt Programmnamespace.

Ihre Begründung ist, dass, wenn Sie die Erweiterungsmethode in den gleichen Namespace wie die Klasse, die es ändert, setzen, können Sie die Methode mit den Methoden der tatsächlichen Klasse verwechseln, was darauf hinweist, dass die Erweiterungsmethode Teil ist die ursprüngliche Funktionalität, wenn es nicht ist.

Sie sind natürlich nicht universelle Vereinbarung darüber. Siehe hier: How do you manage the namespaces of your extension methods?

13

Ich persönlich würde IThingExtensions verwenden.

Aus Sicht der Benutzerfreundlichkeit sieht der Endbenutzer diese Klasse nie - sie enthalten nur ihren Namespace. Wenn der Namensraum der gleiche ist wie IThing, dann spielt es keine Rolle - sie haben ihn schon.

Das sagte, ich denke, dass die Tatsache, dass diese Erweiterungen für alle IThingIThingExtensions am deutlichsten sind. Wenn Sie eine Thing-Klasse haben, kann der Aufruf dieser ThingExtensions mehrdeutig erscheinen (erweitern Sie die Schnittstelle oder die Implementierung selbst?).

Das gesagt, das Framework verwendet einen ganz anderen Ansatz. Der Ansatz des Frameworks besteht darin, eine Klasse namens Thing zu verwenden, um IThing zu erweitern. Beispiele finden Sie unter Enumerable (Erweiterung IEnumerable) und Queryable (Erweiterung IQueryable). Dies wäre auch eine sehr gute Option.

+1

Ich befolge den Ansatz des Frameworks in meinen Projekten. Hat bis jetzt noch keine unangenehmen Nebenwirkungen gehabt. –

+0

@Programming: Es funktioniert gut, vorausgesetzt, Sie haben keine Standardimplementierung für 'IThing' mit dem Namen' Thing' ... –

+1

Ich mag diesen Ansatz immer noch nicht, weil es die Designrichtlinien für die Typbenennung verletzt. Insbesondere nur Präfix-Typ-Namen mit einem I, wenn es tatsächlich eine Schnittstelle ist. http://msdn.microsoft.com/en-us/library/ms229040.aspx – JaredPar

0

Mir ist keine Standardkonvention dafür bekannt. Ich würde entweder ThingExtensions oder ThingInterfaceExtensions verwenden. Ich würde mich von IThingExtensions fernhalten, wie Sie es auch vorgeschlagen haben.

0

ich einen etwas anderen Ansatz genommen haben, und eher als Suffix mit Extension umgekehrt die Namensgebung Strategie, um die Erweiterungsmethoden mit Extend-Präfix die Klasse enthält; mein Grundprinzip ist wie folgt:

  • Wie in Reed Copsey's answer, sehr darauf hingewiesen (sehr) Client-Code selten der enthaltenden Klasse direkt als sehr Punkt Erweiterungsmethoden werden Referenz ist die Referenzmethoden zu emulieren. Sie werden die Klassen nicht sehen, daher sollte die Wahl der Klassenbenennungskonvention nur unwesentliche Auswirkungen haben. Die Klassen müssen static sein und Sie werden sie daher niemals instanziieren Daher enden Sie niemals mit der semantischen Kuriosität von new ExtendThing(), was die Namensgebung betrifft.
  • Alle Ihre Extend* Klassen sind visuell mit Alpha-Datei Sortierung gruppiert.
  • Und in Bezug auf Ihre Frage speziell gibt es keine Präfix Verwirrung der Schnittstellenbenennung; Sie können haben ExtendThingundExtendIThing und (IMO) ihre Absicht und Ziel ist klar.

namespace MyCompany.Extensions 
{ 
    public static class ExtendObject { } 

    public static class ExtendDateTime { } 

    public static class ExtendIEnumerable { } 
} 
Verwandte Themen