2009-04-07 2 views
3

Es scheint mir nützlich zu sein, auf einen Blick zu erkennen, dass eine Klasse abstrakt ist und nicht direkt instanziiert werden soll, genauso wie es nützlich ist, eine Schnittstelle leicht identifizieren zu können.Präfixierende abstrakte Klassen mit "A" ähnlichen Schnittstellen haben das Präfix "I"?

Meine Frage ist, warum hat sich "AFourLeggedAnimal: IAnimal" nicht durchgesetzt? Liegt es einfach an der möglichen Verwirrung (die ich gerade beim Schreiben bemerkt habe), zum Beispiel, es als "Ein vierbeiniges Tier" anstelle von "abstrakte Klasse FourLeggedAnimal" zu verwechseln? Oder ist es etwas mehr?

Von Java in der Schule zu C# bei der Arbeit, fand ich die Präfix Namenskonvention "I" äußerst nützlich, wenn Sie durch eine Liste von Klassen und es scheint mir, dass es bequem sein würde, zwischen Beton zu unterscheiden und nicht-konkrete Klassen auf einen Blick, ohne auf den Code schauen zu müssen.

+0

Warum nicht "A" in "Zusammenfassung" erweitern ? Es ist nicht so, als würde die Verwendung der längeren Form Ihre Produktivität messbar reduzieren. Verkürze dich nicht so, es verursacht potentielle Verwirrung ohne materiellen Gewinn. –

+0

Ich bevorzuge definitiv Suffixe für die Klassifizierung. Ich erinnere mich noch an den Index in der MFC-Referenz. Es gab fast keine Einträge, außer in dem Abschnitt des Buchstaben C, der einen Bazillion Einträge für Klassen enthielt: CDocument, CView, CWindow usw. –

Antwort

12

Verwenden Sie das Suffix "Base", wie Joel erwähnt. Sobald Sie eine Menge in Ihrem Projekt haben, dann ist es ziemlich leicht auseinander zu halten:

public abstract AnimalBase 
{ 
    public AnimalType AnimalType { get; set; } 
} 

public abstract HorseBase : AnimalBase 
{ 
    public HoovesManufacturer HoovesManufacturer { get; set; } 
} 

public class Pony : HorseBase 
{ 
    public Pony() 
    { 
    } 
} 
+0

lol, ich denke, das ist einer dieser "duh" Momente. Ich habe das Basis-Suffix völlig vergessen, obwohl ich es irgendwann wusste. Kennzeichnung als akzeptiert, da Sie ein schönes Beispiel geben. – Davy8

+0

HufeHersteller? Wäre das die Mutter und der Vater? – tvanfosson

+0

@tvanfosson: lol Ich habe es auf Opera Mobile geschrieben, keine Rechtschreibprüfung. – eduncan911

13

Ich bevorzuge es, mit "Base" zu ergänzen.

+0

Meine Frage - warum Basis? –

+0

Weil so ziemlich jeder OOP mit "Basis" -Klassen in der Terminologie unterrichtet wurde. Andere Programmierer werden dies verstehen. –

+1

Aber was, wenn es keine Basisklasse ist?Wie es eine Schnittstelle gibt, eine Klasse, die die Schnittstelle implementiert, und eine Unterklasse der Klasse. Haben Sie noch Base als Präfix? –

4

Weil, offen gesagt, das akzeptierte Muster für die Benennung abstrakter Klassen bereits gesetzt ist ;-) Es ist mit einem "Base" Suffix, wie MyControlBase oder FooBase.

-Oisin

+0

Das war in seiner Frage impliziert. Er fragt nach C#: "kommt von Java zu C# ..." – x0n

2

In Java vielen „abstrakt“ Klassen werden mit „Zusammenfassung“ zB Präfix - AbstractList usw.

Am Ende warum tut Es ist wichtig, dass man wissen muss, ob eine Klasse abstrakt ist, nur weil sie ihren Namen liest. Es gibt nur so viele Details, die man in einen Klassennamen einordnen kann, bevor sie ziemlich lang werden.

Ich persönlich finde das "I" Präfix Ding für Schnittstellen ziemlich hässlich. Ich glaube, man sollte nicht versuchen, solche Details in einem Klassennamen zu kodieren. Ich glaube, dass man durch die Kombination von Implementierungsdetails mit dem Namen der Schnittstelle wirklich aussagekräftige, aber kurze Namen erhält. Ein perfektes Beispiel ist Java's Map, HashMap etc. alles sehr kurz und prägnant.

+1

Ich finde es erleichtert die Code-Organisation zu folgen. In Ihrem Beispiel mit Map, ohne den Code zu betrachten oder die JavaDocs zu konsultieren, kann ich nicht sagen, dass Map somemap = new Map() nicht gültig ist und dass ich nach einer Klasse suchen sollte, die Map – Davy8

+0

implementiert Besonders hilfreich beim Versuch, eine unbekannte Codebasis zu verstehen, ist es einfacher, ein Gefühl dafür zu bekommen, wie die Dinge zusammenpassen. – Davy8

+0

Es sollte aus dem Namen zB "Karte" offensichtlich sein, dass es eine Schnittstelle beschreibt und nicht konkret ist. Der "Hash" in HashMap zeigt deutlich die Strategie bei der Implementierung von Map. Wenn Sie bei der Benennung Ihrer Schnittstellen eine Kombinationsstrategie verwenden, haben Sie kürzere Namen als konkrete Klassen. Dies ist perfekt ... –

1

Das I-Präfix ist hässlich, aber das ist leider die Konvention von Microsoft. In einer idealen Welt sollten wir alle auf Schnittstellen programmieren. Konkrete Klassen würden ein Suffix Impl oder etwas haben, um sie von der Schnittstelle oder der abstrakten Klasse zu unterscheiden (und es ist uns egal, weil unsere IoC-Container das für uns handhaben werden!)

z.B. Book wäre eine Schnittstelle oder eine abstrakte Klasse und es spielt keine Rolle, welche. Wir würden die meiste Zeit auf nette, saubere Namen programmieren. Die tatsächlich zu verwendende Implementierung lässt sich leicht aus einer Konfigurationsdatei einstecken.

Aber leider leben wir nicht in einer so idealen Welt.

Verwandte Themen