변수를 재사용해야합니까? 알고있다. 예를 들어, 메소드 매개 변수를 “재정의”하지

변수를 재사용해야합니까?

나는 많은 모범 사례가 그렇게해서는 안된다는 것을 알고 있지만 나중에 다른 개발자가 코드를 디버깅하고 유사하게 보이는 3 개의 변수를 가질 때 유일한 차이점은 코드의 다른 위치에서 생성된다는 것입니다. 혼란스러운. 단위 테스트는 이에 대한 좋은 예입니다.

그러나, 나는 모범 사례가에 대한 대부분의 시간을 것을 알고있다. 예를 들어, 메소드 매개 변수를 “재정의”하지 말라고합니다.

모범 사례는 이전 변수를 무효화하는 것입니다 (Java에는 null변수에 할당 할 때 경고를 표시하는 Sonar가 있으며 Java 6 이후 가비지 수집기를 호출 할 필요가 없음) 항상 제어 할 수는 없습니다 어떤 경고가 꺼 졌는지, 대부분의 경우 기본값이 켜져 있습니다.)



답변

문제는 방법이 길고 여러 작업을 순서대로 수행하는 경우에만 나타납니다. 이로 인해 코드 자체를 이해하기 어려워집니다. 변수를 재사용하면 위험 요소가 추가되어 코드를 따르기가 더 어려워지고 오류가 발생하기 쉽습니다.

IMO 모범 사례는 한 가지만 수행 할 수있는 짧은 방법을 사용하여 전체 문제를 해결하는 것입니다.


답변

메소드의 변수 재사용은 리팩토링 / 분할해야한다는 강력한 신호입니다.

내 대답은 재사용하지 않아야한다는 것입니다. 그렇다면 나중에 리팩터링하는 것이 훨씬 어려울 것입니다.


답변

따라 다릅니다.

일부 변수는 특정 유형의 데이터를 보유하기 위해 정확하게 작성 될 수 있으며, 함수 실행 중에 변경 될 수 있습니다. 예를 들어 리턴 코드는 다음과 같습니다.

void my_function() {
    HRESULT errorcode;
    errorcode = ::SomeWindowsApiFunction();
    if (FAILED(errorcode)) { /* handle error */ }
    errorcode = ::AnotherWindowsApiFunction();
    if (FAILED(errorcode)) { /* handle error */ }
}

변수 이름을 사용하면이 변수가 무엇을 저장하려고하는지 명확하게 알 수 있습니다. 나는 이것과 같은 다른 유스 케이스가 가능하다고 생각합니다. 변수는 개념적으로 함수 과정에서 매우 유사한 것들의 다른 인스턴스에 의해 논리적으로 사용되는 컨테이너입니다.

그러나 일반적으로 이는 가능한 코드 독자에게 분명한 상황에서만 수행해야합니다. 코드 가독성에 관계없이 극단적 인 최적화를 제외하고는 유형이 적합하기 때문에 변수를 재사용해야합니다.

이 모든 것은 기본적으로 변수 명명의 우수 사례에서 비롯됩니다. 이름은 스스로 말해야합니다. 모든 재사용에 대한 정확한 목적을 짧은 이름으로 작성하기 어려운 경우, 고유 한 변수를 사용하는 것이 가장 좋습니다.


답변

변수를 재사용하지 않는 가장 큰 이유는 (특히 단위 테스트에서) 테스트 및 디버그하기 어려운 불필요한 코드 경로를 도입하기 때문입니다. 좋은 단위 테스트는 다른 테스트와 독립적이어야하며 단위 테스트 픽스처에서 클래스 (인스턴스) 레벨 변수를 재사용 할 때 각 테스트 전에 해당 상태를 확인해야합니다. 우수한 단위 테스트는 결함을 분리하기 때문에 이론적으로 각 테스트 케이스 (방법)는 테스트중인 시스템에 대해 1 개의 동작 만 가정해야합니다. 테스트 메소드가 이와 같이 작성되면 메소드 레벨 변수를 재사용 할 필요가 거의 없습니다. 마지막으로 클로저 및 비동기 처리를 지원하는 언어에서는 메서드 전체에서 변수를 재사용하는 경우 대체 무슨 일이 일어나고 있는지 추론하기가 어렵습니다.


답변

다른 변수를 사용해야합니다. 동료가 혼란스러워 질 까봐 걱정되는 경우, 자신의 역할을 명확하게 설명하는 이름을 지정하십시오.
변수 재사용은 향후 혼란의 원인이 될 수 있습니다. 지금 정리하는 것이 좋습니다.
경우에 따라 동일한 변수 이름을 재사용 할 수 있습니다. 예를 들어 i간단한 계산 루프에서. 이러한 경우 변수가 자체 범위 내에 있는지 확인해야합니다.

편집 : 변수 재사용은 때로는 단일 책임 원칙 을 위반했다는 신호입니다. 재사용 된 변수가 동일한 역할에서 사용되는지 확인하십시오. 그렇다면 전혀 재사용되지 않을 수도 있습니다 (그러나 두 변수를 갖는 것이 바람직하지만, 상기 변수의 범위를 제한하는 것이 바람직합니다). 다른 역할로 사용되는 경우 SRP 위반이 발생합니다.


답변

컴파일러가 도움을 필요로 할 때 다른 답변에서 제공 한 훌륭한 조언에 관계없이 변수를 재사용 할 수있는 상황이 있습니다.

경우에 따라 컴파일러는 특정 레지스터 할당 변수가 코드의 다음 부분에서 더 이상 사용되지 않는다는 것을 인식하기에 영리하지 않을 수 있습니다. 따라서 이론적으로 다음 변수에 대한 프리 레지스터를 재사용하지 않으며 생성 된 코드가 차선책 일 수 있습니다.

이 상황을 올바르게 포착하지 못하는 현재의 주류 컴파일러는 알지 못하므로 컴파일러가 최적의 코드를 생성하지 않는다는 사실을 모르면 절대로 그렇게하지 마십시오. 사용자 정의 컴파일러를 사용하여 특수 임베디드 시스템을 컴파일하는 경우 여전히이 문제가 발생할 수 있습니다.


답변

나는 아니오라고 말할 것입니다.

이 시나리오에 대해 생각해보십시오. 프로그램이 중단되었으며 코어 덤프를 검사하여 발생한 문제를 해결해야합니다. 차이점을 알 수 있습니까? 😉