У меня есть switch
структура, которая должна обрабатывать несколько случаев. switch
Работает над enum
которой ставит вопрос о дублировании кода через объединенные значения:
// 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.
}
В настоящее время switch
структура обрабатывает каждое значение отдельно:
// 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;
...
}
Вы поняли идею там. В настоящее время у меня это разбито на составную if
структуру для обработки комбинаций одной строкой:
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Это ставит вопрос о невероятно длинных логических оценках, которые непонятны для чтения и которые трудно поддерживать. После рефакторинга это я начал думать об альтернативах и думал об идее switch
структуры с провалом между случаями.
Я должен использовать goto
в этом случае, так C#
как не позволяет провалиться. Тем не менее, он предотвращает невероятно длинные логические цепочки, даже если он перепрыгивает в switch
структуре, и все равно вносит дублирование кода.
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;
}
Это все еще не достаточно чистое решение, и с goto
ключевым словом связана стигма, которую я хотел бы избежать. Я уверен, что должен быть лучший способ убрать это.
Мой вопрос
Есть ли лучший способ справиться с этим конкретным случаем, не влияя на читаемость и ремонтопригодность?
goto
когда структура высокого уровня не существует на вашем языке. Я иногда хотел бы, чтобы был fallthru
; ключевое слово, чтобы избавиться от этого конкретного использования, goto
ну да ладно.
goto
высокого уровня, такой как C #, то вы, вероятно, упустили множество других (и лучших) вариантов проектирования и / или реализации. Очень обескуражен.