From f788b6d39b7a4037809b78f1f879cd3e3105b2b3 Mon Sep 17 00:00:00 2001 From: stepan Date: Sun, 13 Sep 2026 03:41:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D0=BE=20=D1=84=D0=B0=D0=B1=D1=80=D0=B8=D0=BA=20?= =?UTF-8?q?=D0=B8=20=D0=B1=D0=B8=D0=BB=D0=B4=D0=B5=D1=80=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=B4-=D1=81=D1=82=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/spec/Код-стайл-Дейл.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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. Комментирование кода Все комментарии — на русском языке.