2014-05-09 2 views
0

* .xml 파일에서 설정을로드하는 구성 관리자 클래스를 C++ 11에서 구현하려고합니다.응용 프로그램 설정 관리를위한 C++ 11 클래스

ConfigManager confManager; 
confManager.initialize(); 
confManager.load(); 
auto& coreSettings = confManager.get<CoreSettings>(); 
coreSettings.windowOptions_.height_ = 800; 
confManager.save(); 

더 간단한 구현이 될 것이다 :이 클래스를 사용하는 나에게 다음과 같은 코드를 작성할 수 있습니다 것

struct ConfigManager 
{ 
    ConfigManager(){} 

    void initialize() 
    { 
     add<CoreSettings>(std::make_unique<CoreSettings>("WhatEver.xml")); 
    } 

    template <typename T> 
    void add(std::unique_ptr<T> settings) 
    { 
     settings_.insert(std::make_pair(std::type_index(typeid(T)), std::move(settings))); 
    } 

    template <typename T> 
    T& get() const 
    { 
     auto it = settings_.find(std::type_index(typeid(T))); 
     return dynamic_cast<T&>(*it->second); 
    } 

    void load() 
    { 
     for (auto& s : settings_) 
      s.second->load(); 
    } 

    void save() 
    { 
     for (auto& s : settings_) 
      s.second->save(); 
    } 

    std::map<std::type_index, std::unique_ptr<ISettings>> settings_; 
}; 

: 첫 번째 구현은 (내가 대신에만 쉽게 테스트를위한 클래스 구조체를 사용) :

struct ConfigManager : public IConfigManager 
{ 
    ConfigManager() 
    { 
     set_.insert(&coreSettings_); 
    } 

    virtual void load() final 
    { 
     for (auto& s : set_) 
      s->load(); 
    } 

    virtual void save() final 
    { 
     for (auto& s : set_) 
      s->save(); 
    } 

    virtual CoreSettings& getCoreSettings() final 
    { 
     return coreSettings_; 
    } 

    CoreSettings coreSettings_; 
    std::set<ISettings*> set_; 
}; 

그러나이 방법은 내가 만들 모든 설정에 대해 많은 getter를 작성해야합니다.

더 나은 이유는 무엇이며 그 이유는 무엇이라고 생각하십니까? 어쩌면 이것이 어떻게 이루어져야하는지 전혀 아닙니다. 당신의 의견은 높이 평가됩니다.

+0

나는 이것이 http://codereview.stackexchange.com/에서 더 잘 어울릴 것이라고 생각한다. –

답변

1

모든 설정 유형을 사전에 알 필요가 없기 때문에 옵션 # 1을 선호합니다. 그러나 적절한 설정을 찾을 수없는 상황 (즉, it == settings_.end())에 반응하려면 get()에 오류를 추가해야합니다.