2012-09-14 16 views
5

De acuerdo con la sección de Buenas Prácticas de la documentación de MSDN para la clase System.Enum:¿Por qué los marcadores de posición, como el primero o el último, en una enumeración se consideran una mala práctica?

no definen un valor de enumeración exclusivamente para reflejar el estado de la propia enumeración. Por ejemplo, no defina una constante enumerada que simplemente marque el final de la enumeración. Si necesita determinar el último valor de la enumeración, verifique ese valor explícitamente. Además, puede realizar una comprobación de rango para la primera y última constante enumerada si todos los valores dentro del rango son válidos.

Si entiendo correctamente, no deberíamos declarar una enumeración de la siguiente manera.

public enum DrawOrder 
{ 
    VeryBottom = 0, 
    Bottom = 1, 
    Middle = 2, 
    Top = 3, 
    Lowest = VeryBottom, //marks a position in the enum 
    Highest = Top, //marks a position in the enum 
} 

¿Por qué se considera una mala práctica?

+1

Supongo que esta es una práctica heredada de C/C++. En el mundo .NET, tenemos 'Enum.IsDefined',' Enum.GetValues', etc. por lo que el hack ya no tiene mucho sentido. –

Respuesta

2

Porque esos valores pueden cambiar con el tiempo. Supongamos que configura una propiedad (usando su ejemplo) DrawOrder.Highest y la almacena en su base de datos/documento/other-data-sink.

Tiempo pasa.

Cambios de código.

Su DrawOrder enum ha adquirido algunos valores más y el valor en sus datos persistentes ya no es igual a DrawOrder.Highest. Solo es igual a lo que DrawOrder.Highest haya asignado en el momento en que se conservaron los datos.

¿Cree que esta situación podría tener la posibilidad de causar problemas?

+0

Me gusta esta explicación la mejor, aunque todas las respuestas son similares. ¡Gracias! – Osiris

2

No estoy seguro de que acepte que es una mala práctica; depende.

Código de Steve McConnell Complete utiliza esta construcción. (Este libro está comenzando a mostrar su edad con los idiomas que utiliza, por lo que esta técnica puede haber sido buena práctica entonces.)

La desventaja es que hay una cosa extra que acordarse de hacer si se actualiza la lista de enumeración : actualice el valor de Highest y/o Lowest, si es necesario. Si lo olvida, presentará errores.

Lo bueno es que el código que se escribe para los loops es más rápido y autodocumentado.

2

Porque si agrega VeryTop = 4 a la enumeración, debe recordar actualizar Highest.

Si no lo haces, se desata el infierno. Es sorprendentemente fácil olvidarlo después de un tiempo (unos meses).

1

Diría que solo es una mala idea si persiste el Enum y existe la posibilidad de que la enumeración cambie. Si no lo persiste, o no hay posibilidad de que la enumeración cambie, entonces probablemente esté bien en la mayoría de los casos. Pero entonces, el objetivo de un marcador es que el valor puede cambiar ... por lo que no tiene ningún sentido.

Sin embargo, hay que tener cuidado cuando se utiliza una construcción que utilizan la enumeración que realmente intentan. Si te refieres a Top, pero usa Highest en su lugar ... y luego agrega SuperTop y cambia Highest to that, entonces tu intención original puede ser ahora un error.

La enumeración Marker solo debe utilizarse cuando desee usar lo que sea más alto o más bajo, independientemente de su valor.

Mucha gente lo considera una mala práctica porque es muy fácil usar un marcador cuando se tiene un valor específico.

Cuestiones relacionadas