[c#] void 메서드 내에서 return을 사용하는 것이 나쁜 습관입니까?

다음 코드를 상상해보십시오.

void DoThis()
{
    if (!isValid) return;

    DoThat();
}

void DoThat() {
    Console.WriteLine("DoThat()");
}

void 메서드 내에서 반환을 사용해도 괜찮습니까? 성능 저하가 있습니까? 또는 다음과 같은 코드를 작성하는 것이 좋습니다.

void DoThis()
{
    if (isValid)
    {
        DoThat();
    }
}



답변

void 메서드의 반환은 나쁘지 않으며 중첩을 줄이기 위해 문을 반전if 하는 일반적인 관행 입니다.

그리고 메소드에 대한 중첩이 적 으면 코드 가독성과 유지 보수성이 향상됩니다.

실제로 return 문이없는 void 메서드가있는 경우 컴파일러는 항상 마지막에 ret 명령어 를 생성 합니다.


답변

가드를 사용하는 또 다른 큰 이유가 있습니다.

중히 여기다:

void MyFunc(object obj)
{
    if (obj != null)
    {
        obj.DoSomething();
    }
}

대:

void MyFunc(object obj)
{
    if (obj == null)
        return;

    obj.DoSomething();
}

이제 다른 프로그래머가 다음 행을 추가한다고 상상해보십시오. obj.DoSomethingElse ();

void MyFunc(object obj)
{
    if (obj != null)
    {
        obj.DoSomething();
    }

    obj.DoSomethingElse();
}

void MyFunc(object obj)
{
    if (obj == null)
        return;

    obj.DoSomething();
    obj.DoSomethingElse();
}

분명히 이것은 단순한 경우이지만 프로그래머는 첫 번째 (중첩 된 코드) 인스턴스에서 프로그램에 충돌을 추가했습니다. 두 번째 예제 (가드가있는 조기 종료)에서 가드를 통과하면 코드가 의도하지 않은 null 참조 사용으로부터 안전합니다.

물론 훌륭한 프로그래머는 이런 실수를하지 않습니다. 그러나 예방이 치료보다 낫습니다.이 잠재적 인 오류 소스를 완전히 제거하는 방식으로 코드를 작성할 수 있습니다. 중첩은 복잡성을 추가하므로 모범 사례에서는 중첩을 줄이기 위해 코드를 리팩토링하는 것이 좋습니다.


답변

나쁜 연습 ??? 절대 안돼. 사실, 유효성 검사가 실패하면 가장 빨리 메서드에서 반환하여 유효성 검사를 처리하는 것이 항상 더 좋습니다. 그렇지 않으면 엄청난 양의 중첩 된 if 및 else가 발생합니다. 일찍 종료하면 코드 가독성이 향상됩니다.

또한 유사한 질문에 대한 응답을 확인하십시오. if-else 대신 return / continue 문을 사용해야합니까?


답변

나쁜 습관은 아닙니다 (이미 언급 된 모든 이유로). 그러나 메서드에서 더 많은 수익을 얻을수록 더 작은 논리적 메서드로 분할되어야합니다.


답변

첫 번째 예는 가드 문을 사용하는 것입니다. 에서 위키 백과 :

컴퓨터 프로그래밍에서 가드는 해당 분기에서 프로그램 실행을 계속하려면 true로 평가해야하는 부울 식입니다.

메서드 맨 위에 많은 경비원을 두는 것이 완벽하게 이해할 수있는 프로그래밍 방법이라고 생각합니다. 기본적으로 “이 중 하나라도 사실이면이 메서드를 실행하지 마십시오”라고 말합니다.

따라서 일반적으로 다음과 같습니다.

void DoThis()
{
  if (guard1) return;
  if (guard2) return;
  ...
  if (guardN) return;

  DoThat();
}

나는 그것이 훨씬 더 읽기 쉽다고 생각합니다.

void DoThis()
{
  if (guard1 && guard2 && guard3)
  {
    DoThat();
  }
}


답변

성능 저하는 없지만 두 번째 코드는 더 읽기 쉽고 유지 관리가 더 쉽습니다.


답변

이 경우 두 번째 예제는 더 나은 코드이지만 void 함수에서 반환하는 것과 관련이 없습니다. 두 번째 코드가 더 직접적이기 때문입니다. 그러나 void 함수에서 반환하는 것은 전적으로 괜찮습니다.