Namenskonvention für C # -Klassen: Ist es BaseClass oder ClassBase oder AbstractClass?

117

Was ist der empfohlene Ansatz zum Benennen von Basisklassen? Wird dem Typnamen " Base " oder " Abstract " vorangestellt oder wird ihm nur "Base" hinzugefügt?

Folgendes berücksichtigen:

Typ: ViewModelzB MainViewModel , ReportViewModel

Basisklasse: BaseViewModeloderViewModelBase oderAbstractViewModel

Beachten Sie auch:

Typ: ProductzB VirtualProduct , ExpiringProduct

Basisklasse: BaseProductoderProductBase oderAbstractProduct

Was denkst du ist mehr Standard?

class Entity : EntityBase
{
}

oder

class Entity : BaseEntity
{
}
Soni Ali
quelle
Mögliches Duplikat der Verwendung von "Base" in einem
Klassennamen

Antworten:

90

Es gibt Beispiele im Framework mit dem Basissuffix, z System.Configuration.Provider.ProviderBase.System.Web.SessionState.SessionStateStoreProviderBase .

Auf keinen Fall folgen jedoch alle abstrakten Basisklassen im Framework dieser Konvention (z System.Data.Common.DbParameter.System.Data.Common.DbCommand ).

Persönlich würde ich die Verwendung des Suffixes vermeiden, es sei denn, ich wollte die Tatsache hervorheben, dass es sich um eine abstrakte Klasse handelt, und hatte das Gefühl, dass Benutzer der Klasse ansonsten erwarten könnten, dass der Name auf eine konkrete Implementierung hinweist.

Joe
quelle
" AvoidBenennen von Basisklassen mit einem BaseSuffix, wenn die Klasse für die Verwendung in öffentlichen APIs vorgesehen ist." Richtlinien für das Framework-Design, Seite 174
Yousha Aleayoub,
47

Nichts des oben Genannten. Überlegen Sie, welchen Zweck Ihre Basisklasse bietet. Nennen Sie es so. Zum Beispiel könnte die Basisklasse von Automobil und Fahrrad Fahrzeug sein.

Wenn Sie Basisklassen erstellen, um nur eine Basisklasse einer Klasse zu haben, und ohne einen anderen Zweck oder Grund als diesen, machen Sie wahrscheinlich etwas falsch.

Paul Sonier
quelle
15
Dies ist nicht immer der Fall und Sie werden viele Base * -Klassen im Framework finden. CollectionBase, DictionaryBase .... etc
Chad Grant
1
Guter Punkt, die Objekte der realen Welt sollten genau in Artefakte passen. Die Abstraktion von Commons sollte wie Fahrzeug basieren, Besonderheiten müssen hinterhergehen, aber auch genau.
Ruslander
45
Es ist erwähnenswert, dass einige der Klassen in .NET Framework mit dem Suffix "Base" vor Version 1.0 benannt wurden und Microsoft diese Konventionen nicht mehr befolgt. Sie können die Namen jetzt jedoch nicht ändern. Das Microsoft Framework Design Guidelines-Buch, Abschnitt 6.2 (das Basisklassen abdeckt), empfiehlt ausdrücklich, das Suffix "Base" nicht zu verwenden.
Warren Rumak
5
Die Praxis, die ich in einer Reihe von OO-Sprachen in einer Reihe von Unternehmen am häufigsten gesehen habe, ist, dass „Base“ Basisklassen bezeichnet, die nur geerbt werden sollen - nicht direkt verwendet werden sollen. In Ihrem Beispiel klingt eine Klasse mit dem Namen "Fahrzeug" wie etwas, das verwendet und "gefahren" werden kann - sie behauptet, ein Fahrzeug zu sein. Wenn die Basisklasse jedoch als "Fahrzeugteile" oder "Vehicle Essentials" oder "Vehicle Kit" bezeichnet wurde, wissen wir, dass es sich nicht um etwas direkt Verwendbares handelt, sondern um eine Basis für eine Vielzahl von Fahrzeugen.
Slipp D. Thompson
4
Wie von Warren, Microsoft Framework Design Guidelines-Buch, Abschnitt 6.2 zu Basisklassen, erwähnt : msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Sie sagen, dass das Basissuffix vermieden werden soll: "Benennung vermeiden Basisklassen mit dem Suffix "Basis", wenn die Klasse zur Verwendung in öffentlichen APIs vorgesehen ist. "
Cwills
5

Wenn Sie über virtuelle Basisklassen sprechen, lautet der Microsoft-Standard ClassnameBase (wie CollectionBase).

Ja - dieser Jake.
quelle
3

