настройка существующего приложения, написанного на C ++ - PullRequest
0 голосов
/ 15 февраля 2012

Прежде всего, это вопрос дизайна, а не проблема:

У меня есть приложение, написанное на C ++.

Структура выглядит следующим образом:

class Step1
{
    public:
      Step1();
      void process();
      void setValue(int v); // is to change the value
    private:
      int value;
}

class Step2
{
    public:
      Step2();
      void process();
      void setValue(int v); // is to change the value
    private:
      int value;
}

void main()
{
    Step1 step1();
    Step2 step2();

    step1.setValue(1);
    step2.setValue(2);

    step1.process();
    step2.process();
}

Мне разрешено изменять текущую архитектуру, но необходимо настроить все шаги извне. Я предлагаю создать XML-файл, содержащий параметры конфигурации:

<?xml version="1.0"?>
<Steps>
   <Step id="step1">
      <param method="setValue" variable="v" value="1" />
   </Step>
   <Step id="step2">
      <param method="setValue" variable="v" value="2" />
   </Step>
</Steps>

А потом я добавлю класс для разбора XML-файла:

класс XmlParser { общественности: XmlParser (); int parse (строка xmlFile, строка paramValue); }

тогда я думаю, что я изменю только основной класс:

void main()
{
    Step1 step1();
    Step2 step2();

    XmlParser xmlParser();

    step1.setValue(xmlParser.parse(,));
    step2.setValue(xmlParser.parse(,));

    step1.process();
    step2.process();
}

У меня более 20 шагов, и на каждом шаге нужно настроить около 10 методов. Является ли хорошей идеей изменить архитектуру таким образом, чтобы класс XmlParser проанализировал файл xml и передал значения заданным методам шагов. Или есть лучший способ сделать это?

Мне бы хотелось узнать ваше мнение.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Я уже сталкивался с этой проблемой, и я сделал нечто подобное.Я думаю, что это самое разумное решение.За создание и настройку экземпляра ваших классов обработки (в вашем примере Steps) должна отвечать ваша основная подпрограмма / класс.

Одной из проблем является синтаксический анализ XML, вы можете изменить текущий исходный код в беспорядок.Чтобы предотвратить это, вы должны создать некоторый класс «Configuration», который отвечает за синтаксический анализ, обработку ошибок и значения по умолчанию ваших настроек.

Простой пример интерфейса класса конфигурации:

class Configuration {
public:
    // basic configuration
    Configuration();
    // parsing, DTD validation
    void parse(const std::string& filename);
    // get some value
    // you can provide default value if necessary
    // or you can have some more robust accessing methods
    // depends on complexity of your settings
    int getSomeValue(int default);
    ...
};

Основная подпрограмма не заполнена синтаксическим анализом:

void main()
{
    Configuration config;
    config.parse("path/to/config.xml");

    Step1 step1();
    Step2 step2();

    int someValue = config.getValue(5);
    step1.setSomeValue(someValue);
    ...

    step1.process();
    step2.process();
    ...
}
0 голосов
/ 15 февраля 2012

Используйте какой-то ввод зависимости .

Если вы решите передать XmlParser объектам Step, ваш пример будет выглядеть так:

int main()
{
    XmlParser xmlParser();

    Step1 step1( xmlParser );
    Step2 step2( xmlParser );


    step1.setValue();
    step2.setValue();

    step1.process();
    step2.process();
}

Это хорошо, потому что вы можете передавать фиктивные объекты шаговым объектам в своих модульных тестах.

...