我有一个大小合理的类,它实现了几个逻辑上相关的算法(来自图论)。大约需要10-15个参数作为算法的输入。这些不会被算法修改,而是用来指导算法的操作。首先,我解释了实现这一点的两种选择。我的问题是,什么是一种常见的方法(无论它是不是两个选项之一)。
我个人不喜欢在N很大的时候将这些值作为参数传递给函数,特别是在我还在开发算法的时候。
void runAlgorithm(int param1, double param2, ..., bool paramN);相反,我有一个包含算法的类Algorithm,还有一个包含这些参数的结构AlgorithmGlobals。我要么将此结构传递给:
void runAlgorithm(AlgorithmGlobals const & globals);或者我向类中添加一个公共AlgorithmGlobals实例:
class Algorithm {
public:
AlgorithmGlobals globals;
void runAlgorithm();
}然后在其他地方,我会这样使用它:
int main() {
Algorithm algorithm;
algorithm.globals.param1 = 5;
algorithm.globals.param2 = 7.3;
...
algorithm.globals.paramN = 5;
algorithm.runAlgorithm();
return 0;
}请注意,AlgorithmGlobals的构造函数为每个参数定义了良好的默认值,因此只需要指定具有非默认值的参数。
AlgorithmGlobals不是私有的,因为在调用runAlgorithm()函数之前可以自由地修改它们。没有必要“保护”他们。
发布于 2011-04-05 20:19:31
这就是所谓的"Parameter object" pattern,这通常是一件好事。我不喜欢它的成员版本,特别是称它为"XGlobals“,并暗示它在各地都是共享的。Parameter对象模式通常需要创建Parameter对象的实例,并将其作为参数传递给函数调用。
发布于 2011-04-05 20:23:05
其他人提到了参数对象,但还有另一种可能性:使用。
Builder允许您省略默认值合适的参数,从而简化您的代码。如果您要将算法与几组不同的参数一起使用,这将特别方便。OTOH它还允许您重用相似的参数集(尽管存在无意重用的风险)。这(与方法链接一起)将允许您编写如下代码
Algorithm.Builder builder;
Algorithm a1 = builder.withParam1(1).withParam3(18).withParam8(999).build();
...
Algorithm a2 = builder.withParam2(7).withParam5(298).withParam7(6).build();发布于 2011-04-05 20:38:59
你有几个不同的想法,你应该在你的设计中提出:
class Algorithm {
public:
class Parameters { // Nested class, these are specific to your algorithm.
public:
Parameters() : values(sensible_default) { }
type_t values; // This is all about the data.
};
Algorithm(const Parameters ¶ms) : params_(params) { }
void run();
private:
const Parameters params_; // Paramaeters don't change while algorithm
}; // is running. 这就是我的建议。
https://stackoverflow.com/questions/5551640
复制相似问题