programing

반환된 스위치 문 -- 코드 정확성

sourcetip 2022. 7. 14. 23:27
반응형

반환된 스위치 문 -- 코드 정확성

C에 대략 다음과 같은 구조를 가진 코드가 있다고 칩시다.

switch (something)
{
    case 0:
      return "blah";
      break;

    case 1:
    case 4:
      return "foo";
      break;

    case 2:
    case 3:
      return "bar";
      break;

    default:
      return "foobar";
      break;
}

그러면요,그러면요,break이 코드가 올바르게 동작하기 위해서 필요한 것은 아닙니다만, 그것을 거기에 넣지 않으면, 그것은 일종의 나쁜 관행이라고 생각됩니다.

당신은 어떻게 생각하나요?제거해도 될까요?아니면 "정확성"을 높이기 위해 보관하시겠습니까?

를제 remove remove remove를 remove remove 를 remove 。break진술들.이러한 경고는 필요하지 않으며 일부 컴파일러는 "Unreachable code(도달할 수 없는 코드)" 경고를 발생시킬 수 있습니다.

나는 완전히 다른 방법을 택할 것이다.방법/기능 도중에 돌아오지 마십시오.대신 반환값을 로컬 변수에 넣고 마지막에 전송합니다.

개인적으로는 다음 사항을 더 쉽게 읽을 수 있습니다.

String result = "";

switch (something) {
case 0:
  result = "blah";
  break;
case 1:
  result = "foo";
  break;
}

return result;

난 그것들을 제거할 것이다.제 책에서는 그런 데드코드는 오류로 간주되어야 합니다. 왜냐하면 그것은 여러분이 두 번 다시 생각하게 하고 스스로에게 묻게 하기 때문입니다. "내가 그 줄을 어떻게 실행할 수 있을까?"

것들그''에서 돌아오는 case그렇지 않으면 "도달할 수 없는 코드" 소음일 수 있습니다.

당신은 어떻게 생각하나요?제거해도 될까요?아니면 "정확성"을 높이기 위해 보관하시겠습니까?

제거해도 괜찮습니다.「」를 사용합니다.return바로 그 시나리오입니다.break사용해서는 안 됩니다.

"lookup" 타입의 코드가 있는 경우 switch-case 구를 메서드로 패키징할 수 있습니다.

재미삼아 개발하고 있는 취미 시스템에 몇 가지 기능이 있습니다.

private int basePerCapitaIncomeRaw(int tl) {
    switch (tl) {
        case 0:     return 7500;
        case 1:     return 7800;
        case 2:     return 8100;
        case 3:     return 8400;
        case 4:     return 9600;
        case 5:     return 13000;
        case 6:     return 19000;
        case 7:     return 25000;
        case 8:     return 31000;
        case 9:     return 43000;
        case 10:    return 67000;
        case 11:    return 97000;
        default:    return 130000;
    }
}

(응, 거브스 공간이야...)

대부분의 경우 한 메서드에서 여러 번 반환되는 것을 피해야 한다는 다른 의견에 동의하며, 이 메서드는 어레이 또는 다른 방법으로 구현된 것이 더 나을 수 있습니다.switch-case-return은 위와 같이 입력과 출력의 상관관계가 1-1인 룩업 테이블과 매우 쉽게 일치한다는 것을 알게 되었습니다(롤플레잉 게임에는 이러한 게임들이 가득합니다. 다른 "비즈니스"에도 분명히 존재합니다).

한편, case-clause가 복잡하거나 switch-statement 후에 무슨 일이 생겼을 경우에는 return을 사용하는 것을 권장하지 않고 스위치로 변수를 설정하고 중단으로 종료하고 최종적으로 변수 값을 반환합니다.

(3일?)손...언제든지 스위치를 자체 방식으로 리팩터링할 수 있습니다.퍼포먼스에 영향이 있을지 의문입니다.또, 현대의 컴파일러가 그것을 삽입할 수 있는 것으로 인식할 수 있다고 해도, 전혀 놀라지 않을 것입니다.

난 보통 그들 없이 코드를 만들거야.IMO, 데드 코드는 게으름 및/또는 이해 부족을 나타내는 경향이 있습니다.

물론 다음과 같은 것도 고려하고 있습니다.

char const *rets[] = {"blah", "foo", "bar"};

return rets[something];

편집: 편집한 투고에서도, 이 일반적인 아이디어는 정상적으로 기능합니다.

char const *rets[] = { "blah", "foo", "bar", "bar", "foo"};

if ((unsigned)something < 5)
    return rets[something]
return "foobar";

특히 입력값이 희박한 경우(예: 1, 100, 1000 및 10000)에는 희박한 배열이 필요할 수 있습니다.트리 또는 맵으로 충분히 구현할 수 있습니다(물론 이 경우에도 스위치는 동작합니다).

용장성이라는 일치하고 있는 것 같습니다.break스테이트먼트는 불필요합니다.저는 ', 보다, 보다, 보다, 보다'를 읽었습니다.break스위치 내의 스테이트먼트를 케이스의 '스위치'로 합니다. case로 않는 "break벌레를 타고 넘어질 수 있다고 생각하니까

게 거 returnbreak 제 내의 을 '으로는 '각각'의 '판독'을 case 이 되다break 많은 이 이 에 break a a areturn불필요/접촉 불가, 그리고 어쨌든 난 소수인 것 같아.

'아예'를 .break 이어return.

NB: 이 모든 것은 단일 출입 규칙을 위반하는 것이 좋은 생각인지 아닌지를 무시하는 것입니다.지금으로서는 아쉽게도 상황에 따라 달라지는 의견을 가지고 있습니다.

