首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于传递大量参数的C++设计模式

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

Stack Overflow用户
提问于 2011-04-05 20:16:22
回答 6查看 5.7K关注 0票数 19

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

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

代码语言:javascript
复制
void runAlgorithm(int param1, double param2, ..., bool paramN);

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

代码语言:javascript
复制
void runAlgorithm(AlgorithmGlobals const & globals);

或者我向类中添加一个公共AlgorithmGlobals实例:

代码语言:javascript
复制
class Algorithm {
public:
    AlgorithmGlobals globals;
    void runAlgorithm();
}

然后在其他地方,我会这样使用它:

代码语言:javascript
复制
int main() {
    Algorithm algorithm;
    algorithm.globals.param1 = 5;
    algorithm.globals.param2 = 7.3;
    ...
    algorithm.globals.paramN = 5;

    algorithm.runAlgorithm();

    return 0;
}

请注意,AlgorithmGlobals的构造函数为每个参数定义了良好的默认值,因此只需要指定具有非默认值的参数。

AlgorithmGlobals不是私有的,因为在调用runAlgorithm()函数之前可以自由地修改它们。没有必要“保护”他们。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-04-05 20:19:31

这就是所谓的"Parameter object" pattern,这通常是一件好事。我不喜欢它的成员版本,特别是称它为"XGlobals“,并暗示它在各地都是共享的。Parameter对象模式通常需要创建Parameter对象的实例,并将其作为参数传递给函数调用。

票数 12
EN

Stack Overflow用户

发布于 2011-04-05 20:23:05

其他人提到了参数对象,但还有另一种可能性:使用。

Builder允许您省略默认值合适的参数,从而简化您的代码。如果您要将算法与几组不同的参数一起使用,这将特别方便。OTOH它还允许您重用相似的参数集(尽管存在无意重用的风险)。这(与方法链接一起)将允许您编写如下代码

代码语言:javascript
复制
Algorithm.Builder builder;

Algorithm a1 = builder.withParam1(1).withParam3(18).withParam8(999).build();
...
Algorithm a2 = builder.withParam2(7).withParam5(298).withParam7(6).build();
票数 8
EN

Stack Overflow用户

发布于 2011-04-05 20:38:59

你有几个不同的想法,你应该在你的设计中提出:

  1. 参数是纯粹的输入。
  2. 参数是特定于您的算法的。
  3. 参数的默认值是正常的。

代码语言:javascript
复制
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 &params) : params_(params) { }

    void run();

  private:
    const Parameters params_; // Paramaeters don't change while algorithm
};                            // is running. 

这就是我的建议。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5551640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档