Ich habe eine switch
Struktur, die mehrere Fälle zu behandeln hat. Das switch
funktioniert über ein, enum
das 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 switch
Struktur 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 if
Struktur 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 switch
Struktur mit Fall-Through-zwischen-Fällen nachzudenken .
Ich muss goto
in diesem Fall ein verwenden, da C#
es kein Durchfallen zulässt. Es verhindert jedoch die unglaublich langen logischen Ketten, obwohl es in der switch
Struktur 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 goto
Keyword, 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?
goto
wenn 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, goto
aber na ja.
goto
Sie 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.