我有一个大小适中的类,可以实现几种与逻辑相关的算法(来自图论)。大约需要10-15个参数作为算法的输入。这些没有被算法修改,但是被用来指导它的操作。首先,我解释了实现此目标的两个选项。我的问题是执行此操作的常用方法是什么(无论是否是两个选项之一)。
我个人不喜欢在N较大时将这些值作为参数传递给函数,尤其是在我仍在开发算法的时候。
N
void runAlgorithm(int param1, double param2, ..., bool paramN);
相反,我有一个Algorithm包含算法的类,而我有一个AlgorithmGlobals包含这些参数的结构。我要么将此结构传递给:
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()调用函数之前自由修改它们。无需“保护”它们。
runAlgorithm()
这称为“参数对象”模式,通常是一件好事。我不喜欢会员版本,特别是将其称为“ XGlobals”,并暗示它在所有地方都共享。相反,参数对象模式通常涉及创建参数对象的实例并将其作为参数传递给函数调用。