← Наскільки складним може бути конструктор?
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.*