Programing

If-else if-else over switch 문을 사용하거나 그 반대의 경우

lottogame 2020. 10. 8. 07:38
반응형

If-else if-else over switch 문을 사용하거나 그 반대의 경우


switch일련의 if문에 블록 을 사용하려는 이유는 무엇 입니까?

switch 문은 같은 일을하는 것 같지만 입력하는 데 시간이 더 걸립니다.


대부분의 경우와 마찬가지로 컨텍스트와 개념적으로 올바른 방법을 기반으로 사용할 것을 선택해야합니다. 스위치는 실제로 "이 변수 값을 기반으로 이들 중 하나를 선택하십시오"라고 말하지만 if 문은 일련의 부울 검사일뿐입니다.

예를 들어, 다음을 수행하는 경우 :

int value = // some value
if (value == 1) {
    doThis();
} else if (value == 2) {
    doThat();
} else {
    doTheOther();
}

이것은 임의의 테스트가 아닌 "값"의 값을 기반으로 조치 선택이 발생한다는 것을 즉시 명백하게 만드는 스위치로 훨씬 더 잘 표현됩니다.

또한 스위치와 if-eles를 작성하고 OO 언어를 사용하는 경우이를 제거하고 가능한 경우 동일한 결과를 얻기 위해 다형성을 사용하는 것을 고려해야합니다.

마지막으로, 입력하는 데 시간이 오래 걸리는 스위치와 관련하여 누가 말했는지 기억이 나지 않지만 누군가 "입력 속도가 실제로 코딩 속도에 영향을 미치는 요소입니까?"라는 질문을 읽었습니다. (패러 프레이징 됨)


단일 변수의 값을 켜면 매번 스위치를 사용할 것입니다. 이것이 구조가 만들어진 이유입니다.

그렇지 않으면 여러 if-else 문을 사용하십시오.


가독성 관련 :

특히 폴 스루 케이스를 허용하는 언어에서는 일반적으로 if / else 구문을 switch 문보다 선호합니다. 내가 종종 발견 한 것은 프로젝트가 오래되고 여러 개발자가 참여함에 따라 switch 문을 만드는 데 문제가 있다는 것입니다.

만약 그것들 (문)이 단순한 것 이상이된다면, 많은 프로그래머는 게으르고 그것을 이해하기 위해 전체 서술문을 읽는 대신, 그들이 서술문에 추가하는 모든 경우를 다루기 위해 단순히 케이스를 띄울 것입니다.

나는 사람의 테스트가 이미 다루어 졌기 때문에 switch 문에서 코드가 반복되는 많은 경우를 보았습니다. 단순한 낙상 케이스로 충분했지만 게으름 때문에 스위치를 이해하려고 시도하는 대신 끝에 중복 코드를 추가해야했습니다. . 나는 또한 잘못 구성된 많은 사례가있는 악몽 같은 switch 문을 보았고 단순히 모든 논리를 따르려고 노력하면서 많은 폴 스루 사례가 분산되어 있고 그렇지 않은 많은 사례가 어려워집니다 ... 어떤 종류 내가 말한 첫 번째 / 중복성 문제로 이어집니다.

이론적으로는 if / else 구조에도 동일한 문제가있을 수 있지만 실제로는 자주 발생하지 않는 것 같습니다. if / else 구문 내에서 테스트되는 더 복잡한 조건을 이해해야하기 때문에 프로그래머가 좀 더주의 깊게 읽어야 할 수도 있습니다. 다른 사람들이 결코 건드리지 않을 것 같은 간단한 것을 작성하고 있고 그것을 잘 구성 할 수 있다면, 그것은 토스 업이라고 생각합니다. 이 경우 더 가독성이 좋고 자신에게 가장 기분이 좋은 것은 해당 코드를 유지할 가능성이 높기 때문에 정답 일 것입니다.

속도 관련 :

Switch 문은 종종 if-else 구문보다 빠르게 수행됩니다 (항상 그런 것은 아님). switch 문의 가능한 값이 미리 배치되어 있기 때문에 컴파일러는 점프 테이블을 구성하여 성능을 최적화 할 수 있습니다. 각 조건은 if / else 구문 에서처럼 테스트 할 필요가 없습니다 (어쨌든 올바른 조건을 찾을 때까지).

