Фича, которая реже всего встречается на проектах, где я работал.
Что странно, ведь это очень эффективный инструмент с очень высоким отношением затрат и результата, и вот почему:
1️⃣ Единственный способ увеличить продуктивность программистов — использовать кодогенерацию.
Т.е. генерировать код, для создания которого требуется сформировать абстрактную модель в голове, а потом перевести ее в реальный код.
С учетом того что цикл перевода знаний из краткосрочной в долгосрочную память занимает больше 24 часов (об этом я писал тут и тут).
2️⃣ Вы тратите время только на поддержку кодогенератора, а не кода, который он генерирует.
Если в сгенерированном коде баг — исправляем генератор, а не все объекты, что он создал.
Такая же логика работает для всего, что генератор создает.
Т.е. в сравнении имплементации с кодогенерацией и без, поддерживать нужно будет меньше кода.
3️⃣ Это очень легко.
Чем отличается генерация JSON-файла от генерации скрипта?
— Вообще ничем. Любой класс — это текст внутри файла.
Компилятор увидит эти файлы, сотворит магию (нет) и код будет готов к использованию.
Вот крутой пример из самого популярного DI-контейнера для Unity (всего 90 строк кода
Никаких хаков и продвинутого понимания языка. Просто код, который генерирует код
4️⃣ Это может быть очень быстро.
Вместо использования рефлексии можно сгенерировать код, который будет вызывать нужные методы напрямую.
Из популярного:
🔸Операции (де-)сериализации
Например, тот же
Newtonsoft.Json
использует IL Weaving для генерации IL-кода, который преобразует строку в объект во время исполнения программы.В unity же значение в каждый из элементов объекта проставляется через рефлексию.
Жду реализации через SourceGenerator'ы
🔸Генерация Data Transfer Object'ов
Для общения клиента и сервера, вместо того чтобы писать объекты для данных вручную, можно их полностью генерировать.
Безусловно, такая фича уже давно есть в Swagger и много где еще, но в игровых проектах я все равно встречаю такое редко.
Чаще генерация происходит через первый сайт в google'е
🔸 Связь с нативной частью Unity.
Например, перехват событий из Animation Event можно полностью сгенерировать.
Тем самым избежав типичных: "Ой, эффект на персонаже X перестал работать, посмотри чо там
Мы этот подход использовали на проекте Magic Battle Arena и полностью генерировали из имен fbx-объектов:
🔹 События анимации, которые вызывали нужный метод в коде
🔹 Уникальные типы анимации для каждого персонажа.
Каждый персонаж — свой enum, который всегда консистентен с анимациями, которые на нем есть.
🔹 Настройки для художников спецэффектов.
Добавил fbx, нажал одну кнопку, настройки со всеми типами анимации готовы за 1 секунду.
5️⃣ Можно генерировать целые фичи.
На Magic Battle Arena мы генерировали DTO, (де-)маршалинг данных и Memory Pool для всех этих объектов
Т.е. по сути весь транспортный слой, отвечающий за коммуникацию клиента и сервера, полностью кодогенерировался.
Мы использовали T4 Templates. До сих пор очень мощный и крутой инструмент
Итого:
Лично для себя не вижу ни одного повода чтобы не задавать себе каждый раз перед написанием новой фичи:
"А могу ли я какую-то часть накодогенить?"
Так шаг за шагом и проект сам себя рано или поздно напишет
🔻Давайте соберем маленькую базу мест, где еще кодоген будет полезен.
Расскажите в комментах, где вы используете(-али) кодоген и он сослужил вам верную службу
Ты знаешь кому переслать этот пост.
Ставь 👍 если тебе по кайфу такая движуха
#проект_в_разработке@UniArchitect