2009-01-29 11 views
13

así que estaba buscando en algún código que se registró y todo lo que tengo interrogado sobre: ​​¿Deben reemplazarse las variables estáticas por enumeraciones?

// Amount of days before cancellation can't be done 
enum Cancellation { Limit = 2 }; 

Cómo pedirle al chico que lo haya facturado, argumentó que es mucho mejor usar las enumeraciones en vez de variables estáticas, bettern de esto:

private static int CANCELLATION_LIMIT = 2; 

Así que comenzamos a discutir. Mi argumento era que él estaba usando enum como una forma de almacenar valores (se romperá si hubiera dos símbolos enum con el mismo valor). Él argumentó que era un antipattern tener variables estáticas en una clase.

Mi pregunta es ¿qué mejores prácticas deberían usarse para cualquiera de las dos?

+0

"se romperá si hubiera dos símbolos enum con el mismo valor" - no, no lo hará - puede tener múltiples enumeraciones en la misma definición con el mismo valor. De cualquier manera, debería ser 'const'. –

Respuesta

8

enumeraciones se escriben.

Es decir, si tiene un método donde tiene que pasar cierto 'estado' a un método, por ejemplo, solo puede pasar argumentos 'válidos'. Por ejemplo:

enum OrderState 
{ 
    pending = 1, 
    shipped = 2 
} 

public IList<Order> GetOrdersInState(OrderState) 
{ 
} 

Este es un buen ejemplo -imho- de utilizar enumeraciones. Cuando OrderState es un int para el que crea 2 const ints, no tiene ninguna restricción y puede pasar valores no válidos. El compilador no se quejará.

Sin embargo, en el caso que está mencionando, creo que usar enums no es una solución válida. Es un uso incorrecto de usar un int, y se debe usar un int int.

Las entradas son buenas, pero se deben usar donde se deben usar. No son la herramienta preferida en cada situación. Tener una const o var estática no es en este caso un antipatrón.

+0

Y la refactorización no es tan fácil con enumeraciones, por ejemplo, si elige para hacer que el método estático sea un método de instancia debido a un requisito para que este límite de cancelación dependa de una entrada de DB ... – Llyle

+0

Tenga en cuenta que es posible pasar un valor de enumeración no válido: 'GetOrdersInState ((OrderState) 99);' dará como resultado un valor de enum de 99 se transfiere. El compilador y el tiempo de ejecución están felices de hacer esto por usted si lo solicita. –

0

Creo que debería usar enumeraciones si tiene un conjunto de valores directamente conectados.

Algo así como: enum Estado {Abierto = 1, Cerrado = 2, Esperando = 3};

Para todo lo demás, diría que las variables estáticas son el camino a seguir.

0

No sé si es un antipatrón para tener variables estáticas en una clase (?). Por ejemplo, la clase Color en el marco .Net tiene muchas variables públicas estáticas, como Color.Red. Entonces, desde esa perspectiva, estaría de acuerdo contigo.

Sin embargo, puede haber un compromiso: use const privado CANCELLATION_LIMIT = 2; y ambos deberían estar felices. Para él, no habrá una variable global para la clase (?), Ya que las consts serán reemplazadas por el compilador, y obtendrá un único punto de cambio con un nombre claro.

12

return "¿Es lógicamente un conjunto de valores"? "Enum es apropiado": "const estático está bien"

(yo soy un gran fan de la coherencia lógica)

+0

Absolutamente de acuerdo, 100%. –

+0

en C# No creo que puedas tener una const estática. es const, o static readonly :) – Svish

+1

, de hecho, todos los consts son implícitamente estáticos, y la especificación explícita está prohibida (sin embargo, estaría bien con un readonly estático) – annakata

2

No, ¿cómo se definen variables de cadena estáticas o valores decimales en enum?

1

No creo que CANELLATION_LIMIT suena como una enumeración, que suele ser un conjunto de opciones.

Para algo diferente, si era const, entonces tal vez ... ¿pero actualmente es un campo mutable?

Tenga en cuenta que las enumeraciones se limitan a los tipos enteros-basa, por lo que no se puede utilizar para float, string, etc.

+0

(esto tiene un voto negativo ... Me encantaría saber por qué ...) –

1

Para valores inmutables destinados a ser único, enumeraciones son el camino a seguir. La pregunta que debe hacerse es simple: ¿debe el objeto almacenar el valor mismo, incluso estáticamente? En muchos casos, como cuando se describen errores o acciones, la respuesta es no. Recuerde, enum s nació como reemplazo de #define: asocia valores típicos con identificadores y proporciona un tipo, en realidad no dice "almacenar esta constante aquí".

Supongo que realmente no desea almacenar nada, pero proporciona esos valores típicos. static const los miembros solo son útiles cuando tiene la intención de utilizarlos como tales, por ejemplo, si necesita pasarlos por referencia a un método.

+0

const también da nombres para esos números mágicos con el fin de hacer un código más descriptivo, no solo para reutilizar. "necesita pasarlos por referencia a un método". No, las primitivas constantes como las pasan por valor, no por referencia. – Llyle

+0

"variables estáticas const" - ¿no es eso un oxímoron? –

+0

Puede pasar un const por referencia o por dirección muy bien. Algo como en: pass_me_an_object_by_addr (& my_const_object); –

Cuestiones relacionadas