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 #과 같은 고급 언어 를 사용해야 할 필요가 있다고 생각되면 다른 많은 (더 나은) 디자인 및 / 또는 구현 대안을 간과했을 것입니다. 낙담했습니다.