我有一个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#这样的高级语言,那么您可能已经忽略了许多其他(更好的)设计和/或实现替代方案。极度气disc。