He encontrado una declaración de cambio en la base de código en la que estoy trabajando y estoy tratando de encontrar la forma de reemplazarla por algo mejor desde switch statements are considered a code smell. Sin embargo, después de leer several mensajes en stackoverflow sobre replacingswitchstatements Parece que no puedo pensar en una forma efectiva de reemplazar esta declaración de cambio en particular.¿Cuándo se debe tratar de eliminar una declaración de cambio?
Me quedé preguntándome si esta declaración de cambio en particular está bien y si hay circunstancias particulares donde las declaraciones de interruptor se consideran apropiadas.
En mi caso el código (un poco ofuscado, naturalmente) que estoy luchando con es así:
private MyType DoSomething(IDataRecord reader)
{
var p = new MyType
{
Id = (int)reader[idIndex],
Name = (string)reader[nameIndex]
}
switch ((string) reader[discountTypeIndex])
{
case "A":
p.DiscountType = DiscountType.Discountable;
break;
case "B":
p.DiscountType = DiscountType.Loss;
break;
case "O":
p.DiscountType = DiscountType.Other;
break;
}
return p;
}
¿Puede alguien sugerir una manera de eliminar este switch? ¿O es este un uso apropiado de un interruptor? Y si lo es, ¿hay otros usos apropiados para las declaraciones de cambio? Realmente me gustaría saber dónde son apropiados, así que no pierdo demasiado tiempo tratando de eliminar cada declaración de cambio que encuentro solo porque se consideran un olor en algunas circunstancias.
Actualización: A sugerencia de Michael lo hice un poco de búsqueda para la duplicación de esta lógica y descubrió que alguien había creado la lógica en otra clase que efectivamente hizo que toda la instrucción switch redundante. Entonces, en el contexto de este fragmento de código en particular, la declaración de cambio fue innecesaria. Sin embargo, mi pregunta es más acerca de lo apropiado de las declaraciones de cambio en el código y si siempre debemos tratar de reemplazarlas cada vez que se encuentran, por lo que en este caso me inclino a aceptar la respuesta de que esta declaración de cambio es apropiada.
¿Se puede agregar una etiqueta para incluir el lenguaje de programación en el que está escrito? Está claro lo que está haciendo el código, pero creo que es útil distinguirlo. Claramente no es Java porque no hay una clase de "cadena" en Java. –
@Amir He identificado el código como C# en la etiqueta. La razón por la que no lo hice en primer lugar es porque no quería hacer la pregunta específicamente para C#, ya que mi pregunta es más acerca de la conveniencia general de usar una declaración de cambio ... – mezoid
Me atrevo a adivinar C# – bbqchickenrobot