用于传递大量参数的 C++ 设计模式

标签 c++ algorithm design-patterns function parameters

我有一个规模合理的类,它实现了几种逻辑相关的算法(来自图论)。大约需要 10-15 个参数作为算法的输入。这些不是由算法修改的,而是用于指导它的操作。首先,我解释了实现这一点的两个选项。我的问题是这样做的常用方法是什么(是否是这两个选项之一)。

我个人不喜欢在 N 很大时将这些值作为参数传递给函数,尤其是在我还在开发算法的时候。

void runAlgorithm(int param1, double param2, ..., bool paramN);

相反,我有一个包含算法的类 Algorithm,并且我有一个包含这些参数的结构 AlgorithmGlobals。我要么将此结构传递给:

void runAlgorithm(AlgorithmGlobals const & globals);

或者我在类中添加一个公共(public)的 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 不是私有(private)的,因为它们可以在调用 runAlgorithm() 函数之前自由修改。没有必要“保护”它们。

最佳答案

这被称为 "Parameter object" pattern ,这通常是一件好事。我不喜欢成员(member)版,特别是称它为“XGlobals”并暗示它在各地共享。相反,参数对象模式通常涉及创建参数对象的实例并将其作为参数传递给函数调用。

关于用于传递大量参数的 C++ 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5551640/

相关文章:

algorithm - Blockwise Non Local Means降噪算法的伪代码

java - 创建Factory来创建领域对象的正确方法

c# - 实现存储库模式的正确方法是什么?以及如何使用它?

c++ - 在 block 之间存在间隙的 block 中存在键的情况下使用什么数据结构?

c# - 创建 C# 绑定(bind)

c++ - (bool)(i & 1) 和 i % 2 == 1 相同吗?

c++ - 根据位数集计算组合

c++ - QException 的目的是什么?

algorithm - Dijkstra 算法属性

design-patterns - Windows 服务的六边形架构/端口和适配器架构。正确的路?