Подтвердить что ты не робот

Каковы преимущества шаблона тестового шаблона данных над инициализаторами объектов?

Я читал кучу блог posts поддерживая достоинства шаблона построителя тестовых данных. Похоже, это хорошая идея, но все должности - годы.

Когда С# вводит Инициализирует объект, сделал ли шаблон шаблона тестовых данных устаревшим?

Перед инициализаторами объектов вам понадобится следующий код для инициализации объекта 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"};

В этом простом примере, казалось бы, шаблон компоновщика не нужен. Я что-то упускаю? Используют ли люди шаблон строителя? Если да, каковы преимущества?

4b9b3361

Ответ 1

Во многих случаях вы можете заменить сборщиков инициализаторами объектов.

Однако есть несколько случаев, когда строители по-прежнему являются хорошим вариантом.

Неизбежные объекты - один из примеров. например Реализация протобайта Jon Skeets - хороший пример шаблона реального мира для неизменяемых объектов. (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();

В этом случае вы можете сразу установить несколько свойств, чтобы вы могли начать с прототипа какого-то рода и продолжить оттуда.

Ответ 2

Возьмите StringBuilder, например. он по-прежнему полезен и необходим для создания новой строки с высокой производительностью (поскольку оптимизация в компиляторе не распространяется на все сценарии). То же самое касается других неизменяемых объектов, как уже было сделано.

Кроме того, при использовании шаблона компоновщика легче заменить инициализированный тип, который дает вам свободное соединение (для инъекции зависимостей). Это может не всегда требоваться для целей тестирования, но иногда может пригодиться.