Vorteile der Verwendung von enums über direkt mit integrierten Typen?

8

1) Ich kenne die folgenden Vorteile:

  • Sie erhöhen das Niveau der Abstraktion, da Sie sofort sehen, welche zugrundeliegenden integralen Werte darstellen.

  • Sie können sie anstelle von magischen Zahlen verwenden und dadurch den Code verständlicher machen

  • Sie schränken auch die Werte ein, die eine enum Variable haben kann, und machen dadurch die Anwendung sicherer, da Programmierer wissen, welche Werte für Variable gültig sind, also schätze ich, dass sie eine Art Sicherheit bieten

Gibt es andere Vorteile, die sie direkt mit integrierten Werten bieten?

2) Warum verwenden sie Integrale als zugrunde liegenden Typ und nicht als String?

danke

    
user437291 14.09.2010, 18:44
quelle

5 Antworten

8

Sie haben viele der Hauptgründe aufgeführt, in denen enums den integralen Typen vorzuziehen sind.

  • Benannte Konstanten sind sicherer und lesbarer als magische Zahlen

  • Enums beschreiben Programmierern, wofür sie sind. Integrale Werte nicht.

  • Natürlich die Menge der Werte begrenzen, die übergeben werden kann. (Sie haben die Spitze des Typ-Sicherheits-Eisbergs ... aber schauen Sie tiefer ...)

Sie können auch hinzufügen:

  • Stark erhöhte Typsicherheit. Wenn du ein 'int' akzeptierst, dann kann irgendein int übergeben werden. Wenn du einen VehicleType akzeptierst, kann nur ein VehicalType übergeben werden. Ich spreche nicht nur von jemandem, der 6 eingibt, wenn die größte erlaubte Zahl 5 ist. Ich meine was, wenn Sie FuelType.Unleaded an eine Funktion weitergeben, die es VehicleType.Aeroplane bedeutet? Mit enums sagt Ihnen der Compiler, dass Sie ein Idiot sind. Ein integraler Typ sagt "Ja, 5 ist in Ordnung mit mir" und Ihr Programm zeigt ein wirklich merkwürdiges Verhalten, das extrem schwer zu verfolgen ist.

  • Leichteres Refactoring. Genau wie bei allen magischen Konstanten: Wenn Sie in Ihrem Programm an hundert Stellen den Wert 5 übergeben, sind Sie in Schwierigkeiten, wenn Sie sich entscheiden, 5 zu ändern, um eine andere Bedeutung zu haben. Mit einer Enumeration können Sie die zugrunde liegenden Werte ändern (solange Sie keine Bedenken hinsichtlich der Kompatibilität mit binären Abwärtskompatibilität haben). Sie können auch den zugrunde liegenden Typ einer Enumeration ändern, wenn Sie möchten (byte - & gt; int - & gt; lang), ohne den Client-Code neu kompilieren zu müssen.

  • Bitfields sind so viel einfacher zu bearbeiten, wenn die Bits und Masken benannt werden können. Und wenn Sie neue Bits hinzufügen, können Sie oft Dinge so arrangieren, dass nur die Aktualisierung der zugehörigen Masken den meisten vorhandenen Code die neuen Bitfelder perfekt verarbeiten lässt, ohne sie von Grund auf neu schreiben zu müssen.

  • Konsistenz durch das Programm. Wenn Sie mit Verschleierung und Typsicherheit vorsichtig umgehen, können Sie mithilfe von Aufzählungen eine Liste mit benannten Werten darstellen, die ein Benutzer auswählt, mit den gleichen Namen im Code, jedoch ohne den Effizienzaufwand für die Verwendung von Zeichenfolgen.

  • Jeder versteht, warum Konstanten im Code großartig sind. Enums geben dir einfach eine Möglichkeit, eine verwandte Gruppe von Konstanten zusammenzuhalten. Sie könnten dasselbe auf eine unordentlichere Art und Weise erreichen, indem Sie einen Namespace von Konflikten verwenden.

  • Die Verwendung einer Enumeration für einen Parameter anstelle eines bool macht den Code nicht nur dokumentarisch, lesbar und weniger fehleranfällig. Es macht es auch viel einfacher, eine dritte Option hinzuzufügen, wenn Sie feststellen, dass zwei Optionen nicht genug sind.

