[c] 반환이있는 Switch 문 — 코드 정확성

대략 다음과 같은 구조의 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;
}

이제 분명히 breaks는 코드가 올바르게 실행되는 데 필요하지 않지만 내가 거기에 넣지 않으면 나쁜 습관처럼 보입니다.

어떻게 생각해? 제거해도 괜찮습니까? 아니면 “정확성”을 높이기 위해 보관 하시겠습니까?



답변

break문을 제거하십시오 . 필요하지 않으며 일부 컴파일러는 “연결할 수없는 코드” 경고를 표시합니다.


답변

나는 완전히 다른 방법을 취할 것입니다. 방법 / 기능 중간에 반환하지 마십시오. 대신 반환 값을 지역 변수에 넣고 끝에 보냅니다.

개인적으로 다음 내용이 더 읽기 쉽습니다.

String result = "";

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

return result;


답변

개인적으로 나는 반품을 제거하고 휴식을 유지합니다. 변수에 값을 할당하기 위해 switch 문을 사용합니다. 그런 다음 switch 문 뒤에 해당 변수를 반환합니다.

이것이 논쟁의 여지가 있지만, 좋은 디자인과 캡슐화는 한 가지 방법과 한 가지 방법을 의미한다고 항상 느꼈습니다. 논리를 보장하는 것이 훨씬 더 쉽고 함수의 순환 적 복잡성을 기반으로하는 정리 코드를 실수로 놓치는 일이 없습니다.

한 가지 예외 : 리소스를 획득하기 전에 함수 시작 부분에서 잘못된 매개 변수가 감지되면 일찍 반환해도 괜찮습니다.


답변

휴식 시간 유지-휴식 시간이 이미있는 경우 나중에 코드를 편집 할 때 문제가 발생할 가능성이 적습니다.

그렇긴하지만 (나를 포함하여) 많은 사람들이 함수 중간에서 돌아 오는 것은 나쁜 습관이라고 생각합니다. 이상적으로 함수에는 하나의 진입 점과 하나의 종료 점이 있어야합니다.


답변

그들을 제거하십시오. case명령문에서 반환하는 것은 관용적 이며 그렇지 않으면 “도달 할 수없는 코드”잡음입니다.


답변

나는 그들을 제거 할 것이다. 내 책에서, 그와 같은 데드 코드는 실수로 간주되어야합니다. 왜냐하면 이중 테이크를하고 스스로에게 “어떻게 그 라인을 실행할 수 있을까요?”


답변

나는 보통 그들없이 코드를 작성합니다. 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) 대신 희소 배열이 필요합니다. 트리 또는 맵으로 구현할 수 있습니다 (물론이 경우에도 스위치가 여전히 작동합니다).