Ich denke, es ist eine Frage der Wahl. Ich würde sagen, wenn Sie viele Basisklassen erstellen, ist es vielleicht besser, immer mit BaseClassname zu arbeiten, da Sie auf diese Weise IMMER herausfinden können, welche Basisklassen Sie verwenden können, indem Sie einfach Base eingeben und den Rest der Hilfe von erhalten Intellisense. Was wäre, wenn Sie 20 Basisklassen hätten und Base als Suffix hinzugefügt hätten und vergessen hätten, wie die Basisklasse heißt? Möchten Sie zuerst ein Klassendiagramm aus VS erstellen und herausfinden, welche Basisklassen verfügbar sind? Es ist in Ordnung, sie ClassBase zu nennen, wenn es sich nur um eine oder zwei Klassen handelt.

Gleiches gilt für die Entscheidung zwischen GetItems und ItemsGet. Ich würde sagen, zumindest aus Gründen der Lesbarkeit - wählen Sie GetItems. Befolgen Sie die Konventionen :)


quelle
1
'Basis'-Klassen sind ein OO-Hack, siehe Pauls Kommentar . Sie sind oft hilfreich und manchmal notwendig, aber sie sind immer noch ein Hack. Wenn Sie nach allen verfügbaren Basisklassen suchen müssen, warum ist das so? Was teilen sie, das Ihr Bedürfnis schafft, sie alle zusammen zu sehen? Die Antwort könnte Ihnen helfen, eine bessere Benennung zu finden.
Iain
1
@Abhishek: Die Analogie zu GetItemsfunktioniert nicht - "Get" ist nur ein Verb und macht daher nur einen englischen grammatikalischen Sinn als Präfix, während "Base" sowohl als Adjektiv (Präfix) als auch als Substantiv (Suffix) funktioniert.
Slipp D. Thompson
1
@Iain: Der Grund, warum Leute "Basis" in Klassennamen verwenden, ist nicht, dass sie alle Basisklassen finden können - die Begründung ist näher am Gegenteil. Es ist so, dass sich die Basisklasse einer Reihe verwandter Klassen von ihnen abhebt, ähnlich wie das Präfix „I“ eine Schnittstelle von den Klassen unterscheiden soll, die sie übernehmen. Ich habe das Präfix / Suffix "Basis" gesehen, das am häufigsten verwendet wird, wenn die Basisklasse für sich genommen nicht funktionsfähig ist - abstrakt durch beabsichtigte Verwendung, unabhängig von einer erzwungenen abstract.
Slipp D. Thompson
@ SlippD.Thompson Ja, 'finde alle Klassen' war eine Antwort auf Abhishek. Ich antwortete auf Pauls Antwort.
Iain
2

Wir verwenden BaseEntity, aber ich denke, es ist Ihre eigene Präferenz. Ich sehe oft den anderen.

Seien Sie einfach konsistent in Ihrem Kontext, sei es Ihr Projekt, Ihr Namespace oder, wenn möglich, Ihr Team. Unterschiedliche Konventionen sind meiner Meinung nach schlechter als schlechte Konventionen.

Gary.Ray
quelle
2

Persönlich würde ich davon abraten, die Wortbasis überhaupt hinzuzufügen. Sie wissen nie, wann Sie den Code ändern müssen, und es wird nicht mehr das Basisobjekt sein. Davon abgesehen haben wir dies in der Vergangenheit getan und das Wort Base auf der Vorderseite vorangestellt. Es scheint besser zu fließen.

kemiller2002
quelle
-1

BaseEntity ähnelt stark dem Kamelfall - strName, bseEntity. Ich würde mich für EntityBase entscheiden, da es zuerst das Thema definiert, wodurch Sie die Funktion schneller identifizieren können.

Mike Robinson
quelle
10
Sie sprechen von ungarischer Notation, nicht von Kamelhülle. Die ungarische Notation war zufällig ein Kamel, aber es sind ganz andere Dinge.
Sliderhouserules
-5

Denken Sie immer an die Alphabetisierung, wenn Sie Dinge benennen. Ich mag es wirklich nicht, einen SQL Server zu betrachten, und jede gespeicherte Prozedur heißt usp [etwas]. Verwenden Sie Get and Set in diesem Sinne nicht zu häufig als führende Namen für eine Funktion. Denken Sie anstelle von GetItems oder PlaceOrder daran, sie als ItemsGet oder OrderPlace zu benennen.

Im Allgemeinen wäre ClassnameBase / EntityBase daher die bessere Wahl.

marcc
quelle
9
Nicht zustimmen; Lesbarkeit. GetItems ist viel sinnvoller als ItemsGet.
Nathan Ridley
2
Nicht einverstanden ... der gleiche Grund wie oben ... aber nicht in der Lage abzustimmen ... :(
Mugunth
Im Gegensatz zu den anderen Kommentaren hat marcc NICHT so etwas wie itemgsGet () vorgeschlagen. Er schrieb Artikel ().
Hontvári Levente