언급 된 바와 같이, 여기에는 두 가지 사고 학교가 있습니다.
1) 연도가 1987 년이므로 모든 기능을 최상으로 선언하십시오.
2) 최초 사용에 가장 가깝고 가능한 가장 작은 범위에서 선언하십시오.
이것에 대한 나의 대답은 DO BOTH입니다! 설명하겠습니다 :
긴 기능의 경우 1) 리팩토링을 매우 어렵게 만듭니다. 개발자가 서브 루틴 개념에 반대하는 코드베이스에서 작업하는 경우 함수 시작시 50 개의 변수 선언이 있으며 그 중 일부는 for 루프의 "i"일 수 있습니다. 기능의 하단.
따라서 나는 이것으로부터 최고 -PTSD 선언을 개발했고 옵션 2)를 종교적으로하려고했다.
짧은 기능 하나 때문에 옵션 1로 돌아 왔습니다. 함수가 충분히 짧으면 지역 변수가 거의 없으며 함수가 짧기 때문에 함수의 맨 위에 놓으면 첫 번째 사용에 가깝습니다.
또한 맨 위에 선언하고 싶지만 초기화에 필요한 계산을 수행하지 않은 경우 "선언 및 NULL로 설정"의 반 패턴은 초기화해야하는 항목이 인수로 수신되기 때문에 해결되지 않습니다.
이제 내 생각은 함수의 맨 위에서 선언하고 가능한 한 처음 사용하는 것에 가깝다는 것입니다. 둘 다! 그리고이를 수행하는 방법은 잘 나누어 진 서브 루틴을 사용하는 것입니다.
그러나 긴 기능을 사용하는 경우 메소드를 추출하는 것이 더 쉽기 때문에 처음 사용하는 것에 가장 가까운 것을 넣으십시오.
내 레시피는 이것입니다. 모든 지역 변수의 경우 변수를 가져 와서 선언을 맨 아래로 이동하고 컴파일 한 다음 선언을 컴파일 오류 바로 앞으로 이동하십시오. 그것은 첫 번째 사용입니다. 모든 지역 변수에 대해이 작업을 수행하십시오.
int foo = 0;
<code that uses foo>
int bar = 1;
<code that uses bar>
<code that uses foo>
이제 선언 전에 시작되는 스코프 블록을 정의하고 프로그램이 컴파일 될 때까지 끝을 이동하십시오.
{
int foo = 0;
<code that uses foo>
}
int bar = 1;
<code that uses bar>
>>> First compilation error here
<code that uses foo>
foo를 사용하는 코드가 더 있으므로 컴파일되지 않습니다. 우리는 컴파일러가 foo를 사용하지 않기 때문에 bar를 사용하는 코드를 통과 할 수 있음을 알 수 있습니다. 이 시점에서 두 가지 선택이 있습니다. 기계적인 방법은 컴파일 할 때까지 "}"를 아래쪽으로 옮기는 것이고, 다른 방법은 코드를 검사하고 순서를 다음과 같이 바꿀 수 있는지 확인하는 것입니다.
{
int foo = 0;
<code that uses foo>
}
<code that uses foo>
int bar = 1;
<code that uses bar>
주문을 전환 할 수 있다면 임시 값의 수명이 단축되기 때문에 원하는 것일 수 있습니다.
주목해야 할 또 다른 사항은 foo의 값을 사용하는 코드 블록 사이에서 foo의 값을 유지해야하는지 또는 둘 다에서 다른 foo 일 수 있다는 것입니다. 예를 들어
int i;
for(i = 0; i < 8; ++i){
...
}
<some stuff>
for(i = 3; i < 32; ++i){
...
}
이러한 상황은 내 절차보다 더 필요합니다. 개발자는 코드를 분석하여 수행 할 작업을 결정해야합니다.
그러나 첫 번째 단계는 첫 번째 사용법을 찾는 것입니다. 시각적으로 할 수는 있지만 때로는 선언을 삭제하고 컴파일하고 첫 번째 사용 위에 다시 넣는 것이 더 쉽습니다. 첫 번째 사용이 if 문 안에 있으면 그것을 넣고 컴파일하는지 확인하십시오. 그러면 컴파일러는 다른 용도를 식별합니다. 두 용도를 모두 포함하는 스코프 블록을 만드십시오.
이 기계적인 부분이 끝나면 데이터의 위치를 분석하기가 더 쉬워집니다. 변수가 큰 범위 블록에서 사용되는 경우 상황을 분석하고 두 개의 다른 항목에 대해 동일한 변수를 사용하고 있는지 확인하십시오 (예 : "i"와 같이 두 개의 for 루프에 사용됨). 용도와 관련이없는 경우, 관련없는 용도마다 새 변수를 작성하십시오.