그러나 항상 그런 것은 아닙니다. 1에서 10까지의 가능한 값을 사용하는 간단한 스위치가있는 경우에 해당됩니다. 추가하는 값이 많을수록 점프 테이블이 더 커야하고 스위치의 효율성이 떨어집니다 (if / else보다는 아니지만 비교적 간단한 switch 문보다는 효율성이 떨어집니다) . 또한 값이 매우 다양하다면 (예 : 1에서 10이 아닌 10 개의 가능한 값 (예 : 1, 1000, 10000, 100000, 100000000000 등)이 있음) 스위치가 더 간단한 경우보다 효율성이 떨어집니다. .

도움이 되었기를 바랍니다.


저는 개인적으로 너무 많은 중첩 된 if-eles에 대해 switch 문을 보는 것을 선호합니다. 읽기가 훨씬 더 쉬울 수 있기 때문입니다. 스위치는 상태를 표시하기위한 가독성 측면에서도 더 좋습니다.

pacman ifs 에 대한이 게시물의 주석도 참조하십시오 .


이것은 특정 사례에 따라 크게 달라집니다. 가급적이면 중첩이 많은 경우 switch오버를 사용해야한다고 생각합니다 .if-elseif-elses

문제는 얼마입니까?

어제 나도 같은 질문을했습니다.

public enum ProgramType {
    NEW, OLD
}

if (progType == OLD) {
    // ...
} else if (progType == NEW) {
    // ...
}

if (progType == OLD) {
    // ...
} else {
    // ...
}

switch (progType) {
case OLD:
    // ...
    break;
case NEW:
    // ...
    break;
default:
    break;
}

이 경우 첫 if번째 테스트에는 불필요한 두 번째 테스트가 있습니다. 두 번째는 NEW를 숨기고 있기 때문에 조금 기분이 나쁩니다.

나는 switch그것이 더 잘 읽히기 때문에 결국을 선택 했습니다.


Switch 문은 읽고 유지하기가 훨씬 쉽습니다. 일반적으로 더 빠르고 오류 발생 가능성이 적습니다.


하나의 변수에 2 개 이상의 조건이있을 때마다 스위치를 사용하십시오. 예를 들어, 주중에 다른 작업을 수행하는 경우 스위치를 사용해야합니다.

Other situations (multiple variables or complex if clauses you should Ifs, but there isn't a rule on where to use each.


I have often thought that using elseif and dropping through case instances (where the language permits) are code odours, if not smells.

For myself, I have normally found that nested (if/then/else)s usually reflect things better than elseifs, and that for mutually exclusive cases (often where one combination of attributes takes precedence over another), case or something similar is clearer to read two years later.

I think the select statement used by Rexx is a particularly good example of how to do "Case" well (no drop-throughs) (silly example):

Select
    When (Vehicle ¬= "Car") Then
        Name = "Red Bus"
    When (Colour == "Red") Then
        Name = "Ferrari"
    Otherwise
        Name = "Plain old other car"
    End

Oh, and if the optimisation isn't up to it, get a new compiler or language...


The tendency to avoid stuff because it takes longer to type is a bad thing, try to root it out. That said, overly verbose things are also difficult to read, so small and simple is important, but it's readability not writability that's important. Concise one-liners can often be more difficult to read than a simple well laid out 3 or 4 lines.

Use whichever construct best descibes the logic of the operation.


Let's say you have decided to use switch as you are only working on a single variable which can have different values. If this would result in a small switch statement (2-3 cases), I'd say that is fine. If it seems you will end up with more I would recommend using polymorphism instead. An AbstractFactory pattern could be used here to create an object that would perform whatever action you were trying to do in the switches. The ugly switch statement will be abstracted away and you end up with cleaner code.

참고URL : https://stackoverflow.com/questions/427760/when-to-use-if-else-if-else-over-switch-statements-and-vice-versa

반응형