El artículo inicial me parece bien. Aún así, según los comentarios, parece que algunos comentarios sobre las enumeraciones de Java podrían aclarar algunas cosas.
El tipo de enumeración en Java es una clase por definición, pero muchos programadores tienden a olvidar esto, porque prefieren relacionarlo con "una lista de valores permitidos" como en algunos otros lenguajes. Es más que eso.
Por lo tanto, para evitar esas declaraciones de cambio, podría ser razonable colocar código y métodos adicionales en la clase enum. Casi nunca es necesario crear una "clase real similar a una enumeración" separada.
Considere también el punto de la documentación: ¿desea documentar el significado real de su enumeración en la base de datos? ¿En el código fuente que refleja los valores (su tipo de enumeración) o en alguna documentación externa? Yo personalmente prefiero el código fuente.
Si desea presentar valores de enumeración como números enteros en la base de datos debido a la velocidad o cualquier motivo, esa asignación también debe residir en la enumeración de Java. Obtendrá la asignación de nombre de cadena de forma predeterminada, y me he contentado con eso. Hay un número ordinal asociado con cada valor de enumeración, pero usarlo directamente como un mapeo entre el código y la base de datos no es muy brillante, porque ese número ordinal cambiará si alguien reordena los valores en el código fuente. O agrega valores de enumeración adicionales entre los valores existentes. O elimina algún valor.
(Por supuesto, si alguien cambia el nombre de la enumeración en el código fuente, el mapeo de cadenas predeterminado también se estropea, pero es menos probable que suceda accidentalmente. y verifique las restricciones en la base de datos como ya se sugirió aquí).
Intenté resumir mi comprensión. Siéntase libre de editar esto si tiene alguna corrección. Así que aquí va:
En el código
En el código, las enumeraciones deben manejarse usando el tipo de enumeración nativo del lenguaje (al menos en Java y C #), o usando algo como el "patrón de enumeración de tipo seguro" . Se desaconseja el uso de constantes simples (Integer o similar), ya que se pierde la seguridad de los tipos (y se dificulta la comprensión de qué valores son entradas legales para, por ejemplo, un método).
La elección entre estos dos depende de cuánta funcionalidad adicional se adjuntará a la enumeración:
En particular, al menos en Java una enumeración no puede heredar de otra clase, por lo que si tiene varias enumeraciones con un comportamiento similar que le gustaría poner en una superclase, no puede usar las enumeraciones de Java.
Enumeraciones persistentes
Para conservar las enumeraciones, a cada valor de enumeración se le debe asignar un ID único. Puede ser un número entero o una cadena corta. Se prefiere una cadena corta, ya que puede ser nemotécnica (facilita que los DBA, etc. comprendan los datos sin procesar en la base de datos).
Un problema con este enfoque es que la lista de valores legales de enumeración existe en dos lugares (código y base de datos). Esto es difícil de evitar y, por lo tanto, a menudo se considera aceptable, pero hay dos alternativas:
fuente
En el manejo de código para C #, se ha perdido la definición de eliminar el valor 0. Casi sin falta siempre declaro mi primer valor como:
public enum SomeEnum { None = 0, }
Para que sirva como valor nulo. Debido a que el tipo de respaldo es un número entero y un número entero predeterminado es 0, por lo que es muy útil en muchos lugares para saber si una enumeración se ha establecido programáticamente o no.
fuente
Java o C # siempre deben usar enumeraciones en el código. Descargo de responsabilidad: Mi experiencia es C #.
Si el valor se va a conservar en una base de datos, los valores integrales de cada miembro de enumeración deben definirse explícitamente para que un cambio posterior en el código no altere accidentalmente los valores de enumeración traducidos y, por lo tanto, el comportamiento de la aplicación.
Los valores siempre deben conservarse en una base de datos como valores integrales, para proteger contra la refactorización del nombre de enumeración. Mantenga la documentación de cada enumeración en un wiki y agregue un comentario al campo de la base de datos que apunte a la página del wiki que documenta el tipo. También agregue documentación XML al tipo de enumeración que contiene un enlace a la entrada wiki para que esté disponible a través de Intellisense.
Si usa una herramienta para generar código CRUD, debería ser capaz de definir un tipo de enumeración para usar en una columna, de modo que los objetos de código generados siempre usen miembros enumerados.
Si es necesario aplicar lógica personalizada para un miembro de enumeración, tiene algunas opciones:
No he intentado esto, pero con SQL Server 2005 o posterior, teóricamente podría registrar el código C # con la base de datos que contendría información de enumeración y la capacidad de convertir valores en enumeraciones para usar en vistas u otras construcciones, haciendo un método para traducir el datos de una manera más fácil de usar para los administradores de bases de datos.
fuente
En mi humilde opinión, en cuanto a la parte del código:
Usted debe siempre utilizar el tipo 'enumeración' para sus enumeraciones, básicamente se obtiene una gran cantidad de regalos si lo hace: Tipo de seguridad, la encapsulación y la evitación del interruptor, el apoyo de algunas colecciones como
EnumSet
yEnumMap
y claridad del código.en cuanto a la parte de persistencia, siempre puede persistir la representación de cadena de la enumeración y volver a cargarla utilizando el método enum.valueOf (String).
fuente
Es menos preferible almacenar el valor de texto de una enumeración en una base de datos que almacenar un número entero, debido al espacio adicional requerido y la búsqueda más lenta. Es valioso porque tiene más significado que un número, sin embargo, la base de datos es para almacenamiento y la capa de presentación es para que las cosas se vean bien.
fuente
Bueno, desde mi experiencia, usar enumeraciones para cualquier otra cosa que no sea para pasar opciones (como indicadores) a una llamada inmediata a un método, da como resultado
switch
-ing en algún momento.switch
declaración infame )switch
-es en sus métodos de extensión si no en otro lugar.Entonces, para una entidad tipo enumeración con un poco más de funcionalidad, debe tomarse un tiempo y crearla como una clase, con varias cosas en mente:
fuente
Cada vez que te encuentres usando "números mágicos" en el código, cambia a enumeraciones. Además del ahorro de tiempo (dado que la magia desaparecerá cuando aparezcan los errores ...), salvará sus ojos y su memoria (las enumeraciones significativas hacen que el código sea más legible y autodocumentado), ya que adivinen qué, lo más probable es que usted sea la persona a mantener y desarrollar tu propio código
fuente
Sé que este es un foro antiguo, ¿y si la base de datos pudiera tener otras cosas que se integran directamente? Por ejemplo, cuando la base de datos resultante es el ÚNICO propósito del código. Luego, estará definiendo las enumeraciones en cada integración. Mejor entonces tenerlos en la base de datos. De lo contrario, estoy de acuerdo con la publicación original.
fuente