Ho una switch
struttura che ha diversi casi da gestire. L'operazione switch
su un enum
che 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 switch
struttura 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 if
struttura 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 switch
struttura con fall-through tra i casi.
Devo usare a goto
in quel caso poiché C#
non consente il fall-through. Tuttavia, impedisce le catene logiche incredibilmente lunghe anche se salta nella switch
struttura 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 goto
parola 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à?
goto
quando 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, goto
ma vabbè.
goto
linguaggio di alto livello come C #, probabilmente hai trascurato molte altre (e migliori) alternative di progettazione e / o implementazione. Altamente scoraggiato.