Mam switch
strukturę, która ma kilka spraw do załatwienia. switch
Pracuje przy enum
co stwarza problem powielonych kodu poprzez wspólne wartości:
// 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.
}
Obecnie switch
struktura obsługuje każdą wartość osobno:
// 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;
...
}
Masz pomysł. Obecnie mam tę if
strukturę w stosie , aby zamiast tego obsługiwać kombinacje z pojedynczą linią:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Stwarza to problem niewiarygodnie długich ocen logicznych, które są mylące w czytaniu i trudne do utrzymania. Po przeredagowaniu tego zacząłem myśleć o alternatywach i pomyślałem o idei switch
struktury z przewrotem między przypadkami.
Muszę użyć goto
w tym przypadku, ponieważ C#
nie pozwala na awarię. Jednak zapobiega niewiarygodnie długim łańcuchom logicznym, mimo że przeskakuje w switch
strukturze i wciąż powoduje duplikację kodu.
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;
}
To wciąż nie jest wystarczająco czyste rozwiązanie, a ze goto
słowem kluczowym wiąże się piętno , którego chciałbym uniknąć. Jestem pewien, że musi być lepszy sposób na oczyszczenie tego.
Moje pytanie
Czy istnieje lepszy sposób obsługi tego konkretnego przypadku bez wpływu na czytelność i łatwość konserwacji?
goto
gdy struktura wysokiego poziomu nie istnieje w twoim języku. Czasami żałuję, że nie było fallthru
; słowo kluczowe, aby pozbyć się tego konkretnego zastosowania, goto
ale no cóż.
goto
języka wysokiego poziomu, takiego jak C #, prawdopodobnie przeoczyłeś wiele innych (i lepszych) alternatyw projektowania i / lub implementacji. Bardzo odradzam.