OOP에서 글로벌 이 악한 이유는 많이 있습니다 .
공유가 필요한 객체의 수 또는 크기가 너무 커서 함수 매개 변수에서 효율적으로 전달할 수없는 경우 일반적으로 전역 객체 대신 의존성 주입을 권장 합니다.
그러나 거의 모든 사람이 특정 데이터 구조에 대해 알아야 할 경우 의존성 주입이 전역 객체보다 더 나은 이유는 무엇입니까?
예 (특정 응용 프로그램에서 너무 깊이 탐구하지 않고 일반적으로 요점을 보여주기 위해 단순화 된 것)
유형, 이름, 색상, 속도, 위치 등 수많은 속성과 상태를 가진 수많은 가상 차량이 있습니다. 많은 사용자가 원격으로 제어 할 수 있으며 수많은 이벤트 (사용자- 시작 및 자동)은 많은 상태 또는 속성을 변경할 수 있습니다.
순진한 해결책은 다음과 같이 전역 컨테이너를 만드는 것입니다.
vector<Vehicle> vehicles;
어느 곳에서나 액세스 할 수 있습니다.
보다 OOP 친화적 인 솔루션은 컨테이너를 기본 이벤트 루프를 처리하는 클래스의 멤버로 만들고 생성자에서 인스턴스화하는 것입니다. 그것을 필요로하고 메인 스레드의 멤버 인 모든 클래스에는 생성자의 포인터를 통해 컨테이너에 액세스 할 수 있습니다. 예를 들어, 외부 메시지가 네트워크 연결을 통해 들어 오면 구문 분석을 처리하는 클래스 (각 연결마다 하나씩)가 인계하고 구문 분석기는 포인터 또는 참조를 통해 컨테이너에 액세스 할 수 있습니다. 구문 분석 된 메시지로 인해 컨테이너의 요소가 변경되거나 조치를 수행하기 위해 일부 데이터가 필요한 경우 신호 및 슬롯을 통해 수천 개의 변수를 던질 필요없이 처리 할 수 있습니다. 파서를 호출 한 사람이 나중에 검색 할 수 있도록 파서에 저장). 물론 의존성 주입을 통해 컨테이너에 액세스하는 모든 클래스는 동일한 스레드의 일부입니다. 다른 스레드는 직접 액세스하지 않지만 작업을 수행 한 다음 주 스레드로 신호를 보내면 주 스레드의 슬롯이 컨테이너를 업데이트합니다.
그러나 대부분의 클래스가 컨테이너에 액세스 할 수 있다면 전역과 다른 점은 무엇입니까? 많은 클래스가 컨테이너에 데이터를 필요로하는 경우 "종속성 주입 방식"이 위장 된 전역이 아닌가?
하나의 대답은 스레드 안전성입니다. 전세계 컨테이너를 남용하지 않도록주의하더라도 마감일이 가까워지면 다른 개발자가 글로벌 컨테이너를 다른 스레드에서 사용할 수 있습니다. 충돌 사례. 그러나 의존성 주입의 경우에도 다른 스레드에서 실행중인 누군가에게 포인터를 제공하여 동일한 문제를 일으킬 수 있습니다.