Eu tenho uma switch
estrutura que tem vários casos para lidar. O switch
opera sobre um enum
que coloca a questão do código duplicado atravé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.
}
Atualmente, a switch
estrutura lida com cada valor separadamente:
// 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;
...
}
Você entendeu a idéia. Atualmente, eu tenho isso dividido em uma if
estrutura empilhada para manipular combinações com uma única linha:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Isso coloca a questão de avaliações lógicas incrivelmente longas, que são confusas de ler e difíceis de manter. Depois de refatorá-lo, comecei a pensar em alternativas e a pensar em uma switch
estrutura com repercussão entre os casos.
Eu tenho que usar um goto
nesse caso, pois C#
não permite falhas. No entanto, evita cadeias lógicas incrivelmente longas, mesmo que salte pela switch
estrutura e ainda gera duplicação 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;
}
Isso ainda não é uma solução suficientemente limpa e há um estigma associado à goto
palavra - chave que eu gostaria de evitar. Tenho certeza de que deve haver uma maneira melhor de limpar isso.
Minha pergunta
Existe uma maneira melhor de lidar com esse caso específico sem afetar a legibilidade e a manutenção?
goto
quando a estrutura de alto nível não existe no seu idioma. Às vezes eu gostaria que houvesse um fallthru
; palavra-chave para se livrar desse uso específico de, goto
mas tudo bem.
goto
em uma linguagem de alto nível como C #, provavelmente ignorou muitas outras (e melhores) alternativas de design e / ou implementação. Altamente desencorajado.