我编写了一个C++模型,其中包含输入,输出和内部变量。在本例中,输入是样本流 x[n]。输出和内部变量也是示例流。我将这个版本的代码称为"黄金参考"。
我还想到了一些我想尝试的代码优化。我称这个版本的代码为"实验性的"。但我想确保任何更改都不会破坏代码。也就是说,实验代码的输入、输出和一些内部变量与黄金引用的输入、输出和一些内部变量相匹配。
因此,对于示例流输入,我想检查实验代码输入、输出和内部变量是否与黄金引用匹配。
但是我正在尝试考虑一种代码/构建结构,该结构将允许我同时运行两个版本,而对文件名,类名等进行最少的更改。
到目前为止,在我看来,最简单的解决方案是编辑实验代码库中的每个文件并重命名命名空间和 #include 路径。有没有更好的解决方案不需要大量重命名?
由于模板等原因,大多数代码驻留在头文件中。
// Golden src/top.h
#include "src/sub1.h"
#include "src/sub2.h"
namespace model {
class Top {
public:
Sub1 sub1;
Sub2 sub2;
Var var;
Var process(Var x) {
var = sub1.process(x);
return sub2.process(var);
}
};
}
// Experimental src_expr/top.h
#include "src_expr/sub1.h" // Have to edit include paths!
#include "src_expr/sub2.h"
namespace model_expr { // Have to rename namespaces!
class Top {
public:
Sub1 sub1;
Sub2 sub2;
Var var;
Var process(Var x) {
var = sub1.process(x);
return sub2.process(var);
}
};
}
// test.cpp
#include "src/top.h" // golden
#include "src_expr/top.h" // experimental
void test(std::vector<Var> xvec) {
model::Top top_gold;
model_expr::Top top_expr;
for (const auto& x : xvec) {
Var y_gold = top_gold.process(x);
Var y_expr = top_expr.process(x);
assert(y_gold == y_expr);
assert(top_gold.var == top_expr.var);
}
}
一种方法是使您的代码可模拟。
这意味着您提供一个接口并且只与之交互。 甲基离子尽可能纯净(包括作为输入和输出的对象(。 您可以通过可模拟的工厂对象创建实例。
然后编写一个接口的实现,用于创建两个版本,比较它们的输出,如果它们不同,则出错,并在外部表现得像其中一个版本。
可悲的是,这可能需要大量的重构;理想情况下,你在编写第一个版本之前就这样做了。