Der erste Artikel sieht für mich gut aus. Basierend auf den Kommentaren scheinen jedoch einige Kommentare zu Java-Enums einige Dinge zu klären.
Der Aufzählungstyp in Java ist per Definition eine Klasse, aber viele Programmierer neigen dazu, dies zu vergessen, da sie ihn eher auf "eine Liste zulässiger Werte" beziehen, wie in einigen anderen Sprachen. Es ist mehr als das.
Um diese switch-Anweisungen zu vermeiden, ist es möglicherweise sinnvoll, Code und zusätzliche Methoden in die enum-Klasse einzufügen. Es besteht fast nie die Notwendigkeit, eine separate "enum-like real class" zu erstellen.
Berücksichtigen Sie auch den Punkt der Dokumentation - möchten Sie die tatsächliche Bedeutung Ihrer Aufzählung in der Datenbank dokumentieren? Im Quellcode, der die Werte widerspiegelt (Ihr Aufzählungstyp) oder in einer externen Dokumentation? Ich persönlich bevorzuge den Quellcode.
Wenn Sie Enum-Werte aufgrund der Geschwindigkeit oder aus irgendeinem Grund als Ganzzahlen in der Datenbank darstellen möchten, sollte sich diese Zuordnung auch in der Java-Enum befinden. Sie erhalten standardmäßig eine Zeichenfolgennamenzuordnung, und damit bin ich zufrieden. Jedem Aufzählungswert ist eine Ordnungszahl zugeordnet, aber die direkte Verwendung als Ordnungszahl zwischen Code und Datenbank ist nicht sehr hell, da sich diese Ordnungszahl ändert, wenn jemand die Werte im Quellcode neu anordnet. Oder fügt zusätzliche Aufzählungswerte zwischen vorhandenen Werten hinzu. Oder entfernt einen Wert.
(Wenn jemand den Namen der Aufzählung im Quellcode ändert, wird die Standard-Zeichenfolgenzuordnung natürlich auch schlecht, aber das ist weniger wahrscheinlich. Und Sie können sich bei Bedarf leichter davor schützen, indem Sie eine Laufzeitprüfung durchführen und überprüfen Sie die Einschränkungen in der Datenbank, wie hier bereits vorgeschlagen.)
Ich habe versucht, mein Verständnis zusammenzufassen. Sie können dies jederzeit bearbeiten, wenn Sie Korrekturen vorgenommen haben. Also los geht's:
Im Code
Im Code sollten Aufzählungen entweder mit dem nativen Aufzählungstyp der Sprache (zumindest in Java und C #) oder mit dem "typsicheren Aufzählungsmuster" behandelt werden . Es wird davon abgeraten, einfache Konstanten (Integer oder ähnliches) zu verwenden, da Sie die Typensicherheit verlieren (und es schwierig machen zu verstehen, welche Werte für eine Methode zulässig sind).
Die Wahl zwischen diesen beiden hängt davon ab, wie viel zusätzliche Funktionalität an die Aufzählung angehängt werden soll:
Insbesondere in Java kann eine Aufzählung nicht von einer anderen Klasse erben. Wenn Sie also mehrere Aufzählungen mit ähnlichem Verhalten haben, die Sie in eine Oberklasse einfügen möchten, können Sie die Aufzählungen von Java nicht verwenden.
Anhaltende Aufzählungen
Um Aufzählungen beizubehalten, sollte jedem Aufzählungswert eine eindeutige ID zugewiesen werden. Dies kann entweder eine Ganzzahl oder eine kurze Zeichenfolge sein. Eine kurze Zeichenfolge wird bevorzugt, da sie mnemonisch sein kann (erleichtert DBAs usw. das Verständnis der Rohdaten in der Datenbank).
Ein Problem bei diesem Ansatz besteht darin, dass die Liste der zulässigen Aufzählungswerte an zwei Stellen vorhanden ist (Code und Datenbank). Dies ist schwer zu vermeiden und wird daher oft als akzeptabel angesehen. Es gibt jedoch zwei Alternativen:
quelle
Bei der Codebehandlung für C # haben Sie die Definition des Löschens des 0-Werts verpasst. Ich erkläre fast immer meinen ersten Wert als:
public enum SomeEnum { None = 0, }
Um als Nullwert zu dienen. Da der Hintergrundtyp eine Ganzzahl ist und eine Ganzzahl standardmäßig 0 ist, ist es an vielen Stellen äußerst nützlich zu wissen, ob eine Aufzählung tatsächlich programmgesteuert festgelegt wurde oder nicht.
quelle
Java oder C # sollten immer Enums im Code verwenden. Haftungsausschluss: Mein Hintergrund ist C #.
Wenn der Wert in einer Datenbank beibehalten werden soll, sollten die Integralwerte jedes Aufzählungselements explizit definiert werden, damit eine spätere Änderung des Codes nicht versehentlich die übersetzten Aufzählungswerte und damit das Anwendungsverhalten ändert.
Werte sollten immer als integrale Werte in einer Datenbank gespeichert werden, um sie vor dem Refactoring von Enum-Namen zu schützen. Bewahren Sie die Dokumentation zu jeder Aufzählung in einem Wiki auf und fügen Sie dem Datenbankfeld einen Kommentar hinzu, der auf die Wiki-Seite verweist, die den Typ dokumentiert. Fügen Sie dem Aufzählungstyp, der einen Link zum Wiki-Eintrag enthält, auch XML-Dokumentation hinzu, damit dieser über Intellisense verfügbar ist.
Wenn Sie ein Tool zum Generieren von CRUD-Code verwenden, sollte es in der Lage sein, einen Aufzählungstyp zu definieren, der für eine Spalte verwendet werden soll, damit generierte Codeobjekte immer aufgezählte Elemente verwenden.
Wenn für ein Aufzählungsmitglied eine benutzerdefinierte Logik angewendet werden muss, haben Sie einige Optionen:
Ich habe dies nicht versucht, aber mit SQL Server 2005 oder höher könnten Sie theoretisch C # -Code in der Datenbank registrieren, der Aufzählungsinformationen enthält, und die Möglichkeit, Werte in Aufzählungen zu konvertieren, um sie in Ansichten oder anderen Konstrukten zu verwenden, und so eine Methode zum Übersetzen von erstellen Daten auf eine Weise, die für DBAs einfacher zu verwenden ist.
quelle
Imho, wie für den Codeteil:
Sie sollten immer den Typ 'enum' für Ihre Aufzählungen verwenden. Grundsätzlich erhalten Sie eine Menge Werbegeschenke, wenn Sie dies tun: Typensicherheit, Kapselung und Vermeidung von Schaltern, Unterstützung einiger Sammlungen wie
EnumSet
undEnumMap
und Codeklarheit.Für den Persistenzteil können Sie die Zeichenfolgendarstellung der Aufzählung jederzeit beibehalten und mit der Methode enum.valueOf (Zeichenfolge) zurückladen.
quelle
Das Speichern des Textwerts einer Aufzählung in einer Datenbank ist dem Speichern einer Ganzzahl aufgrund des zusätzlichen Speicherplatzes und der langsameren Suche weniger vorzuziehen. Es ist insofern wertvoll, als es mehr Bedeutung als eine Zahl hat, die Datenbank jedoch zur Speicherung dient und die Präsentationsschicht dazu dient, die Dinge schön aussehen zu lassen.
quelle
Nach meiner Erfahrung führt die Verwendung von Aufzählungen für andere Zwecke als zum Übergeben von Optionen (als Flags) an einen sofortigen Methodenaufruf
switch
irgendwann zu -ing.switch
Aussage).switch
-es in Ihren Erweiterungsmethoden verwenden, wenn nicht anderswo.Für eine enumähnliche Entität mit etwas mehr Funktionalität sollten Sie sich also etwas Zeit nehmen und sie als Klasse erstellen, wobei verschiedene Aspekte berücksichtigt werden:
quelle
Jedes Mal, wenn Sie "magische Zahlen" im Code verwenden, ändern Sie diese in Aufzählungen. Neben der Zeitersparnis (da die Magie verschwindet, wenn die Fehler auftreten ...) werden auch Ihre Augen und Ihr Gedächtnis geschont (aussagekräftige Aufzählungen machen den Code lesbarer und selbstdokumentierender) Ihren eigenen Code
quelle
Ich weiß, dass dies ein altes Forum ist. Was ist, wenn in die Datenbank andere Dinge direkt integriert sind? Zum Beispiel, wenn die resultierende Datenbank der einzige Zweck des Codes ist. Anschließend definieren Sie die Aufzählungen bei jeder Integration. Besser als sie in der DB zu haben. Ansonsten stimme ich dem ursprünglichen Beitrag zu.
quelle