Наскільки складним може бути конструктор?

← Наскільки складним може бути конструктор?

Ashterix

docs: English JsonRpcBundle docs, REST and MCP Bundle sections, package cards

uk/articles/from-tg/architecture/constructor.md новий файл +56 −0

1 + # Наскільки складним може бути конструктор?
2 +
3 + Якось на курсі php-pro, коли я розповідав про SOLID, один із студентів запитав:
4 +
5 + > «А скільки залежностей можна вважати нормальним у конструкторі?
6 + > Три? Чотири? Пʼять — це вже погано?»
7 +
8 + Хороше питання. Але відповідь трохи не в площині "цифри".
9 +
10 + Є популярна думка, що конструктор має бути максимально простим, бо "інакше це ознака порушення SRP".
11 +
12 + Я з цим не згоден. Бо сам факт великої кількості залежностей — не обовʼязково погано: якщо твій обʼєкт має чітку відповідальність, але для її реалізації потребує 6–8 залежностей — це нормально. Проблема, якщо вони несумісні логічно або обʼєкт намагається робити забагато.
13 +
14 + Але якщо обʼєкт координує складну, але єдину бізнес-дію — багато залежностей це нормально і навіть правильно.
15 +
16 + ```php
17 + class OrderFinalizer
18 + {
19 + public function __construct(
20 + private OrderRepository $orders,
21 + private InventoryService $inventory,
22 + private DiscountCalculator $discounts,
23 + private TaxService $tax,
24 + private PaymentGateway $payments,
25 + private LoggerInterface $logger,
26 + private EventDispatcherInterface $events,
27 + ) {}
28 + }
29 + ```
30 +
31 + Так, тут 7 залежностей, і всі вони працюють на одну дію — фіналізацію замовлення.
32 +
33 + Це SRP у чистому вигляді: складна операція, але одна відповідальність.
34 +
35 + Якщо ми почнемо це «розмазувати» по фабриках або передавати 1 загальний сервіс, типу `AppContext`, — от тоді це буде гірше.
36 +
37 + Бо замість явного контракту ти отримуєш непрозору магію.
38 +
39 + Незрозуміло, що реально потрібно класу — тільки при читанні коду видно, що витягується з контексту.
40 +
41 + Це ускладнює:
42 +
43 + - рефакторинг (бо клас виглядає як чорна діра);
44 + - тестування (все мокаєш, бо неясно, що саме юзається);
45 + - зрозумілість (новачок не зчитує залежності по сигнатурі).
46 +
47 + ## Висновок
48 +
49 + > Не бійся передавати багато залежностей, якщо вони всі потрібні.
50 + > Бійся ховати залежності в "зручні" обгортки типу `AppContext`.
51 +
52 + Код має бути явним. Це і є архітектура.
53 +
54 + ---
55 +
56 + *Вперше опубліковано в Telegram-каналі [«Створений щоб помирати»](https://t.me/php_while_true/11) 19.06.2025.*