Wie bei allen Tools können Enums missbraucht werden. Benutze sie einfach dort, wo sie Sinn machen.

2) Warum verwenden Sie Bytes oder Ints anstelle von Strings? Einfach sind sie klein und effizient.

    
Jason Williams 14.09.2010, 19:59
quelle
5

Ich würde vermuten, dass sie zugrunde liegende Integraltypen benötigen, um die Einfachheit des Vergleichs sicherzustellen und Bit-Flags leichter zu unterstützen. Ohne diese Einschränkung müssten wir, oder der Compiler oder die Laufzeit, wahrscheinlich auf etwas Unschärfe zurückgreifen, um Dinge wie Kombinationen zu tun - oder wir würden in eine Situation geraten, in der - wie Sie sagen - wir nicht kümmern sich um den zugrunde liegenden Typ (den Punkt der Abstraktion) und doch, wenn wir versuchen, A | B zu sagen, erhalten wir einen Laufzeitfehler, weil wir einen zugrunde liegenden Typ verwendet haben, der zu dieser Art von Operation nicht in der Lage ist.

    
Rex M 14.09.2010 18:49
quelle
2

Ein Vorteil ist, wenn Sie Enum als Flagge verwenden möchten.

Wenn Sie also eine Enum definieren:

%Vor%

Wenn Sie eine Methode haben, die eine Instanz von TestEnum als Variable akzeptiert, können Sie die Werte aus der Enumeration kombinieren, sodass Sie beispielsweise A | B | C als Parameter für die Methode senden können. Dann können Sie innerhalb der Methode den Parameter wie folgt überprüfen:

%Vor%

Ich denke auch, dass die Gründe, die Sie erwähnen, gut genug sind, um Enums zu verwenden.

Auch in Bezug auf den Kommentar, dass Sie einen falschen Wert in eine Enum mit Code wie diesem (TestEnum)500; erzwingen können, ist es schwer zu tun, wenn Sie Ihren Code nicht brechen wollen.

Der Punkt, dass der Wert 0 für eine Enumeration der Standardwert sein sollte, oder im Fall von Flags "das Fehlen aller anderen Flags" ist sehr wichtig, da die Zeile TestEnum myenum myenum als 0 setzt, egal ob Sie habe einen Aufzählungswert für 0 definiert oder nicht.

    
Øyvind Bråthen 14.09.2010 19:33
quelle
1

Sie können eine Enum auch aus der Zeichenfolgendarstellung analysieren. Sie können diese Zeichenfolge aus einer Datenquelle oder einem Benutzereintrag abrufen.

Ich glaube, du hast mir Enums bei "magischen Zahlen" verkauft.

    
Brad 14.09.2010 18:48
quelle
1

Der Hauptvorteil von enum besteht darin, dass auf Konstanten konsistent, expressiv und typensicher Bezug genommen werden kann. Lesbarkeit ist natürlich der größte Vorteil der Verwendung der Aufzählung.

Ein weiterer Vorteil ist, dass Aufzählungskonstanten automatisch vom Compiler generiert werden.
Wenn Sie zum Beispiel einen Aufzählungstyp für Fehlercodes hatten, die in Ihrem Programm vorkommen könnten, könnte Ihre Enum-Definition in etwa so aussehen: enum Error_Code { OUT_OF_MEMORY, DATEI NICHT GEFUNDEN }; OUT_OF_MEMORY wird vom Compiler automatisch der Wert 0 (Null) zugewiesen weil es zuerst in der Definition erscheint. FILE_NOT_FOUND gleich 1, so weiter. Wenn Sie sich dem gleichen Beispiel nähern, indem Sie symbolische Konstanten oder magische Zahlen verwenden, schreiben Sie viel mehr Code, um dasselbe zu tun.

    
prabhats.net 14.09.2010 20:50
quelle

Tags und Links