Недавно я удалил свой Java- ответ на Code Review , который начался так:
private Person(PersonBuilder builder) {
Стоп. Красный флаг. PersonBuilder будет строить Person; это знает о Человеке. Класс Person не должен ничего знать о PersonBuilder - это просто неизменный тип. Вы создали круговую связь здесь, где A зависит от B, который зависит от A.
Человек должен просто принять его параметры; клиент, который хочет создать Человека, не создавая его, должен иметь возможность сделать это.
Я получил удар вниз и сказал, что (цитируя) Красный флаг, почему? Реализация здесь имеет ту же форму, которую продемонстрировал Джошуа Блох в своей книге «Эффективная Java» (пункт № 2).
Итак, похоже, что Единственно верный способ реализации Pattern Builder в Java - это сделать построитель вложенным типом (хотя это и не тот вопрос, о котором идет речь), а затем создать продукт (класс создаваемого объекта). ) возьмите зависимость от строителя , вот так:
private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; }
Одна и та же страница Википедии для того же шаблона Builder имеет совершенно другую (и гораздо более гибкую) реализацию для C #:
//Represents a product created by the builder public class Car { public Car() { } public int Wheels { get; set; } public string Colour { get; set; } }
Как вы можете видеть, продукт здесь ничего не знает о Builder
классе, и, несмотря на все заботы, он может быть создан прямым вызовом конструктора, абстрактной фабрикой ... или конструктором - насколько я понимаю, продукту творческого паттерна никогда не нужно ничего знать о том, что его создает.
Мне предоставили встречный аргумент (который явно защищен в книге Блоха) о том, что шаблон конструктора можно использовать для переделки типа, в котором конструктор будет раздут с десятками необязательных аргументов. Поэтому вместо того, чтобы придерживаться того, что я думал, я знал, что немного исследовал этот сайт и обнаружил, что, как я и подозревал, этот аргумент не выдерживает критики .
Так в чем же дело? Зачем придумывать изощренные решения проблемы, которой вообще не должно быть? Если мы на минуту снимаем Джошуа Блоха с пьедестала, можем ли мы придумать одну вескую и уважительную причину для объединения двух конкретных типов и назвать это лучшей практикой?
Это все пахнет грузо-культовым программированием для меня.