From 8a7d7f2a7a3878a351450c8d55021295021462f9 Mon Sep 17 00:00:00 2001 From: Rustam Khalimov Date: Fri, 11 Sep 2026 13:15:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-09-11-структура-проектов-design.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/superpowers/specs/2026-09-11-структура-проектов-design.md diff --git a/docs/superpowers/specs/2026-09-11-структура-проектов-design.md b/docs/superpowers/specs/2026-09-11-структура-проектов-design.md new file mode 100644 index 0000000..29ff1dd --- /dev/null +++ b/docs/superpowers/specs/2026-09-11-структура-проектов-design.md @@ -0,0 +1,53 @@ +# Дизайн: разбиение проектов на логические папки (namespace = папка) + +Дата: 2026-09-11. Статус: согласовано владельцем (решения 1–5). + +## 1. Цель + +Упорядочить код по назначению: вместо «свалки» файлов разных видов в одной папке с единым +`namespace` — подпапки по назначению, при этом `namespace` соответствует пути папки. + +## 2. Таксономия папок (по назначению) + +| Папка | Что кладём | +| --- | --- | +| `Abstractions/` | интерфейсы `I*.cs` | +| `Services/` | прикладная логика: `*Service`, `*WorkerService.*`, `*Guard`, `*Pacer`, `*Evaluator`, `*Counter`, `*Detector`, `*Normalizer`, `*Matcher`, `*Composer`, `*Cleaner`, `*Classifier`, `*Mapper`, `*Builder`, `*Writer`, `*Recomputer`, `*Suggester`, `*Filler`, `*Generator`, `*Hasher` и аналогичные исполнители | +| `Models/` | доменные типы: сущности, value-объекты, enum, статусы/виды, константные реестры (`*Statuses`, `*Kinds`, `*Prefixes`, `*Keys`, `*Events`, `*Periods`, `*Sources`, `*Field`, `*Defaults`) | +| `Dtos/` | транспортные типы: `*Dto`, `*Request`, `*Response`, `*Patch` | +| `Extensions/` | `*Extensions` | +| `Options/` | `*Options` | +| `Exceptions/` | `*Exception` | +| `Registrars/` | `*ModuleRegistrar` | + +Существующие feature-папки (`ColumnRules`, `Parse`, существующие `Models`) сохраняются. + +## 3. Правила + +1. `namespace` строго соответствует пути папки. +2. Имена типов и публичные контракты не меняются — только расположение и `namespace`. +3. Один тип = один файл (уже соблюдается). +4. Частичные классы (`Foo.cs`, `Foo.Part.cs`) переносятся вместе. +5. Тестовые проекты группируются по областям: `Modules/`, `Api`, `Infrastructure` и т.п., + `namespace` = `Deal.Tests.Unit.<Область>`. + +## 4. Механика переноса (на проект) + +1. Классифицировать файлы по таблице §2. +2. Перенести файлы в подпапки и заменить `namespace`. +3. Миграция `using`: в файлах-потребителях заменить несуществующий старый `using ;` на + `using` всех новых подпространств (пере-добавление безопасно; при коллизии имён — ручное разрешение). + Файлы внутри проекта-источника получают `using` соседних подпространств. +4. `dotnet build` → исправить остатки (полные имена, `cref`), `dotnet test`. +5. Отдельный коммит (русский) после каждого проекта. + +## 5. Порядок + +Пилот — `Deal.Modules.Cards` (чистый домен). Далее: остальные `Deal.Modules.*`, затем +`Deal.Infrastructure`, `Deal.Api`, `Deal.Contracts`/`Deal.SharedKernel`, сервисы `telegram/ai/ml`, +затем тестовые проекты. После каждого шага — сборка + тесты + коммит. + +## 6. Риски + +- Коллизия простых имён при пере-добавлении `using` → разрешается вручную по ошибкам сборки. +- Не забыть `cref`/полные имена в XML-док и `nameof` — выявляются сборкой.