我想知道将算法参数设置定义为独立类是否是一个好习惯。我用以下代码说明了我的问题:
using namespace std;
class Parameters
{
public:
Parameters():a_para_(0),b_para_(0) {};
~Parameters() {};
Parameters(const Parameters ¶)
{
a_para_ = para.a_para_;
b_para_ = para.b_para_;
}
void set_a_parameter(int a)
{
a_para_ = a;
}
void set_b_parameter(int b)
{
b_para_ = b;
}
private:
int a_para_;
int b_para_;
};
class Algorithm
{
public:
Algorithm() {};
~Algorithm() {};
void set(const Parameters ¶)
{
para_ = para;
}
void run()
{
}
private:
Parameters para_;
};
int main()
{
Parameters para;
para.set_a_parameter(3);
para.set_b_parameter(4);
Algorithm fun;
fun.set(para);
fun.run();
return 0;
}
背后的哲学是参数设置和算法实现可以分开。我和一位经验丰富的程序员讨论了这个设计策略,他似乎更喜欢将参数设置和算法混合在一起作为一个类。因此,我在这里写下你的建议:哪一个更好?谢谢!
答案 0 :(得分:2)
你的问题非常笼统,而且没有一般的答案。这取决于实际情况。
通常,您希望能够在编译时决定算法的参数(例如,给定缓冲区的大小,矩阵的维度或树节点的arity)。通常,这些参数在算法“实例”的生命周期内不会发生变化,可以这么说。在这种情况下,通常最好将算法类转换为模板,并将这些参数作为模板参数。
如果参数必须在算法生命周期内改变,但是它们的实现是微不足道的,则无需将它们外部化。如果它们非常简单,并且它们的实现细节可能会改变算法性能(例如:基于密集矩阵的数组的矩阵实现,或者稀疏矩阵的链接列表),那么我认为你可以外化该参数。
如果你想得到更好的答案,我想你应该问一个更具体的问题。