[default] switch 문에 항상 기본 절이 포함되어야합니까?

첫 번째 코드 검토 중 하나에서 (뒤로) 모든 switch 문에 기본 절을 포함하는 것이 좋습니다. 나는 최근이 충고를 기억했지만 그 정당화가 무엇인지 기억하지 못한다. 지금 나에게는 꽤 이상하게 들린다.

  1. 항상 기본 진술을 포함시키는 합리적인 이유가 있습니까?

  2. 이 언어는 의존적입니까? 당시에 어떤 언어를 사용했는지 기억이 나지 않습니다.이 언어는 일부 언어에는 적용되고 다른 언어에는 적용되지 않을 수 있습니다.



답변

스위치 케이스에는 거의 항상 케이스가 있어야합니다 default.

사용하는 이유 default

1. 예기치 않은 값을 ‘잡기’

switch(type)
{
    case 1:
        //something
    case 2:
        //something else
    default:
        // unknown type! based on the language,
        // there should probably be some error-handling
        // here, maybe an exception
}

2. 특별한 행동을위한 경우 인 ‘기본’행동을 다루기 위해.

메뉴 중심 프로그램과 bash 쉘 스크립트에서 이것을 많이 볼 수 있습니다. 또한 스위치 케이스 외부에서 변수가 선언되었지만 초기화되지 않은 경우에이를 확인할 수 있으며 각 경우마다 다른 것으로 초기화됩니다. 여기서 기본값은 변수에 액세스하는 라인 코드가 오류를 일으키지 않도록 초기화해야합니다.

3. 해당 사례를 다룬 코드를 읽는 사람에게 보여주기 위해.

variable = (variable == "value") ? 1 : 2;
switch(variable)
{
    case 1:
        // something
    case 2:
        // something else
    default:
        // will NOT execute because of the line preceding the switch.
}

이것은 지나치게 단순화 된 예이지만 요점은 코드를 읽는 사람이 왜 variable1 또는 2 이외의 것이 될 수 없는지 궁금 하지 않아야한다는 것입니다.


내가 사용하지 않음으로 생각할 수있는 유일한 경우 default입니다 스위치가 아니라 분명 다른 모든 대안을 행복하게 무시 될 수있는 무언가를 확인하는 경우

switch(keystroke)
{
    case 'w':
        // move up
    case 'a':
        // move left
    case 's':
        // move down
    case 'd':
        // move right
    // no default really required here
}


답변

아니.

기본 조치가 없으면 상황이 중요합니다. 몇 가지 가치에 대해서만 행동한다면?

게임에서 키 누르기를 읽는 예를 들어보십시오.

switch(a)
{
   case 'w':
     // Move Up
     break;
   case 's':
     // Move Down
     break;
   case 'a':
     // Move Left
     break;
   case 'd':
     // Move Right
     break;
}

첨가:

default: // Do nothing

시간 낭비 일 뿐이며 이유없이 코드의 복잡성을 증가시킵니다.


답변

기본 상황이없는 것은 실제로 어떤 상황에서는 유리할 수 있습니다.

스위치 케이스가 열거 형 값인 경우 기본 케이스를 사용하지 않으면 케이스가없는 경우 컴파일러 경고가 표시 될 수 있습니다. 이렇게하면 나중에 새로운 열거 형 값이 추가되고 스위치에서 이러한 값에 대한 사례를 추가하는 것을 잊어 버린 경우 컴파일 타임에 문제에 대해 알 수 있습니다. 유효하지 않은 값이 열거 형 유형으로 캐스팅 된 경우 코드에서 처리되지 않은 값에 대해 적절한 조치를 취해야합니다. 따라서 이것은 간단한 경우에 가장 잘 작동 할 수 있습니다.

enum SomeEnum
{
    ENUM_1,
    ENUM_2,
    // More ENUM values may be added in future
};

int foo(SomeEnum value)
{
    switch (value)
    {
    case ENUM_1:
        return 1;
    case ENUM_2:
        return 2;
    }
    // handle invalid values here
    return 0;
 }


답변

어떤 언어로 작업하든 항상 기본 절을 사용합니다.

일이 잘못 될 수 있습니다. 가치는 당신이 기대하는 것과 같지 않을 것입니다.

기본 절을 포함하지 않으려면 가능한 값 세트를 알고 있다고 확신합니다. 가능한 값 세트를 알고 있다고 생각되면 값이이 가능한 값 세트를 벗어나는 경우이를 알려고합니다. 확실히 오류입니다.

이것이 항상 기본 절을 사용하고 예를 들어 Java에서 오류를 발생시키는 이유입니다.

switch (myVar) {
   case 1: ......; break;
   case 2: ......; break;
   default: throw new RuntimeException("unreachable");
}

“연결할 수없는”문자열보다 더 많은 정보를 포함시킬 이유가 없습니다. 실제로 발생하는 경우 어쨌든 소스 및 변수 값 등을 확인해야하며 예외 스택 추적에는 해당 행 번호가 포함되므로 예외 메시지에 더 많은 텍스트를 쓰는 데 시간을 낭비 할 필요가 없습니다.


답변

우리 회사에서는 Avionics and Defense 시장을위한 소프트웨어를 작성하며 스위치 문에있는 모든 경우를 명시 적으로 처리해야하기 때문에 항상 기본 진술을 포함합니다 ( ‘아무것도하지 않음’이라는 주석 일지라도). 예상치 못한 (또는 불가능하다고 생각하는) 값에서 오작동하거나 단순히 충돌 할 수는 없습니다.

기본 사례가 항상 필요한 것은 아니지만 항상 요구하면 코드 분석기로 쉽게 확인할 수 있습니다.


답변

“switch”문에 항상 기본 절이 포함 되어야합니까 ? 아니요 . 일반적으로 기본값을 포함 해야합니다 .

기본 절을 포함하면 오류 조건을 주장하거나 기본 동작을 제공하는 등의 조치가 필요한 경우에만 의미가 있습니다. 하나의 “그냥 이유”를 포함하는 것은화물 컬트 프로그래밍이며 가치를 제공하지 않습니다. 모든 “if”문에 “else”가 포함되어야한다고 말하는 것과 같은 “스위치”입니다.

이해가되지 않는 간단한 예는 다음과 같습니다.

void PrintSign(int i)
{
    switch (Math.Sign(i))
    {
    case 1:
        Console.Write("positive ");
        break;
    case -1:
        Console.Write("negative ");
        break;
    default: // useless
    }
    Console.Write("integer");
}

이것은 다음과 같습니다.

void PrintSign(int i)
{
    int sgn = Math.Sign(i);
    if (sgn == 1)
        Console.Write("positive ");
    else if (sgn == -1)
        Console.Write("negative ");
    else // also useless
    {
    }
    Console.Write("integer");
}


답변

내가 보는 한 대답은 ‘default’는 선택 사항입니다. 스위치는 항상 기본값을 포함해야한다는 것은 모든 ‘if-elseif’는 ‘else’를 포함해야한다고 말하는 것과 같습니다. 기본적으로 수행 할 논리가 있으면 ‘default’문이 있어야하지만 그렇지 않으면 코드가 아무 것도 수행하지 않고 계속 실행될 수 있습니다.