Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Системный анализ, проектирование и UML > Инициализация компонентов программы. Общий подход.


Автор: shizoid 5.9.2013, 14:05
Практически любое приложение, должно инициализировать свои компоненты. Столкнулся в своей практике с задачей загрузки настроек из json формата и инициализацию компонент приложения. В ходе работы изобрел нечто похожее на паттерн Строитель, если я не ошибаюсь. Суть в том ко всем компонентам есть класс Configurator(Builder), который знает как извлечь необходимую информацию из json объекта и , если потреубется изменить формат(например  xml) - добавлю новый класс конфигуратор, если изменится логика в документе - внесу изменения в класс конфигуратор. Примеры на С++.
Код

class ComponentBase{
public:
    ComponentBase(const int param1=0);            //Конструктор отвечает за логику класса
    int GetParam() const;                        //геттер
    void SetParam(const int val);                      //Установка параметров
    void DoSome();                                //логика
private:
    int m_param1;
};

class JSONConfigurator:public ConfiguratorBase{
public:
    JSONConfigurator(const JSON::Object* obj);
    void Configure(ComponentBase& component) throw (std::logic_error); //вывалит эксепшен если настроить компонент не получится 
private:
    shared_ptr<JSON::Object> m_cfg_data;
};

class XMLConfigurator:public ConfiguratorBase{
public:
    XMLConfigurator(const XML::Node* obj);
    void Configure(ComponentBase& component) throw (std::logic_error); //вывалит эксепшен если настроить компонент не получится 
private:
    shared_ptr<XML::Node> m_cfg_data;
};


 Но мой коллега заявил, что лучше реализовать инициализацию из JSON или любого другого формата в конструкторах класса. Я считаю, что в этом случае компонент нагружается лишним функционалом, за который он ответственности нести не должен, но у аргументированно убедить в плюсах моего подхода тоже не смог. 
Пример:

Код



class ComponentBase{
public:
    ComponentBase(const int param1=0);            //Конструктор отвечает за логику класса
    ComponentBase(const JSON::Object* obj);    //Инициализация из json
    ComponentBase(const XML::Node* node);        //Инициализация из xml
    int GetParam() const;                        //геттер
    void SetParam(const int val);                //Установка параметров
    void DoSome();                                //логика
private:
    int m_param1;
};



Рассудите пожалуйста. Желательно книжку или статью какую-то привести.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)