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