配置用C ++编写的现有应用程序

时间:2012-02-15 08:47:48

标签: c++ xml parsing architecture xml-parsing

首先,这是一个设计问题,而不是一个问题:

我有一个用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(string xmlFile,string 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文件并将值传递给步骤的set方法。或者有更好的方法吗?

我想知道你的意见。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我已经遇到过这个问题而且我做了类似的事情。我认为这是最合理的解决方案。对于创建和设置处理类的实例(步骤,在您的示例中)应该负责您的主子例程/类。

一个问题是解析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();
    ...
}

答案 1 :(得分:0)

使用某种dependency injection

如果您决定将XmlParser传递给Step对象,那么您的示例将如下所示:

int main()
{
    XmlParser xmlParser();

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


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

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

这很好,因为您可以将模拟对象传递给单元测试中的步骤对象。

相关问题