116 Stimmen

Benennungskonventionen für abstrakte Klassen

Ich erinnere mich ganz deutlich daran, dass Microsoft einmal die Richtlinie hatte, dem Namen einer abstrakten Klasse das Suffix "Base" hinzuzufügen, um offensichtlich zu machen, dass es sich um eine abstrakte Klasse handelt. Deshalb haben wir Klassen wie System.Web.Hosting.VirtualFileBase, System.Configuration.ConfigurationValidatorBase, System.Windows.Forms.ButtonBase und natürlich auch System.Collections.CollectionBase.

Aber mir ist aufgefallen, dass in letzter Zeit viele abstrakte Klassen im Framework diese Konvention nicht mehr zu befolgen scheinen. Zum Beispiel sind die folgenden Klassen alle abstrakt, folgen aber nicht dieser Konvention:

  • System.DirectoryServices.ActiveDirectory.DirectoryServer

  • System.Configuration.ConfigurationElement

  • System.Drawing.Brush

  • System.Windows.Forms.CommonDialog

Und das ist nur, was ich in wenigen Sekunden finden konnte. Also habe ich nachgesehen, was die offizielle Dokumentation dazu sagt, um sicherzugehen, dass ich nicht verrückt bin. Ich habe die Namen von Klassen, Structs und Interfaces auf MSDN unter Designrichtlinien für die Entwicklung von Klassenbibliotheken gefunden. Seltsamerweise habe ich keine Erwähnung der Richtlinie gefunden, "Base" am Ende des Namens einer abstrakten Klasse hinzuzufügen. Und die Richtlinien sind für Version 1.1 des Frameworks nicht mehr verfügbar.

Also, werde ich verrückt? Hat diese Richtlinie jemals existiert? Wurde sie einfach kommentarlos aufgegeben? Habe ich zwei Jahre lang alleine lange Klassennamen erstellt, umsonst?

Jemand wirf mir einen Knochen zu.

Update Ich bin nicht verrückt. Die Richtlinie hat existiert. Krzysztof Cwalina beschwert sich darüber im Jahr 2005.

0 Stimmen

Wenn Sie diesen Text gelesen haben, beschwert sich Krzysztof lediglich darüber, "einen Satz von Empfehlungen" erhalten zu haben - nicht unbedingt, dass diese Empfehlungen von Microsoft offiziell waren. Ich erinnere mich daran, die Richtlinien von MS gelesen zu haben und gesehen zu haben, dass sie dagegen empfehlen.

1 Stimmen

Ich habe es gelesen, obwohl es das erste Mal ist, dass ich diesen bestimmten Artikel gesehen habe. Es ist tatsächlich eine Erleichterung. Mir hat die Empfehlung nie wirklich gefallen. Das wird mir eine Menge Groll ersparen. :)

74voto

Iain Holder Punkte 13981

In Framework Design Guidelines p 174 states:

Vermeiden Sie, Basisklassen mit einem "Base"-Suffix zu benennen, wenn die Klasse für die Verwendung in öffentlichen APIs vorgesehen ist.

Auch: http://blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx

22voto

Joel Coehoorn Punkte 377088

Außerdem kann es hässlich werden, wenn die abstrakte Klasse einige statische Elemente enthält, die verwendet werden sollen.

15voto

mmx Punkte 400975

Ich erinnere mich nicht an solche Richtlinien. Ich glaube, du solltest die Benennung verwenden, die Sinn macht. Manchmal dient die abstrakte Klasse nur dazu, gemeinsame Funktionalitäten für einige Klassen bereitzustellen (als Werkzeug), was meiner Meinung nach den Suffix haben sollte. In einigen Fällen möchten Sie es jedoch als Basis einer Polymorphie-Hierarchie verwenden, die an sich nicht vollständig ist. In diesen Fällen schlage ich vor, es wie eine normale Klasse zu benennen.

Wie Sie sehen, werden Sie wahrscheinlich keine Methode deklarieren, die ein ButtonBase-Objekt als Parameter akzeptiert. Es ist so konzipiert, dass es minimale Funktionalitäten für Unterklassen bereitstellt. Möglicherweise behandeln Sie jedoch ein ConfigurationElement als Entität, die verschiedene Formen hat, aber an sich nicht vollständig ist (und daher abstrakt ist).

13voto

James Punkte 131

Manchmal ist Base immer noch notwendig, besonders wenn Sie sowohl eine konkrete Klasse als auch eine abstrakte Klasse zur Verfügung stellen, damit jemand sie erweitern kann, um eine konkrete Implementierung zu erstellen.
z.B. Controller und ControllerBase (eigentlich ist Controller auch abstrakt, bietet aber deutlich mehr Funktionalität als ControllerBase)

Der Basissuffix ist hässlich, wenn man gegen ein Interface programmiert, daher denke ich, dass die Microsoft-Richtlinie, ihn nicht zu verwenden, gilt, wenn die abstrakte Klasse hauptsächlich wie ein Interface verwendet wird. Wahrscheinlich ist das gemeint mit öffentlicher API.

Der Punkt ist, dass es Fälle gibt, in denen es keine bessere Alternative zum Verwenden des Basissuffix gibt.

4 Stimmen

Ich stimme zu. Ich arbeite in einem Feed-System, das Inhalte aus verschiedenen Quellen analysiert. In der öffentlichen API verwenden wir eine Schnittstelle namens IFeedParser und intern verwenden wir eine abstrakte Basisklasse, die gemeinsame Funktionalitäten enthält, namens BaseFeedParser.

4voto

Sam Jazz Punkte 121

Microsoft gibt unter folgender Adresse an:

https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces

Bitte erwägen Sie, den Namen von abgeleiteten Klassen mit dem Namen der Basisklasse zu beenden. Dies ist sehr lesbar und erklärt die Beziehung deutlich. Einige Beispiele hierfür im Code sind: ArgumentOutOfRangeException, welches eine Art von Exception ist, und SerializableAttribute, welches eine Art von Attribute ist. Es ist jedoch wichtig, vernünftiges Urteilsvermögen bei der Anwendung dieser Richtlinie zu verwenden; zum Beispiel ist die Klasse Button eine Art von Control-Ereignis, obwohl Control nicht in ihrem Namen erscheint.

Allgemein gesprochen schließt dies die Verwendung von "Base" im Namen implizit aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X