【问题标题】:When using the builder pattern in C++, is it advisable for the setters to return a reference to the builder object?在 C++ 中使用构建器模式时,是否建议设置器返回对构建器对象的引用?
【发布时间】:2018-07-14 13:53:40
【问题描述】:

我正在考虑在 C++ 单元测试中使用构建器模式,以简化为正在测试的代码创建输入数据的过程。

在 Java 中,常见的习惯用法似乎是让构建器类的设置器返回(对)构建器对象本身的(引用),以便多个设置器可以链接在一行中。例如。 builder 类可以这样定义:

// class builder 
public class Builder
{
  private Part1 part1;
  private Part2 part2;
  public Builder withPart1(Part1 p1);
  public Builder withPart2(Part2 p2);
};

然后这样使用:

Builder b;
Part1 p1;
Part2 p2;
b.withPart1(p1).withPart2(p2);

在 C++ 中可以通过让设置器返回对构建器对象的引用来实现相同的效果。但是,我无法在网上找到任何这样的例子。这种“链接”是 C++ 中的常见做法吗?如果没有,那为什么不呢?

【问题讨论】:

  • 我认为我的问题更具体。您引用的问题似乎与一般使用 Builder 模式有关。我的是关于二传手的“链接”。但我确实得到了答案,所以谢谢!
  • 因为它是一个反成语,所以应该避免使用 getter 和 setter,因为它们会破坏封装;构造函数应该用于构造对象。
  • @Gene: 构建器对象有效地允许构造的命名参数。
  • @Gene,构建器模式的全部意义在于更容易创建具有复杂构造函数和大量参数的类的对象。这几乎不是一个反成语。并且 getter 和 setter 应该用于建立一个合理的策略来访问特定类的成员,而不是简单地避免。但这是一个单独的主题。
  • @Gene 如果你有一个类Rectangle,那么拥有像getWidth() 或getHeight() 这样的getter 是完全合理的。但是,您可能不会提供宽度和高度的设置器,而是提供 stretch() 和 shrink() 之类的函数。如果要显示您的矩形,它可能有一个数据成员color,它会有一个getter 和一个setter。这称为成员访问策略。有些数据成员是可读的,有些是可写的,有些是完全隐藏的。说“吸气剂是坏的”不是一个技术论点,而是一个宗教论点。

标签: c++ builder-pattern


【解决方案1】:

是的,这是一种常见的做法,它被称为“Fluent API”。

典型例子:

while ((std::cin >> std::setbase(16) >> i >> s).getline(s2)) { ... }

【讨论】:

  • 什么是常见的做法?链接运营商? ——必要时为什么不这样做;用二传手创建建设者? - 不是由一个长镜头;这简直是​​糟糕的设计。
  • @Gene:运算符和其他成员函数之间没有真正的区别(在我的示例中,getline 不是运算符)。我理解您对建设者的厌恶,但问题是“这种“链接”是 C++ 中的一种常见做法吗?并且显然流畅的链接很常见,即使构建器模式不是。
  • @Ben 为什么讨厌建筑商?我有很多单元测试,其中包含设置输入数据的复杂且大量重复的代码。使用构建器似乎是清理它的好方法。
  • @Ben -- 虽然操作符链很常见,但函数调用链闻起来很糟糕,可能表明存在设计问题,尤其是涉及到 setter 时。
  • @Gene:我最初在我的示例中包含了getline(并使用了它的返回值),专门用于反驳运算符链接很好但函数调用链接不好的论点。
猜你喜欢
  • 2018-11-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多