diff --git a/docs/spec/Код-стайл-Дейл.md b/docs/spec/Код-стайл-Дейл.md index 620a97f..b49d1b6 100644 --- a/docs/spec/Код-стайл-Дейл.md +++ b/docs/spec/Код-стайл-Дейл.md @@ -103,6 +103,25 @@ - Асинхронность: суффикс `Async`, `CancellationToken` пробрасывать до конца; `.Result` / `.Wait()` запрещены — только `await`. +### 4.1. Фабрики и билдеры + +- **Нетривиальные объекты с интерфейсом создаются только фабриками.** Реализация сервиса/адаптера, + у которого есть порт-интерфейс, не создаётся прямым `new` в прикладном коде или композиционном корне — + только внутри фабрики. Форма пары: `IXxxFactory` (порт фабрики) + `XxxFactory` (реализация), метод + `Create(...)` возвращает **интерфейс** готового объекта (`ISecretCipher`, `IFileStorage`, …). +- Фабрика сама регистрируется в DI (`AddScoped`/`AddSingleton()`) — контейнер + конструирует её без `new`; зависимости фабрики — тоже DI. +- **Билдер** (`IXxxBuilder`/`XxxBuilder`) добавляется, когда объект собирается итеративно из многих частей + или опций; фабрика делегирует сборку билдеру, а не повторяет её. +- Исключения из правила (прямой `new` допустим): + - DTO, рекорды, value-объекты, `Options`/`Settings`-снимки; + - исключения (`*Exception`) и примитивы/BCL-типы (`StringBuilder`, `NpgsqlConnection`, `MinioClient`, …); + - статические классы и хэлперы без состояния (фабрику для них не заводим); + - EF-конфигурации (`IEntityTypeConfiguration`) — это метаданные модели, а не прикладные объекты; + - обёртки ресурсов без порт-интерфейса (gRPC-соединения с `IDisposable`); + - объекты без порт-интерфейса, создаваемые контейнером (`AddScoped()`). +- Тесты могут конструировать проверяемый тип прямым `new` — это часть самого теста, а не прикладного кода. + ## 5. Комментирование кода Все комментарии — на русском языке.