2010-05-05 3 views
6

작성한 대부분의 프로그램은 시작 및 종료가 정의 된 비교적 흐름 상 가능한 프로세스입니다. 문제 자체는 복잡 할 수 있지만 객체 및 이벤트 중심 프로그래밍의 중앙 사용으로 쉽게 향하지 않습니다. 종종 나는 다양한 텍스트 데이터를 생성하기 위해 여러 가지 일괄 처리 된 텍스트 데이터를 간단히 채취하고 있습니다. 가끔씩 클래스를 만들어야합니다. 예를 들어, 경고, 오류 및 디버깅 메시지를 추적하기 위해 단일 인스턴스 디자인 패턴의 예가 될 하나의 인스턴스화 (myErr) 클래스 (Problems)를 만들었습니다 . 다른 요소로서, 제 동료들은 제가보다 오래된 학교 (절차 적)이며 객체 지향 프로그래밍에 익숙하지 않으므로 그들이 수수께끼를 풀 수없는 것을 만들지 않으려합니다.전역 변수 사용 최소화로 어려움을 설명하십시오.

그럼에도 불구하고, 전역 변수가 좋지 않기 때문에 싱글 톤 디자인 패턴조차도 실제로는 패턴이 아니며 피해야한다고 들었습니다.

사소한 기능은 전달할 인수가 거의 필요 없으며 구성 (변경되지 않음) 또는 프로그램 상태 (변경)를 알 필요가 없습니다. 동의합니다. 그러나 주로 프로그램 흐름을 제어하는 ​​체인의 중간에있는 기능에는 많은 수의 구성 변수와 일부 프로그램 상태 변수가 필요합니다. 나는 함수에 따라 12 가지 이상의 주장을 전달하는 것이 "해결책"이라고 생각하지만, 매력적인 것은 아니다. 물론 변수를 단일 해시/딕트/연관 배열로 밀어 넣을 수는 있지만 그건 부정 행위처럼 보입니다.

예를 들어 Active Directory에 연결하여 새 계정을 만들려면 관리 사용자 이름, 암호, 대상 OU, 기본 그룹, 도메인 등의 구성 변수가 필요합니다. 이러한 인수를 전달해야합니다. 그것들을 사용하지 않는 다양한 기능을 통해, 실제로 그들을 필요로하는 기능으로 결국 이어질 체인을 통해 내려 버립니다.

적어도 구성 변수를 보호하기 위해 상수로 선언 하겠지만 요즘에는 (파이썬) 요즘의 선택 언어가 간단한 방법을 제공하지 않지만 조리법은 대안으로 존재합니다.

왜 스택 오버플로가 많이 발생 했나요? 악의와 필연적 인 가려움을 말하지만이 준 종교적 제한으로 생활하는 데 필요한 조언은 자주 언급하지 않습니다. 글로벌 변수와 프로그램 상태 문제를 어떻게 해결 했습니까? 아니면 최소한 평화롭게 만들었습니까? 어디서 타협 했니? 기능에 대한 논쟁의 무리를 누르는 것 외에 당신의 속임수는 무엇입니까?

+0

좋은 질문 - 클래스 수준 변수 (구성원)를 전역 변수로 분류하고 있습니까? –

답변

5

싱글 톤 패턴이나 비슷한 상황에 시간과 장소가 있다고 생각합니다. 기억해야 할 핵심 포인트는 시간과 시간을 다시 요구하는 것입니다. 많은 사람들은 싱글 톤 패턴뿐만 아니라 글로벌/공유/정적 변수를 사용하는 "잘못된"선택에 관해서는 특별한 공포를 경험했습니다.

구체적인 경우 구성에 대해 이야기하고 있습니다. 이러한 구성 항목에 대한 액세스에 싱글 톤 스타일 패턴을 사용해도 아무런 해가 없습니다. 모든 응용 프로그램에는 구성이 있으므로 그냥 호출 할 수있는 위치에 있어야하며 주변을 지나칠 필요가 없으며 그 이상으로 복잡합니다.

여기서 중요한 것은 정보가 한 번만 존재해야한다는 사실을 확인하는 것입니다. 설정은이 유형의 패턴을 사용하는 가장 좋은 이유 중 하나입니다.

3

변경되지 않거나 잘 정의 된 프로세스 차원의 개체 (예 : 로깅) 인 글로벌 데이터는 일반적으로 전역 데이터로 사용할 수 있습니다. 특히 로컬 파일에있는 구성 데이터는 동일한 범주에 속합니다 (로깅과 마찬가지로 전체 프로세스/응용 프로그램에 대해 하나의 파일 만 있음).

일반적으로 다른 인수를 다른 함수로 전달하기 위해 추가 인수를 전달해야하는 경우 해당 함수를 "위로"가져 와서 다른 함수를 중재해야합니다. 더 실용적인 또 다른 방법은 테스트 중심 개발 방식입니다. 종속성을 넘겨 주어야하기 때문입니다.

또 다른 생각은 다음과 같습니다. 해당 기능이 하위 기능을 호출하기위한 모든 세부 사항을 쉽게 알 수 없으면 하위 기능을 끌어 올리고 더 높은 수준의 지식이 필요한 계층을 강제로 가져와야합니다 정보. 모 놀리 식 짐승 대신 구획화 된 조각을 만들기 때문에이 기술이 코드 품질에 매우 전도성이 있다는 것을 발견했습니다. Active Directory에 대한 예에서

대신 ad_connect에 인수 주위에 전달하는, 필요한 로직을 처리하는 개체 주위에 합격 한 후 그것을

를 사용하여 해당 객체와 함수 사이의 상호 작용을 매개하는 기능을 가지고
def create_user(name, ad_user, ad_pass, ad_ou, ...): 
    conn = ad_connect(ad_user, ad_pass, ...) 
    conn.CreateRecord(ad_user) 

def create_user_mediator(name, ad_controller): 
    ad_controller.CreateRecord("cn=%s" % name) 

그 방법 중 하나 일뿐입니다. 물론 장단점이 있습니다. create_user이 전역 변수를 사용하지 않아도되는 방법의 예에 불과합니다.