왜 글로벌 변수는 사악한가요?
나는 왜 그것을 사용하는지 알아내려고 노력하고 있습니다.globalPython(및 일반적인 프로그래밍)에서는 잘못된 관행으로 간주됩니다.누가 설명 좀 해주실래요?더 많은 정보가 있는 링크도 감사하겠습니다.
이것은 Python과는 상관이 없습니다. 글로벌 변수는 모든 프로그래밍 언어에서 좋지 않습니다.
그러나 전역 상수는 개념적으로 전역 변수와 동일하지 않습니다. 전역 상수는 완벽하게 무해합니다.파이썬에서 둘 사이의 구별은 순전히 관습에 의한 것입니다.CONSTANTS_ARE_CAPITALIZED그리고.globals_are_not.
글로벌 변수가 나쁜 이유는 함수에 숨겨진(명백하지 않고, 놀랍고, 감지하기 어렵고, 진단하기 어려운) 부작용이 발생하여 복잡성이 증가하여 잠재적으로 스파게티 코드가 발생할 수 있기 때문입니다.
그러나 전역 상태의 건전한 사용은 알고리즘 최적화, 복잡성 감소, 캐싱 및 메모화 또는 주로 필수적인 코드베이스에서 발생하는 포팅 구조의 실용성을 위해 기능 프로그래밍에서도 허용됩니다(로컬 상태 및 가변성과 마찬가지로).
대체로, 당신의 질문은 여러 가지 방법으로 대답할 수 있기 때문에, 당신의 최선의 방법은 "왜 글로벌 변수들이 나쁜가" 구글을 검색하는 것입니다.몇 가지 예:
더 깊이 들어가 부작용이 왜 모든 것인지, 그리고 많은 다른 계몽적인 것들에 대해 알고 싶다면, 여러분은 기능 프로그래밍을 배워야 합니다.
네, 이론적으로 글로벌(그리고 일반적으로 "국가")은 사악합니다.실제로 파이썬의 패키지 디렉터리를 살펴보면 대부분의 모듈이 여러 글로벌 선언으로 시작한다는 것을 알 수 있습니다.분명히, 사람들은 그들에게 아무런 문제가 없습니다.
특히 파이썬에 대해서는 글로벌의 가시성이 모듈로 제한되므로 전체 프로그램에 영향을 미치는 "진정한" 글로벌이 없으며, 이로 인해 훨씬 덜 해롭습니다.또 은, " 다른요점없다습니은또다없"가 입니다.const그래서 상수가 필요할 때는 전역을 사용해야 합니다.
내 연습에서 함수에서 전역을 수정하는 경우 항상 다음과 같이 선언합니다.global기술적으로 그럴 필요가 없다고 하더라도 다음과 같습니다.
cache = {}
def foo(args):
global cache
cache[args] = ...
이것은 전 세계의 조작을 추적하기 쉽게 만듭니다.
이 주제에 대한 개인적인 의견은 함수 로직에 글로벌 변수가 사용된다는 것은 다른 코드가 해당 함수의 로직과 예상 출력을 변경할 수 있다는 것을 의미하며, 이는 디버깅을 매우 어렵게 만들고 테스트도 어렵게 만들 것입니다.
게다가, 만약 당신의 코드를 읽는 다른 사람들(오픈 소스 커뮤니티, 동료 등)을 고려한다면, 그들은 글로벌 변수가 어디에 설정되어 있는지 이해하는 데 어려움을 겪을 것입니다.함수 정의 자체를 읽음으로써 함수의 기능을 결정할 수 있는 고립된 함수와 달리 이 전역 변수에서 변경된 값과 예상되는 값을 나타냅니다.
(아마도) 순수 함수 정의 위반
깨끗하고 (거의) 버그가 없는 코드는 가능한 한 순수한 기능을 가져야 한다고 생각합니다(순수한 기능 참조).순수 함수는 다음 조건을 갖는 함수입니다.
- 함수는 항상 동일한 인수 값이 주어지면 동일한 결과 값을 평가합니다.함수 결과 값은 프로그램 실행이 진행되는 동안 또는 프로그램의 다른 실행 간에 변경될 수 있는 숨겨진 정보나 상태에 의존할 수 없으며 I/O 장치(일반적으로 아래 참조)의 외부 입력에 의존할 수도 없습니다.
- 결과를 평가해도 변형 가능한 개체의 돌연변이나 I/O 장치로의 출력과 같은 의미론적으로 관찰 가능한 부작용이나 출력은 발생하지 않습니다.
글로벌 변수가 있는 것은 외부 코드가 아닌 경우 위의 두 가지 중 적어도 하나를 위반하는 것이므로 예상치 못한 결과를 초래할 수 있습니다.
순수 함수의 또 다른 명확한 정의: "순수 함수는 모든 입력을 명시적 인수로 받아들이고 모든 출력을 명시적 결과로 생성하는 함수입니다." [1]글로벌 변수를 갖는 것은 입력과 출력 중 하나(글로벌 변수)가 명시적으로 주어지거나 반환되지 않기 때문에 순수 함수의 개념을 위반합니다.
(아마도) F.I.R.S.T 원칙을 위반하는 장치
또한 단위 검정과 F.I.R.S.T 원칙(빠른 검정, 독립 검정, 반복 가능, 자체 검증 및 적시)을 고려하면 독립 검정 원칙(테스트가 서로 종속되지 않음)을 위반할 수 있습니다.
(항상은 아니지만) 대부분의 경우(적어도 지금까지 본 것 중 일부) 글로벌 변수를 갖는 것은 결과를 준비하고 다른 기능에 전달하는 것입니다.이것은 이 원칙에도 위배됩니다.글로벌 변수가 그런 방식으로 사용된 경우(즉, 함수 X에 사용된 글로벌 변수를 함수 Y에 먼저 설정해야 함), 유닛 테스트 함수 X에 대해 먼저 테스트/실행 함수 Y를 실행해야 함을 의미합니다.
상수로서의 전역
반면에 다른 사람들이 이미 언급했듯이 글로벌 변수가 "상수" 변수로 사용되면 언어가 상수를 지원하지 않기 때문에 약간 더 나을 수 있습니다.하지만 저는 항상 수업과 함께 일하고 "상수"를 수업 구성원으로 두는 것을 선호하며 글로벌 변수를 전혀 사용하지 않습니다.두 개의 다른 클래스가 글로벌 변수를 공유하는 데 필요한 코드가 있는 경우 솔루션을 재팩터링하고 클래스를 독립적으로 만들어야 합니다.
저는 글로벌이 사용되어서는 안 된다고 생각합니다.그러나 이러한 코드를 사용하는 경우 작성자는 보다 깨끗하고 거의 버그가 없는 코드를 위해 몇 가지 원칙(위에서 언급한 것과 다른 소프트웨어 엔지니어링 원칙 및 모범 사례)을 고려해야 합니다.
그것들은 필수적이며, 화면이 좋은 예입니다.그러나 멀티스레드 환경이나 많은 개발자가 관련된 환경에서는 실제로 누가 (불규칙하게) 설정하거나 삭제했는지에 대한 질문이 종종 발생합니다.아키텍처에 따라 분석 비용이 많이 들고 종종 필요할 수 있습니다.글로벌 변수를 읽는 것은 괜찮지만, 단일 스레드 또는 스레드 세이프 클래스와 같이 글로벌 변수에 대한 쓰기를 제어해야 합니다.따라서 글로벌 변수는 그 자체가 사악한 것으로 간주되는 결과로 인해 발생할 수 있는 높은 개발 비용에 대한 두려움을 야기합니다.따라서 일반적으로 글로벌 변수의 수를 낮게 유지하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/19158339/why-are-global-variables-evil
'programing' 카테고리의 다른 글
| 반환 매개 변수를 사용하여 최대 절전 모드에서 오라클 함수를 호출하는 방법은 무엇입니까? (0) | 2023.06.27 |
|---|---|
| 새 스레드에서 간단한 코드를 실행하려면 어떻게 해야 합니까? (0) | 2023.06.27 |
| 유형 스크립트에서 값으로 지도를 "필터링"할 수 있습니까? (0) | 2023.06.27 |
| Vuex 스토어에서 매개 변수를 사용하여 시작할 때 구성 요소에서 데이터 가져오기 (0) | 2023.06.27 |
| 피드 및 팔로우 시스템을 구성하는 방법은 무엇입니까? (0) | 2023.06.27 |