Халфовская игровая дллка, это эталонный пример анти-паттерна конечно.
Это надо всем начинающим пограмистам показывать как не надо делать.
В кваке был целостный эдикт и непрерывный массив, что хотя и увеличивало потребление памяти с одной стороны, но с другой гарантировало нам, что мы никогда не промахнёмся по адресу, можем ссылаться на мёртвые эдикты и так далее. В халфе, мало того что разрушили эту концепцию, казалось бы с благой целью, так еще и долгое время не могли определиться что послужит базовым указателем на сущность. entvars_t? edict_t? CBaseEntity?
В итоге мы имеем три сущности и три преобразования-апкаста туда и сюда, которые вообще не несут абсолютно никакого смысла, только запутывают.
Плюс еще те переменные, что входят в состав entvars_t неявно модифицируются\читаются движком и об этом нигде ничего не написано. Отдельного упоминания заслуживают флаги, часть флагов явно задаёт поведение движка, а часть существует только в игровом коде.
В сорсе на первый взгляд попытались это привести в порядок, но на деле только осложнили ситуацию. Там теперь всё в каллбэках, чтобы сделать типичный вызов движковой функции надо писать класс-заглушку с каллбэком и от нее наследовать какую-то чертовщину. То есть вот мы к примеру хотим отправить сетевое сообщение всем клиентам. Мы уже не можем написть MSG_ALL, нам надо городить специальный класс, который пропускает сообщение для всех клиентов в каллбэке. Пример избыточной гибкости, которая может пригодится примерно никогда.
Дядя Миша писал: долгое время не могли определиться что послужит базовым указателем на сущность. entvars_t? edict_t? CBaseEntity?
В халфе чётко определились. Базовая сущность это edict_t. У него есть "скриптовые" поля entvars_t, которые (в теории) могут быть доступны виртуальной машинке. Да, в халфе ВМ не реализовали, но я в HLFX0.7 упражнялся и оценил это разделение в полной мере. Что касается CBaseEntity, то это класс, целиком инкапсулированный в дллке и невидимый извне. Это логическая обвёртка, которая движку не нужна. Важный плюс такой архитектуры - движок может быть скомпилен MSVC, а дллки, скажем, GCC. И она - после ряда неархитектурных фиксов - будет загружаться и работать. В Волатиле оно так и происходит: мы хоть и заставляем пользователя что-то там компилировать, но по крайней мере не требуем строгую "модель" и версию компилятора.
Цитата:
Дядя Миша писал: и об этом нигде ничего не написано.
Это не пример антипаттерна, это пример плохой документации.
Цитата:
Дядя Миша писал: В сорсе на первый взгляд попытались это привести в порядок, но на деле только осложнили ситуацию.
Ну код-то по факту стал читабельнее? Не надо лезть в код движка и/или документацию и смотреть, что делает магическая константа MSG_ALL?
Чем больше людей работают над кодом, тем важнее такая избыточность, и тем дольше этот самый код пишется в принципе. Поэтому зависимость "число человек - число реализованных фич" не линейная.
XaeroX писал: Базовая сущность это edict_t. У него есть "скриптовые" поля entvars_t, которые (в теории) могут быть доступны виртуальной машинке.
Это если бы они так планировали сделать изначально. А им entvars достались в наследство. И edict_t ни разу не базовая сущность. Она была таковой в кваке, где виртуальная машинка управлялась именно с эдиктами.
В халфе эдикт нужен только для того, чтобы движок примерно понимал с чем ему иметь дело, ему даже не столько сам эдикт нужен, сколько его номер в массиве.
Цитата:
XaeroX писал: Ну код-то по факту стал читабельнее?
я бы так не сказал. Проще написать MSG_ALL, чем каждый раз копипастить этот класс с каллбэком. Кстати говоря, как такие вещи по научному называются? Когда весь класс создаётся только ради одной виртуальной функции.
Дядя Миша писал: Долбанные энтварсы, когда же они уже закончатся. Этот рефакторинг я навсегда запомню как самое бессмыссленное и в то же время необходимое действие.
Ничего! Мастера это не остановило когда он сортировал delta.lst. Ты теперь достойный продолжатель его великого деда дела!
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!