Tengo una switch
estructura que tiene varios casos para manejar. El switch
opera sobre un enum
que plantea el problema del código duplicado a través de valores combinados:
// All possible combinations of One - Eight.
public enum ExampleEnum {
One,
Two, TwoOne,
Three, ThreeOne, ThreeTwo, ThreeOneTwo,
Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree,
FourTwoThree, FourOneTwoThree
// ETC.
}
Actualmente la switch
estructura maneja cada valor por separado:
// All possible combinations of One - Eight.
switch (enumValue) {
case One: DrawOne; break;
case Two: DrawTwo; break;
case TwoOne:
DrawOne;
DrawTwo;
break;
case Three: DrawThree; break;
...
}
Tienes la idea allí. Actualmente tengo esto desglosado en una if
estructura apilada para manejar combinaciones con una sola línea:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Esto plantea el problema de evaluaciones lógicas increíblemente largas que son confusas de leer y difíciles de mantener. Después de refactorizar esto, comencé a pensar en alternativas y pensé en la idea de una switch
estructura con falla entre los casos.
Tengo que usar un goto
en ese caso ya C#
que no permite fall-through. Sin embargo, evita las cadenas lógicas increíblemente largas a pesar de que salta alrededor de la switch
estructura, y aún trae duplicación de código.
switch (enumVal) {
case ThreeOneTwo: DrawThree; goto case TwoOne;
case ThreeTwo: DrawThree; goto case Two;
case ThreeOne: DrawThree; goto default;
case TwoOne: DrawTwo; goto default;
case Two: DrawTwo; break;
default: DrawOne; break;
}
Esto todavía no es una solución lo suficientemente limpia y hay un estigma asociado con la goto
palabra clave que me gustaría evitar. Estoy seguro de que tiene que haber una mejor manera de limpiar esto.
Mi pregunta
¿Hay una mejor manera de manejar este caso específico sin afectar la legibilidad y la mantenibilidad?
goto
cuando la estructura de alto nivel no existe en su idioma. A veces desearía que hubiera un fallthru
; palabra clave para deshacerse de ese uso particular de, goto
pero bueno.
goto
en un lenguaje de alto nivel como C #, entonces probablemente haya pasado por alto muchas otras (y mejores) alternativas de diseño y / o implementación. Muy desanimado.