У мене є 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 #, то ви, ймовірно, не помітили багатьох інших (і кращих) альтернатив дизайну та / або реалізації. Сильно зневірений.