我一直在阅读一堆blog posts,支持测试数据生成器模式的优点。这似乎是一个好主意,但所有帖子都已有数年之久。
当C#引入Object Initializes时,它是否使测试数据生成器模式过时了?
在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"};
在这个简单的例子中,似乎不需要构建器模式。我错过了什么吗?人们还在使用构建器模式吗?如果是这样,有什么好处?
答案 0 :(得分: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();
在这种情况下,您可以一次设置多个属性,这样您就可以从某种原型开始并从那里继续。
答案 1 :(得分:1)
以StringBuilder为例。为了构建一个新的字符串,它仍然是有用的 具有高性能(因为编译器中的优化不会涵盖所有场景)。 其他不可变对象也是如此,就像已经发表过的那样。
此外,使用构建器模式时,更容易更换初始化类型,这会使您松散耦合(用于依赖注入)。 它可能并不总是需要用于测试目的,但有时可能会派上用场。