1
Код стайл аудит 2026 09 11
stepan edited this page 2026-09-13 00:17:00 +03:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Перенесено из репозитория (docs/spec/Код-стайл-аудит-2026-09-11.md). Актуальная версия — здесь, в вики.

Аудит кода на соответствие код-стайлу «Дейл» (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.