Ho una switchstruttura che ha diversi casi da gestire. L'operazione switchsu un enumche pone il problema del codice duplicato attraverso valori combinati:
// 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.
}
Attualmente la switchstruttura gestisce ciascun valore separatamente:
// 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;
...
}
Ti viene l'idea lì. Attualmente ho questo suddiviso in una ifstruttura sovrapposta per gestire invece le combinazioni con una sola riga:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Questo pone il problema di valutazioni logiche incredibilmente lunghe che sono confuse da leggere e difficili da mantenere. Dopo averlo rifatto, ho iniziato a pensare alle alternative e ho pensato all'idea di una switchstruttura con fall-through tra i casi.
Devo usare a gotoin quel caso poiché C#non consente il fall-through. Tuttavia, impedisce le catene logiche incredibilmente lunghe anche se salta nella switchstruttura e porta ancora alla duplicazione del codice.
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;
}
Questa non è ancora una soluzione abbastanza pulita e c'è uno stigma associato alla gotoparola chiave che vorrei evitare. Sono sicuro che ci deve essere un modo migliore per ripulirlo.
La mia domanda
Esiste un modo migliore per gestire questo caso specifico senza compromettere la leggibilità e la manutenibilità?
gotoquando la struttura di alto livello non esiste nella tua lingua. A volte vorrei che ci fosse un fallthru; parola chiave per sbarazzarsi di quel particolare uso di, gotoma vabbè.
gotolinguaggio di alto livello come C #, probabilmente hai trascurato molte altre (e migliori) alternative di progettazione e / o implementazione. Altamente scoraggiato.