Por ejemplo, tenemos un juego de computadora con diversos personajes. El sexo del personaje se almacena en el campo de género. Puede hacer que este campo sea un número entero o una cadena, pero un buen programador busca hacer que el estado incorrecto de los objetos sea inexpresable y, por lo tanto, lo más probable es que comience la enumeración para el piso. ¡Ahora hacer un personaje con el género equivocado es simplemente imposible!
Y en el juego hay una base de datos en la que se almacenan todos los jugadores, y allí también debes registrar de qué género son. Sería bueno hacer un personaje con piso incorrecta en la base de datos no se podría añadir, ya que no sólo código en el suelo para que no sea una enumeración nada, no se proporciona, sino también personas reales. Y los seres humanos, tal como la conocemos, y nos esforzamos para entrar en la base de datos que no es necesario entrar.
Afortunadamente, especialmente para tales casos, en muchos DBMS también es posible hacer columnas del tipo enum, lo que limita el rango de valores que pueden tener los datos en dicha columna. Lo que aprovechará un desarrollador experimentado que no quiere que su proyecto sea algo que no sea para el feng shui.
En el cliente, el programador tampoco es un tonto y también sabe que los estados incorrectos deben ser inexpresables, y para esto el género del personaje debe ser enumeración.
Perfecto!
Sin embargo, si observa de cerca, puede encontrar un pequeño defecto, que finalmente conduce a problemas. El campo en el que se almacena el piso no se llama sexo, sino género, lo que significa que un diseñador de juegos ya está siendo seleccionado para ello. Tarde o temprano, descubrirá que hay sustancialmente más de dos géneros, a diferencia de los sexos, y querrá agregar el género GENERIC_TEEN. Entonces todos se volverán estúpidos.
El cliente debe estar constantemente actualizado
Los primeros en caer son los que escribieron el código del cliente, porque los valores incorrectos del parámetro de género comenzarán a venir del servidor para cada estornudo. Y cuando un personaje con un género proviene del servidor acerca de la existencia de lo que el cliente no conoce, entonces el juego, como el programador quería en el cliente, simplemente no se iniciará. Ahora, cuando los nuevos géneros necesitan liberar nuevas versiones del cliente y ejecutar la actualización forzada, que a todos nos gusta tanto.
En el servidor de enumeración, es bueno, porque si se encuentra allí algún valor desconocido, entonces este es claramente un error que necesita ser encontrado y reparado, pero en el cliente, la aparición de un valor desconocido es una situación regular que ocurrirá regularmente en versiones obsoletas del cliente, y por lo tanto Enum es un mal que debe ser erradicado y destruido lo antes posible.
El nuevo código no podrá funcionar con la base de datos anterior
Además, de acuerdo con las recomendaciones de los mejores criadores de perros, el nuevo código debería poder funcionar con el antiguo esquema de datos, y aquí resulta que todo el sistema puede desmoronarse solo porque se ha agregado un nuevo género al código.
Por lo tanto, en la base de datos enum, nos molesta, y en este caso necesitamos almacenar en el campo cadenas, o ints, o lo que sea, en el que, si es necesario, puede escribir un valor que no se proporciona por adelantado.
Y alguien dirá: está bien, está bien, daña al cliente enum, y en la base de datos interfiere más de lo que ayuda, pero enum es de gran beneficio en el código del servidor. ¿No ofrecerá eliminar la enumeración del código en el servidor? Será!
El código anterior no podrá funcionar con la nueva base de datos
Ahora el programador se recomienda no sólo para escribir el código para que funcione correctamente con la antigua base de datos, sino también para desarrollar esquemas de datos de modo que un poco de código heredado, también, podría funcionar adecuadamente.
Y si usa enum en el servidor para género, entonces todo se desmoronará nuevamente, solo después de que resulte que algo está mal con el nuevo código y que necesita revertir inmediatamente todo a la versión anterior, y los nuevos géneros ya han ingresado a la base de datos.
Y, por lo tanto, la enumeración del código del servidor con el paso de un soldado medido va a algún lugar en dirección al bosque más cercano, para nunca volver de allí, porque todo lo que puede destruir el sistema en el momento equivocado es malo, y el mal no tiene cabida en nuestro código acogedor.
Entonces, ¿quizás martillar en enumeración y usar siempre cuerdas?
En resumen, como diría Winnie the Pooh, estos son algún tipo de enamia equivocada, ¡y provocan que el programador escriba el código incorrecto! ¡Enum, debes poner cosas realmente inquebrantables y fundamentales que no han cambiado con los años, y no géneros que agregan y desaparecen en cada lanzamiento! Cada tarea tiene su propia herramienta, y enum no es la herramienta que necesita usar para almacenar valores, cuyo espectro posible se expande constantemente.
Si una variable solo puede tomar algunos valores previamente conocidos y todo lo que no está incluido en estos valores debe conducir a un error, entonces usar enum es una buena idea, pero si no lo es, si los valores inesperados caen regularmente en la variable, entonces use Enum es igual que dispararte en el pie, y es mejor no hacerlo, a menos que seas, por supuesto, un masoquista.
Esta situación particular es interesante porque nada presagiaba la adición de nuevos valores a la enumeración, sin mencionar el hecho de que aparecerán nuevos valores regularmente. ¿Cómo podemos hacer para saber que es más de dos sexos?
Por lo tanto, de acuerdo con el principio KISS, la enumeración en la primera etapa es una buena y correcta elección. Un programador experimentado hará una enumeración y reparará que cuando aparece un valor adicional, debe ejecutar inmediatamente los eventos necesarios para que la enumeración desaparezca del código.
Desafortunadamente, la práctica muestra que, en realidad, alguien más estará involucrado en agregar un nuevo género, y sin pensarlo dos veces, agregará un nuevo significado a la enumeración, y esto se calmará. Entonces, si hay alguna duda, es mejor seguir una regla simple: se almacena en algún lugar, excepto por el código; significa no enumeración, y ese es el punto.
Entonces, ¿enumeración no debería estar en el código relacionado con el género en absoluto?
A pesar del hecho de que acabo de decir, la enumeración en el código aún puede ser muy útil, incluso si contienen valores que caen en la base de datos. No solo es necesario usarlos para almacenar los valores extraídos de la base de datos, es necesario comparar lo que vino de la base de datos con el valor deseado. Por ejemplo, cuando un programador quiere escribir que si el género del personaje es GENERIC_TEEN, entonces no puede poner alcohol en su inventario, puede crear una enumeración Gender con el método de valor que devuelve una cadena y escribir un código que verificará si el personaje tiene un campo de género y Gender.GENERIC_TEEN .value () y esto será bueno, porque no permitirá que el programador cometa un error en el valor de estado.
El código debe evolucionar
Las decisiones que nos sirvieron bien en algún momento pueden volverse incómodas con el tiempo. Y debe asegurarse de que el código refleje el estado actual del proyecto y no sea un conjunto de muletas, con la ayuda de la cual la solución creada en la rodilla hace un par de años se extiende hasta "aquí y ahora". De lo contrario, será una fuente inagotable de fakap y lulz para todos los que de alguna manera estén conectados con el proyecto, ya sea un desarrollador, un probador o un consumidor directo.