首先,这是一个设计问题,而不是一个问题:
我有一个用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方法。或者有更好的方法吗?
我想知道你的意见。
提前致谢。
答案 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();
}
这很好,因为您可以将模拟对象传递给单元测试中的步骤对象。