코드 블록을 만드는 것은 나쁜 습관입니까?


12

C ++에서는 다음과 같은 일부 함수 내에 코드 블록을 만드는 것이 좋지 않습니다.

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

이를 수행하는 요점은 동일한 유형의 프로 시저에 대해 동일한 변수 이름 "test"를 여러 번 사용하는 것입니다. 실제로 내 프로젝트에는 여러 변수가 있으며 여러 테스트를 수행하고 있습니다. 테스트가 어떻게 비슷한 지 고려할 때 각 테스트마다 다른 이름으로 새 변수를 계속 만들고 싶지 않습니다.

각 테스트 후 변수가 범위를 벗어나도록 코드 블록을 삽입하는 것이 나쁜 습관입니까? 그런 다음 해당 이름을 다시 사용할 수 있습니까? 아니면 다른 해결책을 찾아야합니까? 모든 테스트에 대해 동일한 변수 세트를 사용하는 것을 고려하고 각 테스트가 끝난 후 변수를 모두 0으로 설정하는 것을 고려했지만, 이것은 나쁜 습관 일 수 있습니다.


19
이 코드를 수정했다면, 각 테스트를 개별 메소드로 분리하라고 말할 것입니다 ... 결과적으로 코드 블록을 사용하여 별도로 범위를 지정할 필요는 없습니다.
Maybe_Factor 4

1
@ Maybe_Factor-동의합니다. 별도의 방법의 이점은 더 읽기 쉬운 코드를 제공하여 각 블록의 이름을 지정할 수 있다는 것입니다.
mouviciel

@mouviciel 더 읽기 쉬운 코드뿐만 아니라 더 읽기 쉬운 테스트 보고서!
Maybe_Factor 23시 01 분

@Maybe_Factor 동의하지 않습니다. 사물을 별도의 함수로 옮기면 재사용 할 수없는 기능의 비트처럼 보이게 만드는 부정적인 효과가 있습니다. 함수에 대한 모든 논리를 한 곳에 유지하는 것이 좋습니다.
Miles Rout

1
@MilesRout 이것은 하나의 논리 함수가 아니며, 단일 테스트 함수에 모두 포함 된 함수에 대한 다중 단위 테스트입니다. 일반 코드의 코드 블록과 함수는 완전히 다른 논의입니다.
Maybe_Factor

답변:


22

블록을 사용하여 일부 리소스를 범위 지정하는 경우 완벽하게 합리적입니다. 파일, 네트워크 연결, 메모리 할당, 데이터베이스 트랜잭션 등 이 경우 블록은 실제로 코드의 논리적 구조의 일부입니다. 리소스를 생성하고 일정 시간 동안 존재하며 지정된 시간에 사라집니다.

그러나 당신이하고있는 모든 것이 이름을 지정하는 것이라면, 그들은 나쁜 습관이라고 말할 것입니다. 물론 일반적으로 말하면; 특별한 상황이 적용될 수 있습니다.

예를 들어,이 기능이 일부 코드 생성 시스템, 테스트 프레임 워크 등에 의해 생성 된 경우, 이름 범위 지정을위한 블록이 합리적입니다. 그러나 인간이 아닌 기계의 목적으로 작성된 코드에 대해 이야기하고 있습니다.

인간이 동일한 함수 내에서 이름을 재사용 해야하는 코드를 작성하는 경우 해당 블록은 별도의 함수 일 필요가 있다고 말합니다. 특히 해당 이름이 해당 블록 내에서 다른 유형 및 / 또는 의미로 사용되는 경우.


10

이와 같은 블록을 만드는 것은 나쁜 습관이 아닙니다. 범위가 작동하는 방식입니다.

일반적으로 RAII (Resource Acquisition is Initialization)를 사용할 때 수행되며 소멸자가 호출되는시기를 제어하려고합니다.

그것이 길어지면 그 코드를 자체 기능으로 옮기는 것을 고려할 것입니다.

제 생각에는 변수 이름을 재활용하기 위해 그것을 사용하는 것은 좋지 않습니다. 그러나 메모리가 부족한 경우 유용하다는 것을 알 수 있습니다.


로컬 변수 이름을 재사용해도 메모리 사용에는 영향을 미치지 않습니다.
케빈 클라인

1
스마트 옵티마이 저가 2 개의 변수에 대해 1 개의 메모리 위치를 사용할 수 있다고 생각하지 않습니까?
Robert Andrzejuk 8

3
예. 그러나 그들이 같은 범위에 있다면, 소멸자가 없다면 그렇게 할 수도 있습니다.
Sebastian Redl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.