그것들을 삭제하고 디폴트 브랜치를 정의합니다.

브레이크는 유지하십시오. 브레이크가 이미 설치되어 있는 경우 나중에 코드를 편집하면 문제가 발생할 가능성이 줄어듭니다.

그렇다고는 해도, 기능 도중에 돌아오는 것은, 많은 사람들로부터 나쁜 습관이라고 생각되고 있습니다.기능에는 1개의 진입점과 1개의 출구점이 있는 것이 이상적입니다.

개인적으로는 반품을 없애고 휴식 시간을 간직할 것입니다.변수에 값을 할당하려면 switch 문을 사용합니다.그런 다음 switch 문 뒤에 해당 변수를 반환합니다.

이것은 논쟁의 여지가 있는 점이지만, 나는 항상 좋은 디자인과 캡슐화가 하나의 길을 의미한다고 느껴왔다.로직을 보증하는 것이 훨씬 쉽고, 기능의 사이클로매틱한 복잡함에 따라 실수로 정리 코드를 놓치는 일도 없습니다.

한 가지 예외:리소스를 획득하기 전에 함수의 시작 부분에서 잘못된 매개 변수가 감지된 경우 조기 복귀가 가능합니다.

다른 사람과 함께 배열하는 것이 더 낫지 않을까요?

arr[0] = "blah"
arr[1] = "foo"
arr[2] = "bar"

하고 있다return arr[something];?

연습에 대한 일반적인 내용이라면break스위치 내의 스테이트먼트.필요없는 경우return미래의 진술은 다음 진술로 넘어갈 가능성을 줄여줍니다.case.

"정확성"을 위해 단일 입력, 단일 출구 블록을 사용하는 것이 좋습니다.적어도 내가 컴퓨터 공학 학위를 받을 때는 그랬다.따라서 변수를 선언하고 스위치로 변수를 할당한 후 함수의 마지막에1회 반환할 수 있습니다.

변수를 정의하고 스위치 문 끝에 반환하기만 하면 variable= default value를 설정하여 default 문을 제거할 수도 있습니다.

예:

switch(someVariable)
{
case 'a':
 return a;
 break;
case 'b':
 return b;
 break;
default:
 return c;
}

솔루션:

    $result = c; //for default value
    switch(someVariable)
    {
    case 'a':
     $result = a;
     break;
    case 'b':
     $result = b;
     break;
    }
    return $result; //simply return $result
  • 이로 인해 반품 명세서가 줄어들게 됩니다.

치우라고 했어코드를 읽을 수 없기 때문에, 「안전하기 위해서」브레이크를 삽입할 필요가 있는 경우는, 코드 스타일을 재검토해 주세요.

또한 스위치 스테이트먼트에 브레이크와 리턴을 혼재시키는 것이 아니라 그 중 하나를 고수하는 것을 항상 선호해 왔습니다.

저는 개인적으로 이 모든 것을 잃는 경향이 있습니다.breaks. 이 습관의 원인 중 하나는 Windows 앱용 윈도우 프로시저를 프로그래밍하는 데 있을 수 있습니다.

LRESULT WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_SIZE:
            return sizeHandler (...);
        case WM_DESTROY:
            return destroyHandler (...);
        ...
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

저는 개인적으로 이 접근법이 각 핸들러에 의해 설정된 반환 변수를 선언하고 마지막에 반환하는 것보다 훨씬 간단하고 간결하며 유연하다고 생각합니다.이 접근방식을 통해break는 용장성이기 때문에 사용할 필요가 있습니다.유용한 목적(구문적으로 또는 IMO)은 없으며 코드만 부풀려집니다.

휴식은 목적이 있는 것 같아요프로그래밍의 '이념'을 살리기 위해서다.논리적인 일관성을 갖지 않고 코드를 '프로그래밍'해야 한다면, 지금은 읽을 수 있을 것입니다. 하지만 내일 시도해 보십시오.상사에게 설명해 보세요.Windows 3030에서 실행해 보겠습니다.

이 아이디어는 매우 간단합니다.


Switch ( Algorithm )
{

 case 1:
 {
   Call_911;
   Jump;
 }**break**;
 case 2:
 {
   Call Samantha_28;
   Forget;
 }**break**;
 case 3:
 {
   Call it_a_day;
 }**break**;

Return thinkAboutIt?1:return 0;

void Samantha_28(int oBed)
{
   LONG way_from_right;
   SHORT Forget_is_my_job;
   LONG JMP_is_for_assembly;
   LONG assembly_I_work_for_cops;

   BOOL allOfTheAbove;

   int Elligence_says_anyways_thinkAboutIt_**break**_if_we_code_like_this_we_d_be_monkeys;

}
// Sometimes Programming is supposed to convey the meaning and the essence of the task at hand. It is // there to serve a purpose and to keep it alive. While you are not looking, your program is doing  // its thing. Do you trust it?
// This is how you can...
// ----------
// **Break**; Please, take a **Break**;

/* 단, 사소한 질문입니다.위 내용을 읽으면서 커피를 얼마나 마셨나요?가끔 IT가 시스템을 망가뜨리기도 해 */

종료 코드가 한 지점에 있습니다.코드에 대한 가독성이 향상됩니다.중간에 return 스테이트먼트(복수의 exit)를 추가하면 디버깅이 어려워집니다.

언급URL : https://stackoverflow.com/questions/3065438/switch-statement-with-returns-code-correctness

반응형