3

대규모 응용 프로그램 프로젝트가 있다고 가정하면 코드는 CBaseSubsystem에서 파생 된 클래스로 구현 된 다양한 서브 시스템으로 분할됩니다. 여기C++ : 프로그램 하위 시스템을 구성하는 올바른 방법은 무엇입니까?

이미 내 첫 번째 질문에 온다 : 그것은 클래스 [기본 클래스에서 파생]로 서브 시스템을 구성하는 것이 좋습니다

  • 인가가?

그런 다음 하위 시스템 클래스가 있습니다. 이제, 어딘가에 인스턴스를 생성해야합니다. 그러나 어디에서? extern CEventSystem* g_EventSystem;


  • 이 인스턴스가 실제로 작성해야합니다 :

    • 는 예를 들어 전역 변수에 저장된 모든 서브 시스템 인스턴스를 가질 수있는 좋은 아이디어인가? 모두 함께 main()와 같은 함수에 있습니까?

    • 전역 변수를 완전히 피하고 인스턴스를 CSubsystemManager 클래스로 구성하는 것이 더 좋습니까?

    • 싱글 톤 클래스를 사용하는 것이 적절한 방법입니까?

  • 답변

    0

    각 서브 시스템의 인스턴스에 액세스 할 수있는 방법이 필요하면, 내가 "통근"사용하지 않는 대신 당신이 CSubsystemManager의 인스턴스에 액세스 할 수 있습니다 싱글로 갈 것입니다. 관리자는 서브 시스템 객체를 인스턴스화하고 관리 할 수 ​​있습니다.

    +0

    하지만 하나의 하위 시스템이 다른 시스템과 통신하기를 원할 때마다 하위 시스템 관리자를 통해 다른 시스템을 "찾아야"합니다. 문제가되지 않습니까? – Jarx

    +0

    조회 기능이 얼마나 비싼 지에 따라 다릅니다. 각 하위 시스템 유형에 대해 enum 값을 정의 할 수있는 int로 인덱싱 된 벡터에 하위 시스템 인스턴스를 저장할 수 있습니다. 또는 개체 구성에 대한 관련 하위 시스템의 조회를 수행하고 클래스 변수에 참조를 저장할 수 있습니다. 그렇게하면 한 번만 조회 할 수 있습니다. – Stephan

    +0

    후자는 합리적인 해결책처럼 들립니다. 예, 감사합니다. – Jarx

    0

    구체적인 질문을 제시하는 대신 이론을 말하고 싶다면 FactorySingleton의 조합으로 디자인을 고려하여 Strategy의 가능성이있는 하위 시스템에서 다양한 개체 유형의 범위에 대해 유사한 작업을 구현할 수 있습니다.

    주요 하위 시스템 공장 자체는 그 목적이 분명하기를 바랍니다. lazy evaluation을 사용하여 필요한 서브 시스템 오브젝트 만 필요에 따라로드 할 수있게하십시오. 각 서브 시스템에 더 이상 필요하지 않을 때 h 제할 수있는 참조 카운트 메커니즘을 제공하는 것이 좋습니다. 일부 서브 시스템은 그 자체로 싱글 톤이 될 수도 있고/또는 다양한 유형의 클래스에 대해 특정 서비스를 제공하기위한 전략 패턴을 구현할 수도 있습니다. 이 서비스는 예를 들어 유효성 검사, 렌더링, 직렬화 등일 수 있습니다.

    이 방법으로 응용 프로그램을 빌드하는 것이 "좋은 아이디어"인지 여부에 대한 가치 판단은 제가 말하는 것이 아닙니다. 오히려 더 오래된 지혜가 그것에 말하게 할 것입니다.

    1

    this과 매우 유사합니다. Singleton을 피할 것입니다. 왜냐하면 여기서는 절대적으로 불필요하며 many other issues을 가져 오기 때문입니다.

    메인과 같은 루틴으로 인스턴스를 작성하십시오. 무언가가 시스템을 필요로한다면, 그 시스템에 대한 액세스를 제공하는 컨테이너 또는 컨테이너 (IE : CSubSystemManager)에 직접 전달되는 매개 변수 등의 수단을 통해 액세스를 제공하십시오. CSubSystemManager를 작성하는 데까지 갈 필요는 없습니다.

    글로벌 상태를 피하십시오. 오명이있는 이유가 있습니다.

    +0

    +1 글로벌 상태의 위험을 강조하고 싱글 톤 안티 패턴을 방해. – mavam

    0

    내 솔루션은 싱글 톤 레지스트리, AbstractFactory 및 Factory의 콤보를 만듭니다.

    //in base module 
    
    class ISubsystem{} //an interface for a subsystem 
    
    //in module code 
    Registry::instance()->registerFactory("subsystem1",new Subsystem1Factory()); 
    
    //in user code 
    IFactory* factory = Registry::instance()->getFactory("subsystem1"); 
    ISubsystem* subsystem = factory->createObject(...); //you can implement whatever policy in factory impl. (like singleton etc.) 
    
    관련 문제