Ich implementiere häufig eine Klasse, die eine eigene Statuseigenschaft als Aufzählung verwaltet: Ich habe eine Statusaufzählung und EINE Statuseigenschaft vom Statustyp. Wie soll ich diesen Namenskonflikt lösen?
public class Car
{
public enum Status
{
Off,
Starting,
Moving
};
Status status = Status.Off;
public Status Status // <===== Won't compile =====
{
get { return status; }
set { status = value; DoSomething(); }
}
}
Wenn die Statusaufzählung verschiedenen Typen gemeinsam wäre, würde ich sie außerhalb der Klasse platzieren und das Problem wäre gelöst. Der Status gilt jedoch nur für das Auto, daher ist es nicht sinnvoll, die Aufzählung außerhalb der Klasse anzugeben.
Welche Namenskonvention verwenden Sie in diesem Fall?
NB: Diese Frage wurde teilweise in Kommentaren einer Antwort auf diese Frage diskutiert . Da es nicht die Hauptfrage war , wurde es nicht viel sichtbar.
BEARBEITEN: Filip Ekberg schlägt eine hervorragende IMO-Problemumgehung für den speziellen Fall von 'Status' vor. Es wäre jedoch interessant, über Lösungen zu lesen, bei denen der Name der Aufzählung / Eigenschaft anders ist, wie in der Antwort von Michael Prewecki .
EDIT2 (Mai 2010): Meine Lieblingslösung besteht darin, den Namen des Aufzählungstyps zu pluralisieren, wie von Chris S. vorgeschlagen. Gemäß den MS-Richtlinien sollte dies nur für Flaggenaufzählungen verwendet werden. Aber ich habe es immer mehr gemocht. Ich benutze es jetzt auch für reguläre Aufzählungen.
quelle
Antworten:
Ich werde meine 1 Euro zur Diskussion hinzufügen, aber es wird wahrscheinlich nichts Neues hinzugefügt.
Die naheliegende Lösung besteht darin, Status aus einer verschachtelten Aufzählung zu entfernen. Die meisten .NET-Enums (außer möglicherweise einige im Windows.Forms-Namespace) sind nicht verschachtelt, und es ist ärgerlich, sie für Entwickler zu verwenden, die Ihre API verwenden und dem Klassennamen ein Präfix voranstellen müssen.
Eine Sache, die nicht erwähnt wurde, ist, dass Flaggen-Enums gemäß den MSDN-Richtlinien pluralisierte Substantive sein sollten , die Sie wahrscheinlich bereits kennen (Status ist eine einfache Enumeration, daher sollten singuläre Substantive verwendet werden).
State (Enum genannt States) ist der Vokativ, "Status" ist der Nominativ eines Substantivs, das die Engländer wie die meisten unserer Sprachen aus dem Lateinischen aufgenommen haben. Vokativ ist das, was Sie ein Substantiv für seinen Zustand nennen, und Nominativ ist das Thema des Verbs.
Mit anderen Worten, wenn sich das Auto bewegt , ist das das Verb - Bewegen ist sein Status. Aber das Auto geht nicht aus, der Motor schon. Es startet auch nicht, der Motor nicht (Sie haben hier wahrscheinlich ein Beispiel ausgewählt, sodass dies möglicherweise irrelevant ist).
Staat ist so ein verallgemeinertes Substantiv. Wäre es nicht besser zu beschreiben, auf welchen Zustand es sich bezieht? Wie ich es oben getan habe
Das Typbeispiel bezieht sich auch aus meiner Sicht nicht auf den Lesertyp, sondern auf dessen Datenbank. Ich würde es vorziehen, wenn Sie das Datenbankprodukt des Lesers beschreiben würden, das für den Lesertyp nicht unbedingt relevant ist (z. B. könnte der Lesertyp nur vorwärts, zwischengespeichert usw. sein). So
In Wirklichkeit passiert dies nie, da sie als Treiber und Vererbungskette implementiert sind, anstatt Aufzählungen zu verwenden, weshalb die obige Zeile nicht natürlich aussieht.
quelle
public class EngineState
sollte aberpublic enum EngineState
im Beispiel sein, oder?Die Definition von "Aus", "Starten" und "Verschieben" würde ich als "Zustand" bezeichnen. Und wenn Sie implizieren, dass Sie einen "Status" verwenden, ist dies Ihr "Status". So!
Wenn wir ein anderes Beispiel aus dem angegebenen nehmen, in dem Sie das Wort "Typ" verwenden möchten, wie in diesem Fall:
Sie müssen wirklich sehen, dass es einen Unterschied zwischen Aufzählungen und Aufzählungen gibt, oder? Wenn Sie jedoch ein Framework erstellen oder über Architektur sprechen, müssen Sie sich auf die Ähnlichkeiten konzentrieren. OK, lassen Sie uns sie finden:
Wenn etwas auf einen Status gesetzt ist, wird es als "Dinge" -Status definiert
Beispiel: Der Status des Fahrzeugs befindet sich im Betriebszustand, im Stoppzustand usw.
Was Sie im zweiten Beispiel erreichen möchten, ist Folgendes:
Sie könnten denken, dass dies gegen das sagt, worüber ich anderen gepredigt habe, dass Sie einem Standard folgen müssen. Aber Sie folgen einem Standard! Der SQL-Fall ist ebenfalls ein spezifischer Fall und benötigt daher eine etwas spezifische Lösung.
Die Aufzählung kann jedoch in Ihrem
System.Data
Raum wiederverwendet werden, und darum geht es in den Mustern.Ein weiterer Fall, der mit dem "Typ" betrachtet werden muss, ist "Tier", wobei der Typ die Art definiert.
Dies folgt einem Muster, Sie müssen das Objekt dafür nicht "kennen" und Sie geben nicht "AnimalType" oder "DataReaderType" an. Sie können die Aufzählungen in dem Namespace Ihrer Wahl wiederverwenden.
quelle
Ich denke, das eigentliche Problem hierbei ist, dass der Aufzählungsstatus in Ihrer Klasse gekapselt ist, sodass
Car.Status
er sowohl für die EigenschaftStatus
als auch für die Aufzählung nicht eindeutig istStatus
Besser noch, stellen Sie Ihre Aufzählung außerhalb der Klasse:
AKTUALISIEREN
Aufgrund der Kommentare unten werde ich mein Design oben erklären.
Ich bin einer, der nicht glaubt, dass sich Aufzählungen oder Klassen oder andere Objekte in einer anderen Klasse befinden sollten, es sei denn, es ist innerhalb dieser Klasse völlig privat. Nehmen Sie zum Beispiel das obige Beispiel:
Während einige Kommentatoren würden als Status argumentieren hat keine Bedeutung außerhalb des Anwendungsbereichs der Klasse Auto, die Tatsache , dass Sie ein setzen öffentliche Eigenschaft bedeutet , dass es auch andere Teile des Programms sind , die werden , dass ENUM verwenden:
Und das ist für mich ein Code-Geruch. Wenn ich diesen Status außerhalb von betrachte
Car
, kann ich ihn auch außerhalb definieren .Als solches werde ich es wahrscheinlich einfach umbenennen als:
Wenn diese Aufzählung jedoch innerhalb und nur innerhalb der Fahrzeugklasse verwendet wird, kann ich die Aufzählung dort gut deklarieren.
quelle
OR
undCR
. Beide haben ihre eigenen Zustände, daher ist es keine Option, sie außerhalb ihres eigenen Bereichs zu definieren.Ich weiß, dass mein Vorschlag gegen die .NET-Namenskonventionen verstößt, aber ich persönlich stelle Enums mit 'E' und Enum-Flags mit 'F' voran (ähnlich wie wir Interfaces mit 'I' voranstellen). Ich verstehe wirklich nicht, warum dies nicht die Konvention ist. Enums / Flags sind ein Sonderfall wie Interfaces, die ihren Typ niemals ändern. Es macht nicht nur deutlich, was es ist, es ist auch sehr einfach, Intellisense einzugeben, da das Präfix die meisten anderen Typen / Variablen / usw. filtert und Sie diese Namenskonflikte nicht haben.
Und das würde auch ein anderes Problem lösen, bei dem für Beispiele in WPF statische Klassen wie Aufzählungen (z. B. FontWeights) verwendet werden, die vordefinierte Instanzen von Typen haben, aber Sie würden nicht wissen, wenn Sie nicht danach suchen. Wenn ihnen nur 'E' vorangestellt wird, müssen Sie nur ein Zeichen eingeben, um diese speziellen statischen Klassen zu finden.
quelle
Hasser der ungarischen Notation und ihrer Varianten sind verdammt. Ich verwende eine Konvention zum Suffixieren von Aufzählungen mit - warte darauf -
Enum
. Ich habe folglich nie das Problem, das Sie beschreiben, verschwende Zeit damit, mir Gedanken darüber zu machen, wie ich sie nennen soll, und der Code ist lesbar und selbstbeschreibend, um zu booten.quelle
Ich würde den Namen der Eigenschaft in "CurrentStatus" ändern. Schnell und einfach :)
quelle
Ich schlage vor, dem Typnamen "Option" hinzuzufügen (oder Flag, wenn es Bitflags enthält), dh Typ ist Car.StatusOption und Eigenschaft ist Car.Status.
Im Vergleich zu pluralizing, Namensgebung Dies vermeidet Kollisionen , wenn Sammlungen des Aufzählungstypen zu schaffen, in denen Sie normalerweise die Sammlung pluralize wollen Eigenschaft , nicht der Aufzählungstyp .
quelle
Normalerweise stelle ich die Aufzählungen voran, z. B. CarStatus. Ich nehme an, es hängt alles vom Team ab, mit dem Sie arbeiten (ob es Regeln / Prozesse für solche Dinge gibt) und von der Verwendung der Objekte. Nur meine 2 Cent (:
quelle