Files
Deal/docs/spec/Код-стайл-аудит-2026-09-11.md
T
Rustam Khalimov 27c7831910
ci / build-test (push) Canceled after 0s
Deal — единая кодовая база
SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/
Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue,
контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер),
Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог).

Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
2026-09-11 23:56:47 +03:00

6.7 KiB
Raw Blame History

Аудит кода на соответствие код-стайлу «Дейл» (2026-09-11)

Отчёт прохода по всему C#-коду (src/**/*.cs, 928 файлов, без bin/obj). Правила — docs/spec/Код-стайл-Дейл.md. Проверка: сборка 4 решений + все тесты.

1. Исправлено (применено и проверено)

Пункт Правило Было Стало Инструмент
Блочный <summary> §5 5286 однострочных/инлайн (833 файла) 0 scripts/fix_summary_blocks.py --apply
XML-док на private/internal §5 2028 блоков (359 файлов) 0 (понижены до //) scripts/fix_private_docs.py --apply
Квалификация this. §4 124 0 разовый Roslyn-инструмент (семантический)
Приватные instance-поля §1 camelCase (logger) _camelCase (_logger) разовый Roslyn-инструмент
Приватные static readonly/const §1 Pascal (DefaultTimeout) разовый Roslyn-инструмент

Дополнительно в .editorconfig включены машинные правила, теперь ломающие сборку при нарушении (TreatWarningsAsErrors=true, EnforceCodeStyleInBuild=true):

  • dotnet_style_qualification_for_{field,property,method,event} = false:warning — запрет this.;
  • правила именования IDE1006: приватные instance-поля _camelCase, const/static readonly — Pascal.

Также проверено и не требует правок: #region нет; trailing whitespace нет; все файлы заканчиваются переводом строки; кодировка UTF-8; настоящих public-полей нет (публичные члены — свойства); явные модификаторы доступа соблюдены.

Проверка после правок

  • dotnet buildDeal.sln, Deal.Telegram.sln, Deal.Ai.sln, Deal.Ml.sln: 0 ошибок / 0 предупреждений.
  • Тесты: core 1275/1275, telegram 125/125, ai 52/52, ml 38/38 — все пройдены.
  • Повторный прогон renamer: this. — 0, полей к переименованию — 0 (идемпотентно).

2. Остатки — решения (закрыто 2026-09-11, вечер)

  1. var — закрыто. В .editorconfig включён ломающий сборку гейт csharp_style_var_for_built_in_types = false:warning (запрет только для встроенных типов — как в §4); режимы «очевидный тип» и «прочие» оставлены silent осознанно: правка субъективна и потребовала бы ~1600 механических замен. Остаток встроенных типов выправлен dotnet format style --diagnostics IDE0008 по всем 5 решениям (51 файл); сборка 5 sln — 0/0.
  2. Явная реализация интерфейсов (§11) — выполнено (вечер, решение владельца, вариант A). 161 член в 30 прод-файлах конвертирован codemod'ом scripts/make_explicit.py (частичные классы и многострочные сигнатуры учтены); потребители конкретных типов перетипизированы на интерфейсы (8 мест в проде, 17 тест-файлов); Card/семейство I*Card оставлены implicit — это DTO, их члены и есть публичный API. Правило закреплено в §11 код-стайла: классы напрямую не вызываем (DTO/хелперы/экстеншены — исключения).
  3. Дедупликация <summary> через <inheritdoc/> — закрыто: дублей нет. Проверено двумя независимыми сканами (сопоставление по тексту и по имени члена интерфейса: 39 интерфейсов, 229 задокументированных членов) — реализаций, дублирующих summary интерфейсного члена, в продакшн-коде нет; случаев «<param> + дублирующий summary» не существует.
  4. Переводы строк — решено: LF. Обоснование: инструменты проекта (Python/Node-скрипты, codemod'ы) пишут LF; shell-скрипты с CRLF не работают на Linux CI (sh scripts/ci.sh в GitHub Actions); фактическое большинство файлов уже было LF. Применено: .gitattributes (* text=auto eol=lf + бинарные исключения), .editorconfigend_of_line = lf, конвертировано 1029 трекаемых файлов, git add --renormalize. Побочный эффект: починены 42 CRLF-.sh (9 в scripts/ — до этого первый удалённый прогон CI падал бы).

Попутно исправлено (2026-09-11, вечер)

  • Повторный прогон scripts/fix_private_docs.py --apply: понижено 12 XML-доков на private/internal (extension-файлы).
  • Добавлены недостающие <summary>: IContainerRules.Keywords/Stack, ITenantContext.TenantId/HasTenant.
  • Переведены на русский англоязычные //-комментарии (3 шт. из 18 найденных; остальные — имена сущностей/заголовки секций тестов, не англоязычный текст).
  • Из индекса убраны случайно закоммиченные archive/**/__pycache__/*.pyc (2 шт., уже в .gitignore).
  • STATUS.md: удалён устаревший блок «Осталось (в backlog)» в шапке (пункты закрыты generic-контрактом источника).
  • Дочистка по контрольному скану краткости: удалены 73 очевидных <param name="ct|cancellationToken"> («Токен отмены.» — пересказ сигнатуры, §5) в 17 файлах; ужаты 3 summary (2 многосентенционных, 1 длинное). Контроль: <remarks> — 0, inline-<summary> — 0, многосентенционных summary — 0, TODO — 0.