자, 이것은 약간 악마를 옹호하는 질문입니다.
전역 변수는 언제 가능하며, 그렇지 않은 경우 대안으로 무엇을 사용 하시겠습니까?
이 질문에 대한 흥미로운 부가 사례는 공개 정적 클래스 필드가 글로벌과 어떻게 다릅니 까?
자, 이것은 약간 악마를 옹호하는 질문입니다.
전역 변수는 언제 가능하며, 그렇지 않은 경우 대안으로 무엇을 사용 하시겠습니까?
이 질문에 대한 흥미로운 부가 사례는 공개 정적 클래스 필드가 글로벌과 어떻게 다릅니 까?
답변:
내가 아는 한 공개 정적 필드는 기본적으로 전역이므로 네임 스페이스를 방해하지 않는 것을 제외하고는 어디에서나 호출 할 수 있습니다.
내 코드에서 개인적으로 '전역'변수를 사용하는 유일한 시간은 변경할 수없는 공개 정적 필드의 형식입니다. 이 경우 프로그램의 다른 부분에 의해 가치가 약화되는 것에 대해 걱정할 필요가 없으며 물론 각 클래스에서 동일한 영구 값을 가진 수십 개의 변수를 갖는 것보다 훨씬 좋습니다.
개인적으로, 나는 런타임 구성을 위해 전역을 사용합니다-응용 프로그램 시작시 구성 속성이로드되고 자주 변경되지 않는 경우 (한곳에서만 변경되는 경우) 사용해야 할 수도있는 모든 메소드에 전달하는 것이 끔찍하고 오류가 발생하기 쉽습니다. 어느 시점에서. 메소드 서명 및 호출 사이트를 어지럽히 지 않고 가리지 않으므로 사용이 필요한 어느 곳에서나 사용할 수있는 것을 사용하는 것이 좋습니다.
CONFIG_
또는 CFG_
접두사 가있는 일반 전역입니다 .
실시간 / 내장 시스템을 제외하고는 상수 값에 대해서만 전역을 사용해야합니다. 문제가 없으면 문제를 해결할 수 없다고 생각되면 무언가 잘못한 것일 수 있습니다.
또한 Singleton 패턴을 살펴보면 글로벌 액세스 포인트가 필요한 상황에서 글로벌에 더 나은 솔루션을 제공합니다.
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
는 '이 특정 루프'가 나타나는 하나의 파일 / 클래스 / 섹션에서만 관련됩니다.
전역 변수의 문제점은 코드의 어느 곳에서나 변수를 알고 있어야한다는 것입니다. 그러나 특정 글로벌에 대해 알아야한다고 결정한 후에는 더 이상 글로벌을 사용하는 데있어 손실이 거의 없습니다. 따라서 제 생각에는 전역 변수가 거의 없어야하지만 소수는 최대 마일리지를 가져야한다는 것입니다.
이런 식으로 생각되는 다른 예는 Ruby에서 믹스 인 사용을 살펴보십시오.
네임 스페이스에 관한 것입니다.
세계의 모든 사람이 같은 성을 가지고 있다고 잠시 상상해보십시오. 엉망이야
(인도에서 시크교 인들은 모두 같은 성을가집니다 : Singh-한번보세요)
짧은 버전 : 프로그램에 대해 추론하기가 더 쉬울 때. 일반적으로 사례는 널리 사용되는 일부 유형의 전역 상태 또는 정적 자원입니다.
Long version : Tom Hawtin은 "먼 거리에서 으스스한 행동으로"라고 말했습니다 ... 전역과 정확히 같은 문제입니다. 사용되는 위치와 방법을 알아야합니다. 버그. 지역은 프로그램에 대해 추론하기 위해 프로그래머가 이해해야 할 범위를 줄이는 전략에 지나지 않습니다.
어디에 사용되는지 아는 문제의 또 다른 측면은 중복 전역을 사용할 수 있다는 것입니다.이 경우 대부분의 프로그램이 var1을 가져 와서 설정하고 var2를 사용하여 두 곳에서 사용하면 실제로 이상하게 될 수 있습니다 같은 정보. 특히 여러 사람이 동일한 코드를 작성하는 경우. IDE는 글로벌 비용을 줄이는 사용법을 찾는 데 도움이 될 수 있지만 중복에 대해서는 아무 것도하지 않습니다.
더 많은 지구본을 가질수록 지구에서 일어나는 일을 추적하기가 더 어려워집니다. 그것들은 적고 멀리 있어야합니다.
글로벌과 싱글 톤의 두 가지 문제점은 테스트 가능성과 배포 가능성입니다.
테스트를 위해 계획된 글로벌 및 싱글 톤 수명을 다루기에는 지나치게 복잡한 테스트 장치가 너무 많았습니다. 그러한 객체가 명확하고 간단한 시작 및 해제 규칙을 가지고 있는지 확인하십시오.
배포 가능성에 대해서는 두 가지 경우를 고려해야합니다. 첫째, 글로벌 객체는 어떻게 살 것인가? 정적 또는 동적 라이브러리에 있습니까? 해당 전역 객체가 플러그인에 재사용되면 추가 사본을 얻을 수 있습니까? 둘째, 전역 객체가 병렬 응용 프로그램으로 드롭되면 어떻게됩니까? 스레드 안전합니까?
전체적으로, 나는 그 이유가 글로벌과 싱글 톤이 예외적으로 만 사용됨을 의미한다고 생각합니다.