Eu tenho uma switchestrutura que tem vários casos para lidar. O switchopera sobre um enumque 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 switchestrutura 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 ifestrutura 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 switchestrutura com repercussão entre os casos.
Eu tenho que usar um gotonesse caso, pois C#não permite falhas. No entanto, evita cadeias lógicas incrivelmente longas, mesmo que salte pela switchestrutura 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 à gotopalavra - 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?
gotoquando 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, gotomas tudo bem.
gotoem uma linguagem de alto nível como C #, provavelmente ignorou muitas outras (e melhores) alternativas de design e / ou implementação. Altamente desencorajado.