18

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

当 C# 引入Object Initializes时,它是否使 Test Data Builder 模式过时了?

在 Object Initializers 之前,您需要以下代码来初始化 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"};

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

4

2 回答 2

2

在许多情况下,您可以用对象初始化器替换构建器。

但是,在某些情况下,构建器仍然是一个不错的选择。

不可变对象就是一个例子。例如,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();

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

于 2013-03-22T15:17:22.573 回答
1

以 StringBuilder 为例。为了构建具有高性能的新字符串,它仍然有用且需要(因为编译器中的优化不会涵盖所有场景)。正如已经评论过的,其他不可变对象也是如此。

此外,当使用 builder 模式时,更容易替换 initalized 类型,这会给您带来松散耦合(用于依赖注入)。测试目的可能并不总是需要它,但有时仍可能派上用场。

于 2013-03-22T14:50:45.080 回答