【问题标题】:Which one is more effective when building builders?在构建构建器时,哪一个更有效?
【发布时间】:2015-06-28 20:13:26
【问题描述】:

注意:所有构建器仅用于单元测试。

所以我一直在创建构建器,并且在创建它们时,我开始注意到其他一些已经到位的构建器遵循了一些不同的模式。

我想我在这里问哪个更有效。

我的做法是这样的:

public class Builder
{
    public Builders()
    {
        SetDefaults();
    }

    private void SetDefaults()
    {
       // Setting my defaults
    }
}

另一种方式:

public class Builder
{     
    public Builder WithDefaults()
    {
       // Setting my defaults
    }
}

在我看来,第一个更有效,因为您只需创建构建器,它会自动为您执行默认设置。

在另一种情况下,您必须在继续构建之前显式调用 WithDefaults 方法来设置所有默认值。

第二个似乎更容易出错,因为如果某些需要构建的对象没有设置所有字段,它们可能会抛出空异常。

也许我在这里遗漏了一些微妙的东西,所以我决定问你哪个更有效。

谢谢。

【问题讨论】:

  • 如果您必须调用“WithDefaults”,它们并不是真正的默认值,是吗?
  • @JonSkeet 说得很好,谢谢!
  • 好吧,如果我真的想为第二种方法找到一个专业人士,那就是这个:WithDefault 仍可用于将构建器属性重置为默认值....

标签: c# unit-testing default-value builder


【解决方案1】:

我想建议第三种选择。由于构建器应该通过以清晰而有意义的方式删除对象初始化来减少测试代码的数量 - 为什么声明您正在使用默认值? 它本身并没有说明实际默认值是什么,并且您有测试编写者忘记调用“WithDefaults”的风险。

看看this post for example on how it's done

而是使用构造函数来设置(存储它们的字段的)默认值,并且只有在明确要求时才更改它们。 这样,您就可以通过最少且有意义的构建器调用获得初始化对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2021-03-29
    • 2013-08-27
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多