함수 시작이 아닌 내부 블록에 선언을 넣을 때 가능한 단점은 무엇입니까?


9

내가 일하는 곳에는 변수 선언 배치에 대한 명확한 지침이 있습니다. 이에 따르면, 내부 블록 (for 루프와 같은)이 아닌 전역 수준 및 / 또는 함수의 시작 부분에 배치해야합니다. 그들이 나보다 더 경험이 많은 사람들에 의해 지정 되었기 때문에, 나는 그만한 이유가있을 것이라고 확신하지만, 그것이 무엇인지 알아낼 수는 없습니다. 더 큰 범위에서 선언 할 때 컴파일 시간 / 런타임 이점이 있는지 아는 것이 좋습니다.

답변:


8

두 가지 주요 장점이 있습니다.

  • 다른 유형의 변수 이름을 재사용 할 수 없습니다.
  • 루틴을 리팩토링해야한다는 것이 더 일찍 분명해집니다. 상단의 변수는 상당히 빠르게 엉망이되고,이 엉망은 쉽게 알아볼 수 있습니다.

그 가치가있는 컴파일러는 어쨌든 변수의 범위를 최적화하므로 순전히 형식 관련 문제입니다.

내 두 센트의 경우 여전히 범위의 의도를 컴파일러에 전달하기 위해 변수의 가장 안쪽 선언을 선호합니다. 루프 내에서만 변수에 액세스하려는 경우 루프에서 변수를 선언 할 때 컴파일시에 나중에 참조 할 수 있습니다.


3

지금까지 내가 찾은 유일한 이점은 코드 단순성입니다. 항상 변수 선언을 찾을 위치를 알고 팀의 모든 직원이 동일한 코딩 스타일을 채택합니다. 이로 인해 코드 유지 관리가 쉬워 지지만 더 나은 코드를 더 쉽게 작성할 수 있는지 확신 할 수 없습니다. 나는 때때로 당신이 더 나쁜 코드를 작성한다는 것을 의미하는 것은 아니며 때로는 코드를 작성하는 것이 더 어렵다는 것을 의미합니다. 그럼에도 불구하고 개발 팀이 크거나 멤버가 코드 표준을 사용하여 자주 변경하는 것이 도움이됩니다.


3

일관성을 유지하려는 결정처럼 들립니다. 또한 인접 범위에서 다른 변수에 동일한 이름을 사용하지 못하게하고 가독성을 높입니다. 거스가 지적했듯이 변수를 어디에서 찾아야하는지 알게 될 것입니다. 나는 가장 좁은 범위의 원리가 변수 클러 터를 상단에서 방해하지 않기 때문에 더 낫다고 생각합니다. 가장 바깥 쪽 선언은 클래스 IMO의 개인 구성원을 선언하는 것과 매우 유사합니다.


3

스타일과 실습에 따라 언어가 다를 수 있습니다. 다음은 JSF-AV-rules 에서 가져온 것으로 Stroustrup은 자신이 선호하는 코딩 표준으로 지적합니다.

AV 규칙 136
Declarations should be at the smallest feasible scope

이에 대한 근거는 다음과 같습니다.

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

C ++을 사용하는 경우 필요할 때 변수를 선언하는 것이 좋습니다.


3

이것을 모범 사례라고 부를 수 있는지 확실하지 않습니다. 새 C 프로젝트에 대한 지침을 설정할 때 항상 변수가 사용되는 위치에 가깝게 선언하는 것이 좋습니다. 두 가지 이유로 인해 나중에 코드를 쉽게 리팩터링하는 것이 더 쉽습니다 (예 : 메소드 추출시). 또한 컴파일러가 더 나은 최적화를 수행하도록 도와줍니다.

나는이 의견에 혼자가 아닙니다. 여기에 같은 문제를 다룹니다 질문입니다 : /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -그들에 대한 대답은 당신이 그들을 사용하는 곳을 선언하는 것입니다. Robert C. Martin의 'Clean Code'책에도 같은 방법이 설명되어 있습니다.

그러나 이전 C 표준 (C-89)을 사용하는 경우 함수 맨 위에 로컬 변수를 정의해야합니다. 아마도 C-89가 사용 된 때부터 가이드 라인이 남은 것일까 요? 지침을 작성한 사람에게 왜 규칙이 여전히 존재하는지 물어 보는 것이 좋습니다.


2

선언이 if 절에 포함되어 있지만 거의 사용되지 않지만 많은 메모리가 필요한 경우 함수 시작 부분에 모든 것을 할당하는 것보다 메모리 풋 프린트가 더 작습니다 (대부분).

루프 내에 있으면 메모리를 반복적으로 재 할당해야하므로 성능 측면에서 비용이 많이들 수 있습니다.

두 가지 방법으로 일을하는 이유가 있습니다.


1

1989 년의 구식 C 표준은 블록 시작시 변수 선언 만 허용합니다.

C99 선언은 어디에서나 허용되기 때문에. 아마 당신의 장소는 아직 C99로 바꾸지 않았습니다.


우리는 C99를 사용하지만 더 중요한 것은 함수의 시작이 아니라 가장 안쪽 블록에 선언하는 것이 무엇을 의미 하는지를 찾고있었습니다. 아마, 나는 충분히 명확하지 않았다 ...
TCSGrad

1

이 결정을 내린 사람들은 선언을 맨 위에 놓는 것이 표준이었던 때에 사용 된 것으로 보이며 그것이 사용되는 곳에 더 가깝게 선언하기 위해 환경 설정으로 전환하지 않기로 선택한 것 같습니다.

이 일관성 수준이 얼마나 강력한 지 잘 모르겠습니다. 일부 IDE는 아마도 다른 IDE보다 쉽게 ​​찾을 수 있습니다. 전역 변수의 경우 이것은 의미가 있지만 함수가 너무 길면 변수 선언을 찾기가 어려워지고 더 큰 문제가 있습니다.

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