스위치의 기본 사례에서 중단


88

나는 break종종 마지막 사건 이후 에 포함하거나 포함하지 않을 때마다 약간 당황합니다 default.

switch (type) {
    case 'product':

        // Do behavior

        break;
    default:

        // Do default behavior

        break; // Is it considered to be needed?
}

break유일한 목적은 코드가 나머지 switch-case를 통해 실행되는 것을 막는 것 입니다.

그런 다음 break일관성으로 인해 마지막 을 갖는 것이 더 논리적으로 간주 되거나 break기능적 용도를 적용하지 않아서 건너 뛰는 것이 더 중요 합니까? 둘 다 내 의견으로는 다른 방식으로 논리적입니다.

이것으로 .php파일을 끝내는 것과 어느 정도 비교할 수 있습니다 ?>. 나는 ?>빈 공간을 출력 할 위험 때문에 주로 끝나지 않지만 파일을 끝내는 것이 논리적 일 것이라고 주장 할 수 있습니다.

답변:


144

break기술적으로 (당신이 될 필요가 없습니다 줄래 마지막 대안 후에 필요하지 않습니다 default: 넣어 완벽하게 합법적, 때로는 유용 default첫 번째 분기를); 코드가 switch명령문 의 끝을 통과하는지 또는 breaks마지막 분기의 끝을 벗어나도 결과는 같습니다.

그러나 세 가지 이유로 여전히 마지막 분기를 포함하여 모든 분기를 return또는 break문으로 종료합니다.

  1. 리팩토링. 모든 분기가 break또는로 끝나는 return경우 의미를 변경하지 않고 순서를 바꿀 수 있습니다. 따라서 이러한 재정렬로 인해 회귀가 발생할 가능성이 줄어 듭니다.
  2. 일관성과 최소한의 놀라움. 일관성은 지점이 실제로 의미가 다르지 않는 한 일관되게 끝나야한다고 말합니다. 최소 서프라이즈 원칙은 유사한 것들이 비슷하게 보이도록 지시합니다. switch이전 블록과 똑같이 블록 의 마지막 분기를 끝내면 두 가지를 모두 충족하므로 읽기와 이해가 더 쉽습니다. explicit을 생략하면 break마지막 분기가 광학적으로 다르며 (빠른 스캔에 특히 중요 함) 실제로 다르지 않다는 것을 확인하려면 독자가 개별 문장을 읽는 것이 중요합니다. .
  3. 자신을 보호하십시오. 로 모든 switch브랜치를 끝내는 습관을 가지면 break잠시 후에 자동으로 바뀌므로 중요한 곳에서 실수로 잊어 버릴 가능성이 줄어 듭니다. break모든 분기가 끝날 때 까지 기대하도록 스스로 교육 하면 누락 된 break명령문 을 감지하는 데 도움이되므로 디버깅 및 문제 해결에 좋습니다.

이것에 대한 통찰력에 감사드립니다! 윌 break의 경우 aswell : 지속
로빈 Castlin

7
C #을에서 break(또는를 종료 다른 제어 흐름 문 case) 되어 기술적으로 마지막 대안 후에 필요로했다.
dan04

3
@ dan04 : 네, 좋은 지적입니다. C #은 예외입니다. 언어 디자이너가 switch기존 언어의 오류와 관련된 문제를 알고 이를 방지하려고 했기 때문일 수 있습니다. 규칙 C #은 내 대답의 권장 사항과 거의 일치합니다.
tdammers

구체적으로 어떤 언어에 대해 이야기하고 있습니까? 씨? C ++? 씨#? 자바? PHP?
svick 2016 년

2
좋은 컴파일러는 다음 명령어에 대한를 break생성하는 대신 최종 을 NO-OP로 취급합니다 jmp. 맞습니까?
Nathan Osman

11

switch-case대부분의 언어 사용과 관련하여 존재하는 모호성을 감안할 때, 명시 적으로 그리고 의도적으로 의도하지 않은 경우를 제외하고 는 항상 break문장을 사용하는 것이 좋습니다 .

부분적으로 이것은 모든 case통화가 동일 하게 보이기 때문에 가독성이 향상 되기 때문입니다 . 그러나 누군가 (나조차도) case마지막 단계에서 후자 를 삽입하기로 선택 하면 이전 블록을 확인하는 데 신경 쓸 필요가 없으므로 새 코드를 추가 할 때 버그를 줄일 수 있습니다.


7
한 사례가 다음 사례로 넘어 가고 싶을 때 (그리고 타락한 사례가 아닌 경우 case foo: case bar: ...) 나는 넘어지기를 원한다는 명시 적 의견을 제시했습니다. 훨씬 더 명확하게 만듭니다.
Donal Fellows

3
예를 간단한 코멘트와 같은 // no break대신에break;
Pacerier

또는 [[fallthrough]]C ++의 경우 속성입니다.
Ruslan

1

마지막 경우 break이후 에는 필요 하지 않습니다 . " 마지막 "( 기본값 아님) 이라는 단어 가 필요하지 않기 때문에 사용합니다. 기본 경우는 마지막 경우입니다.

switch(x)
{
case 1:
//do stuff
break;

default:
//do default work
break;

case 3:
//do stuff

}

그리고 우리 break 는 두 개의 연속적인 cases 사이에 a 가 필요하다는 것을 알고 있습니다. 때로는 if(a!=0)다른 사람들이 내 코드를 참조 할 때 더 쉽게 읽을 수 있도록 코드에서 사용 합니다. 내가 사용하도록 선택할 수 있습니다 if(a), 내 선택의 문제가 될 것입니다


5
저에게 그것은 "항상 사용 중단"을 의미 할 것입니다. 일부 프로그래머 가 존재 여부를 확인하지 않고 case끝에 새로운 것을 추가 한 경우 (그 이유는 프로그래머의 잘못 일 것이지만 어떤 이유로 든 더 안전합니다. 당신은 6 개월 안에 그 프로그래머가 될 수 있기 때문에switchbreak
SJuan76

@ SJuan76 예, 죄송합니다.보다 안전합니다. 향후 오류에 대비하여 보호 조치를 유지하려면 끝에 오류를 포함시켜야합니다.
수완 나 Pattayil

1
이러한 주장을 염두에두고 , 새로운 값이 삽입되는 경우 항상 배열의 끝에 있다고 주장 할 수 있습니다 . 그러나 그 어떤 코드를 나누기 일반적으로 추한 : 보이는
로빈 Castlin

1
@Robin 쉼표를 넣는 것은 다릅니다. 존재하지 않고 누군가가 배열에 새로운 값을 추가하면 컴파일 오류가 발생합니다. 그러나 이전 case 문에 중단이없는 경우 컴파일 오류가 없으므로이 오류가 누락되어 런타임 오류가 발생할 수 있습니다.
Keith Miller

@RobinCastlin을 넣을 수있는 언어를 제공했습니다 ,. Incase default는 마지막 사례로 설계되었습니다. 어쩌면 언어는 그 break이후를 오류로 간주 할 것 입니다. break두 경우 사이에서만 차별화 요소로 허용 되었다고 가정 합니다.
Suvarna Pattayil 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.