Ich habe eine switchStruktur, die mehrere Fälle zu behandeln hat. Das switchfunktioniert über ein, enumdas die Ausgabe des doppelten Codes durch kombinierte Werte aufwirft:
// 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.
}
Derzeit behandelt die switchStruktur jeden Wert separat:
// 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;
...
}
Sie bekommen die Idee dort. Ich habe dies derzeit in eine gestapelte ifStruktur unterteilt, um stattdessen Kombinationen mit einer einzelnen Zeile zu behandeln:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Dies wirft das Problem von unglaublich langen logischen Auswertungen auf, die verwirrend zu lesen und schwierig zu warten sind. Nachdem ich dies überarbeitet hatte, begann ich über Alternativen nachzudenken und über die Idee einer switchStruktur mit Fall-Through-zwischen-Fällen nachzudenken .
Ich muss gotoin diesem Fall ein verwenden, da C#es kein Durchfallen zulässt. Es verhindert jedoch die unglaublich langen logischen Ketten, obwohl es in der switchStruktur herumspringt, und bringt immer noch Code-Duplizierung mit sich.
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;
}
Dies ist immer noch keine saubere Lösung und es gibt ein Stigma im Zusammenhang mit dem gotoKeyword, das ich vermeiden möchte. Ich bin mir sicher, dass es einen besseren Weg geben muss, das aufzuräumen.
Meine Frage
Gibt es eine bessere Möglichkeit, diesen speziellen Fall zu behandeln, ohne die Lesbarkeit und Wartbarkeit zu beeinträchtigen?
gotowenn die übergeordnete Struktur in Ihrer Sprache nicht vorhanden ist. Ich wünschte manchmal, es gäbe eine fallthru; Stichwort, um diese besondere Verwendung von loszuwerden, gotoaber na ja.
gotoSie wahrscheinlich viele andere (und bessere) Entwurfs- und / oder Implementierungsalternativen übersehen , wenn Sie das Bedürfnis haben, a in einer Hochsprache wie C # zu verwenden. Sehr entmutigt.