Нещодавно я видалив мою відповідь Java на Code Review , яка почалася так:
private Person(PersonBuilder builder) {
Стій. Червоний прапор. PersonBuilder побудував би Person; це знає про Особу. Клас Person нічого не повинен знати про PersonBuilder - це просто незмінний тип. Ви створили тут кругле з'єднання, де A залежить від B, що залежить від A.
Людина повинна просто приймати її параметри; клієнт, який готовий створити особу, не будуючи її, повинен це робити.
Мене вдарили по полю, і сказав, що (цитуючи) Червоний прапор, чому? Реалізація тут має таку ж форму, яку продемонстрував Джошуа Блох у своїй книзі "Ефективна Java" (пункт №2).
Отже, виявляється, що єдиний правильний спосіб реалізації шаблону 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
клас, і, на все це його хвилює, він може бути створений прямим викликом конструктора, абстрактним заводом, ... або будівельником - наскільки я розумію, продукт творчого малюнка ніколи не повинен нічого знати про те, що його створює.
Мені подали контр-аргумент (який, очевидно, явно захищений у книзі Блоха), що шаблон для побудови може бути використаний для перероблення типу, у якому конструктор буде роздутий десятками необов'язкових аргументів. Тож замість того, щоб дотримуватися того, що, як я думав, знаю, я трохи досліджував цей сайт, і виявив, що, як я підозрював, цей аргумент не тримає уваги .
То яка угода? Навіщо придумувати надмірно розроблені рішення проблеми, яка навіть не повинна існувати в першу чергу? Якщо ми знімемо Джошуа Блоха з його п’єдесталу на хвилину, чи можемо ми знайти одну єдину добру, дійсну причину з’єднання двох конкретних типів і назвати це найкращою практикою?
Це все нагадує для мене вантажне культове програмування .