주석 대체로 추가 로컬 변수 소개


12

기술적으로 불필요한 추가 로컬 변수를 사용하여 발생하는 상황을 설명하는 것이 좋은 스타일입니까?

예를 들면 다음과 같습니다.

bool easyUnderstandableIsTrue = (/* rather cryptic boolean expessions */);

if(easyUnderstandableIsTrue)
{
    // ...
}

기술 오버 헤드에 관해서는 컴파일러 가이 추가 라인을 최적화 할 것으로 기대합니다. 그러나 불필요한 코드 팽창으로 간주됩니까? 내 눈에 그것은 오래된 주석의 위험을 줄입니다.


10
"기술적으로 불필요한 추가 로컬 변수를 사용하여 발생하는 상황을 설명하는 것이 좋은 스타일입니까?" 예. 실제로 다른 말은 할 수 없습니다.
David Arno

3
나중에 내 코드를 읽을 때 이러한 스타일 (즉, 설명이 포함 된 많은 중간 변수 사용)이 매우 유용하다는 것을 알았습니다. 물론 중간 변수를 도입하지 않으면 서 복잡한 표현식을 작성하고 몇 가지 이름을 저장할 수 있지만 왜 그렇게하겠습니까? 비교적 잘 작성되어 있어도 코드를 읽는 것은 상당히 어려울 수 있으므로 불필요하게 코드를 복잡하게 만드는 것이 합리적인 방법이라고 생각하지 않습니다.
Mael

나는 이것이 Martin Fowler의 리팩토링 카탈로그 에서 조건부 표현식 통합이라고 합니다.
Brandin

답변:


16

추가 변수를 사용하는 비용은 얼마입니까? 대부분의 언어에서는 컴파일 된 언어와 해석 된 언어 모두가 없습니다.

이것의 장점은 무엇입니까?

  • cryptic boolean expression을 별도의 메소드로 추출하는 것과 마찬가지로 중복 코드의 위험을 줄이지 만 별도의 메소드의 경우보다 약간 적습니다. 조건식이 메소드 자체에서 재사용되면 변수를 재사용 할 수 있습니다. 식이 다른 방법으로 표시되면 그렇지 않습니다.

    프로그래밍 언어로 변경할 수없는 지역 변수를 가지거나 스타일을 강제로 적용 할 수있는 방법이 없다면 어떠한 변수도 재 할당 할 수 없으며, 이러한 리팩토링은 장기적으로 위험 할 수 있습니다. 변수 값이 변경되면 코드를 추론하기가 매우 어려울 수 있습니다.

  • 당신은되는 문서는 코드와 동기화지고의 위험을 감소 . 개발자는 주석보다 변수 및 메소드의 이름을 더 쉽게 업데이트하는 경향이 있습니다 .¹ 따라서 다음과 같은 코드를 보는 것은 드문 일이 아닙니다.

    // Find if the user is an actual author in order to allow her to edit the message.
    if (currentUser.isAdministrator || (message.author == currentUser && !message.locked))

이 표현은 아마도로 시작한 if (message.author == currentUser)다음 저자 일 필요가없고 잠긴 물건을 신경 쓰지 않는 잠긴 메시지와 관리자의 경우를 처리하도록 진화했습니다. 그러나 의견에는 이러한 변경 사항이 반영되지 않았습니다.

두 가지 이점이 모두 중요하지는 않지만 추가 변수가 저렴하므로 실제로 사용하는 것이 좋습니다.

부울 표현식이 지나치게 복잡 해지는 경우 :

  • 별도의 방법으로 추출하고 다음을 수행하십시오 .
  • 여러 간단한 부울 식으로 리팩터링하십시오.

위의 예는 다음과 같습니다.

class Message
{
    ...
    public boolean canBeEditedBy(User user)
    {
        ...
        if (user.isAdministrator) {
            return true;
        }

        return this.author == user && !this.locked;
    }
}

...
if (message.canBeEditedBy(currentUser)) // See? Much more readable now!
{
    ...
}

¹ 출처 : 대부분 비즈니스 소프트웨어를 개발하는 동료에 대한 본인의 관찰; YMMV. 실제 연구는 다른 결과를 보여줄 수 있습니다. 개인적으로 개발자가 코드를 읽을 때 코드에 초점 맞추고 있으며 주석은 코드 가 아니라 문서라고 생각합니다. 따라서 일반적으로 주석을 읽지 않으므로 주석을 업데이트하기를 기대하기가 어렵습니다.

² 지나치게 복잡한 임계 값은 간단한 공식으로 정의됩니다. 코드를 검토 한 개발자의 절반이 살인 의도를 표현하면 임계 값에 도달합니다. 위의 부울 식은 리팩토링이 필요할 정도로 간단합니다. 그러나 연속으로 네 부분으로 if ((a && b) || (c && d))구성되어 잠재적으로 리팩터링이 가능합니다. 표현이 평평하면 부품 수는 대부분 관련이 없습니다. if (a || b || c || d || ... || z)충분히 읽을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.