🏗 Паттерн “Строитель”: когда он нужен, а когда — просто усложняет код

Многие начинают применять Builder просто потому, что «так красиво» или «видел в чьем-то коде». Давай разберёмся, где он реально решает проблему, а где — избыточен.

Что такое Builder? Это паттерн, который помогает создавать сложные объекты пошагово, скрывая детали и делая процесс конструирования более контролируемым.

Классика: объект с кучей необязательных полей и сложной логикой инициализации.

Когда Builder оправдан?

✅ У объекта много параметров Особенно если часть из них необязательная, а комбинации параметров — разные.

const user = UserBuilder .withName("Dmitry") .withEmail("dmitry@example.com") .asAdmin() .build()

Читабельно, декларативно, структурировано.

Цена использования Builder'а

1. Больше кода Придётся описывать отдельный класс строителя: методы, внутренний state, build().

2. Ложное ощущение сложности Появление Builder'а может создать иллюзию, что объект сложный, хотя на деле проблема решалась обычным объектом или функцией.

3. Избыточность в функциональном стиле

Если объект простой, то Builder только скрывает правду:

// ❌ Overkill const config = new ConfigBuilder() .setMode("dark") .setCaching(false) .build()

То же самое проще и честнее:

// ✅ Работает так же const config = { mode: "dark", caching: false }

Функциональная альтернатива Builder'у

Если хочешь декларативность, но без ceremony, используй фабричные функции:

type UserOptions = Partial<{ name: string email: string isAdmin: boolean }>

function createUser(opts: UserOptions = {}) { return { name: opts.name ?? "Guest", email: opts.email ?? null, isAdmin: opts.isAdmin ?? false } }

const user = createUser({ name: "Dmitry", isAdmin: true })

Плюсы: меньше кода, проще тестировать, всё прозрачно.

Когда Builder НЕ нужен?

❌ Объект простой ❌ Нет сложной валидации ❌ Инициализация линейная и очевидная ❌ Можно обойтись обычными аргументами или фабрикой ❌ Builder добавляет больше шума, чем смысла

Когда Builder — прям мастхэв?

✔ Объект реально сложный ✔ Много опциональных параметров ✔ Нужно навязать ограничения ✔ Важна пошаговая сборка ✔ Нужны разные пресеты (разные director'ы)

Вывод

“Строитель” — мощный инструмент, но не магия. Применяй его там, где объект действительно сложно создать, а не там, где хочется «красивых цепочек методов».

Правило: Начни с простой фабрики. Перейди к Builder'у только когда код станет больно читать и больно расширять.

Сталкивались с ситуациями, когда Builder только всё усложнил? 💬

#architecture #patterns #builder #typescript #bestpractices #frontend