与对象初始化器相比,测试数据构建器模式的好处是什么?

本文关键字:模式 是什么 构建 测试数据 初始化 对象 | 更新日期: 2023-09-27 18:05:14

我一直在阅读一堆支持测试数据生成器模式优点的博客文章。这似乎是个好主意,但所有的帖子都是几年前的了。

当c#引入对象初始化时,它是否使测试数据生成器模式过时了?

在对象初始化之前,您需要使用以下代码来初始化person对象:

Person p = new Person("John", "Doe", "555-555-1234");

在当时,有一个构建器会像这样清理代码:

Person person = new PersonBuilder()
        .WithFirstName("John")
        .WithLastName("Doe")
        .WithPhoneNumber("555-555-1234");

现在有了对象初始化器,它看起来就像这样,而不需要编写任何构建器方法:

Person p = new Person() {FirstName="John", LastName="Doe", Phone="555-555-1234"};

在这个简单的示例中,似乎不需要构建器模式。我错过什么了吗?人们还在使用建造者模式吗?如果是这样,好处是什么?

与对象初始化器相比,测试数据构建器模式的好处是什么?

在很多情况下,你可以用对象初始化式来代替构造器。

然而,在一些情况下,构建器仍然是一个很好的选择。

不可变对象就是一个例子。Jon Skeets的protobuff实现是现实世界中不可变对象构建器模式的一个很好的例子。(https://codeblog.jonskeet.uk/2008/08/20/lessons-learned-from-protocol-buffers-part-1-messages-builders-and-immutability/)

Person john = new Person.Builder()
    .SetFirstName("John")
    .SetLastName("Doe")
    .Build(); //creates an immutable person

其他情况可能是应用预设值。如:

Rectangle rect = RectangleBuilder.MakeSquare(10).Build();
Car car = CarBuilder.MakeVolvo().PimpIt().SetColor(Color.Red).Build();

在这种情况下,你可以一次设置多个属性,这样你就可以从某种原型开始,并从那里继续。

以StringBuilder为例。它仍然是有用的,并且是构建新字符串所必需的具有高性能(因为编译器中的优化不会覆盖所有场景)。对于其他不可变对象也是一样的,正如已经注释过的。

另外,在使用构建器模式时,更容易替换初始化的类型,这会给您带来松耦合(用于依赖注入)。它可能并不总是用于测试目的,但有时仍然会派上用场。