2013-04-15 8 views
9

파이썬 문서 및 다양한 메일 링리스트를 읽을 때 나는 항상 교리 적으로 보이는 것을 읽습니다. 글로벌 변수는 지옥과 같이 피해야합니다. 디자인이 좋지 않습니다 ... 좋습니다. 왜 안 되니? 그러나 그러한 패턴을 피하는 방법이없는 현실적인 상황이 있습니다.전역 변수를 피하는 방법

주 메뉴에서 여러 파일을로드 할 수있는 GUI가 있다고 가정 해보십시오. 로드 된 파일에 해당하는 파일 객체는 모든 GUI (예 : 이미지를 표시하고 다양한 대화 상자/플러그인을 통해 다양한 작업을 수행 할 수있는 이미지 뷰어)를 사용하여 사용할 수 있습니다. >로드 된 파일 개체를 사용할 수 있습니다 -

  • Main.py는
  • > 파일이 여기에서로드됩니다 -

    • Menu.py을 :

      는 다음과 같은 설계를 구축 정말 뭔가 문제가 있습니까 여기
    • Dialog1.py -> 또는 여기
    • Dialog2.py -> 또는이
    • Dialog3.py -> 또는이
    • ...
    • Globals.py Globals.py 키로드 된 파일과 값에 해당하는 파일 객체의 이름입니다 사전을 저장합니다

    . 그런 다음, 그 데이터를 필요로하는 코드의 다양한 부분이 약한 참조를 통해 액세스합니다.

    미안 내 질문에 어리석은 것처럼 보일 수도 있지만 우아하고 포괄적 인 대안이 보이십니까? 한 가지 방법은로드 된 데이터 딕셔너리를 Main.py의 메인 애플리케이션 클래스에 캡슐화하는 것입니다. 그러나이 클래스는 데이터를 필요로하는 모든 대화 상자에서 쉽게 액세스 할 수 있어야하기 때문에 몇 가지 문제가 발생할 수 있습니다.

    은 코드 재사용을 억제하기 때문에

    +1

    전역 변수가 악의가 없습니다. 악의는 그것을 가변 변수로 사용하고 있습니다. 전역 변수는 가능할 때마다 정적이고 "불변"상태를 유지해야합니다. globals.py에서 사전 내용을 변경해야한다면 좋지 않습니다. 그 외, 독서는 괜찮습니다. – CppLearner

    +0

    예, 글로벌 "상수"는 괜찮습니다. 글로벌 "변수"는 피해야합니다. – monkut

    +1

    그래, 둘 다 무슨 뜻인지 알 겠어.로드 된 데이터 딕셔너리가 시간 (새로운로드 된 파일, 삭제 된 파일)을 통해 진화 할 수있는 제안 된 디자인 대신 유효한 파이썬 대안을 보지 못한다. – Eurydice

    답변

    11

    글로벌 변수는 피해야한다 당신의 도움을 많이 감사합니다. 여러 개의 위젯/응용 프로그램이 동일한 기본 루프 내에서 잘 살 수 있습니다. 이것은 당신이 생각한 것을 하나의 GUI로 요청하여 그러한 GUI를 생성하는 라이브러리로 추상화 할 수 있습니다. 그래서 (예를 들어) 단일 실행기가 동일한 프로세스를 공유하는 여러 최상위 GUI를 시작할 수 있습니다.

    전역 변수를 사용하는 경우 여러 GUI 인스턴스가 서로의 상태를 넘어 서기 때문에 불가능합니다.

    전역 변수의 대안은 필요한 속성을 최상위 위젯에 연결하고 동일한 최상위 위젯을 가리키는 하위 위젯을 만드는 것입니다. 그런 다음 예를 들어, 메뉴 작업은 최상위 위젯을 사용하여 현재 열려있는 파일을 조작하여 작동합니다.

    +0

    나는 정적 멤버 변수/속성 (그러나 상수, 읽기 목적의 경우 다시 인스턴스 속성 일 필요는 없음). 그러나 요구 사항에 따라 몇 가지 상수를 갖는 것은 그렇게 나쁘지 않습니다. 사람들이 파이썬이 할 수있는 일과 할 수없는 일을 이해했는지 확인하십시오 : p – CppLearner

    +0

    내가 맞으면,로드 된 데이터 딕셔너리가 루트 최상위 위젯의 속성으로 저장되는 일종의 트리와 같을 것입니다. 그런 다음 애플리케이션의 모든 위젯은 'topLevelParent'메소드 호출을 통해 애플리케이션에 액세스 할 수 있습니다. – Eurydice

    +0

    파일 이름과 최상위 레벨 데이터를 저장하는'MainModel'을 가질 수 있습니다. QT를 사용하면 메인 윈도우가 생기고 파일 이름과 최상위 데이터를 저장하게됩니다. 파일 열기 및 쓰기 이벤트는 일반적으로 최상위 레벨 오브젝트에서 처리되고 하위 레벨 오브젝트는 파일 이름을 알 필요가 없습니다. – Eike

    -1

    나는 하나 이상의 클래스에 데이터를 캡슐화하고 이러한 클래스에 대한 borg 패턴을 구현하여 전역 데이터를 관리합니다. Why is the Borg pattern better than the Singleton pattern in Python

    +1

    Borg 패턴을 광고하지 마십시오. 싱글 톤의 요점은 ** 싱글 ** 인스턴스를 가지므로 메모리를 절약하고 동일한 동작을 보장한다는 것입니다. 서로 다른 하위 클래스에 다른 인스턴스가 실제로 필요한 경우, 클래스 당 하나의 인스턴스를 갖는 기본 Singleton 요구 사항을 손상시키지 않고이를 수행 할 수있는 방법이 있습니다. – user4815162342

    +3

    Borg도 Singleton 패턴도 전역 변수의 주된 문제를 완화하지 않습니다. 단일 전역 상태라는 것입니다. 실제로, 싱글 톤 패턴은 공유 된 글로벌 상태에 대한 단순한 OO 스타일의 인터페이스 일 뿐이며, 정확하게 OP가 피할 수있는 문구가 무엇인지 정확하게 설명하지는 않습니다. – user4815162342

    +1

    실용적인 접근법을 선호합니다 : 전역 변수 일명 싱글 톤 보그 패턴은 코드가 읽고 쓰는 경우에만 위험합니다. 글로벌 로거 (모든 클라이언트 작성)는 위험하지 않으며 데이터베이스 연결 풀 (모든 클라이언트 읽기)은 위험하지 않습니다. 개발자가 책을 따라하지만 backgound를 잊지 않아도 괜찮습니다. – rocksportrocker

    관련 문제