Провенанс правил фундамента: замер прошлого проекта автора (FewSeconds-ManyDeaths-Unity, 191 файл
_Project), сделанный при старте Guildmaster в мае 2026. Запись извлечена из замороженного10-reference/tech-stack— числа больше нигде не сохранились.
Решили: запретить в Guildmaster ровно то, что измеримо болело в прошлом проекте. Каждое HARD-правило фундамента — контрмера с конкретной цифрой за спиной, а не вкусовщина.
| Что болело в FewSeconds | Масштаб | Контрмера у нас |
|---|---|---|
| нет Assembly Definitions | 0 .asmdef, монолит | граф сборок, зависимости только вниз |
| синглтоны | 18 классов, 480 обращений к .instance | DI через VContainer, static instance запрещён |
Find*ObjectOfType | 87 вызовов в 54 файлах, в том числе в геттерах | инъекция и явные ссылки |
глобальный UnityEngine.Random | 17 вызовов, SessionSeed через Random.InitState глобально | только IRngService, seeded |
| god-object стейта | параллельные массивы + SO.CreateInstance для рантайма | рантайм-состояние в POCO, SO иммутабельны |
| god-object шины | GlobalEventSystem: 60+ статических UnityEvent | MessagePipe через DI с дисциплиной отписки |
| класс на каждый скилл | взрыв классов, SkillScript под 200 строк | данные в SO, поведение через [SerializeReference] |
Почему: главный вывод замера — проблемы шли не от незнания C#, а от отсутствия двух вещей:
границ (asmdef) и инверсии зависимостей (DI). Всё остальное было следствием: без границ любой
класс мог дотянуться куда угодно, а без DI единственным способом «дотянуться» оказывался синглтон или
Find. Поэтому оба пункта заложены в фундамент до первой игровой фичи — ретрофит границ по живому
проекту стоит дороже, чем весь выигрыш от них.
Грабли: правила выглядят догмой, если не знать этих чисел, — и тогда их начинают «оптимизировать» («ну один синглтон же можно»). Один можно. Их стало 18, а обращений 480, за одну итерацию проекта, и каждое по отдельности было разумным.
Владелец правды: сами правила — Reference - Code Standards §1 и
§4, CLAUDE.md («Правила слоёв»); граф сборок — .asmdef файлы.