Это глобальная переменная
Когда игры создавались энтузиастами в гараже, аппа-
ратная поддержка значила намного больше, чем ото-
рванные от реальности принципы проектирования.
Разработчики старой школы, которые писали на C и ас-
семблере, использовали статические и глобальные пере-
менные, не знали проблем и создавали отличные игры.
Архитектура и возможность поддержки стали бутылоч-
ным горлышком, когда сложность игр возросла. Разра-
ботчики столкнулись с проблемами не из-за аппаратных
ограничений, а из-за ограничений
производительности
.
Поэтому мы стали использовать языки, подобные
С++, а с ними нажитую непосильным трудом мудрость
предыдущих поколений разработчиков. Один из уроков,
который нам пришлось усвоить: глобальные перемен-
ные плохи по ряду причин…
104
Одиночка (Singleton) —
Паттерны программирования игр
• Они делают сложнее понимание кода.
Предполо-
жим, мы пытаемся найти ошибку в функции, кото-
рую писал кто-то другой. И если она не затрагива-
ет никакое глобальное состояние, нам достаточно
просто понять тело самой функции и передаваемые
в нее аргументы.
А теперь представьте, что где-то в середи-
не вызывается некая функция
SomeClass::
getSomeGlobalData()
. В попытках разобраться
в происходящем мы будем вынуждены перекопать
весь код, стараясь выяснить, кто еще изменяет эти
глобальные данные. Поверьте, вы не начнете по-на-
стоящему ненавидеть глобальное состояние, пока
вам не придется где-то в три часа утра использо-
вать
grep
, чтобы среди миллионов строк кода най-
ти единственный вызов, который присваивает пе-
ременной ошибочной значение.
• Они способствуют увеличению связанности.
Но-
вому программисту в вашей команде, еще не знако-
мому с вашей превосходной, поддерживаемой и неза-
висимой архитектурой, поручили его первое задание:
заставить камни при падении на землю издавать зву-
ки. Мы с вами уже знаем, что не стоит связывать код
физического движка с кодом, ответственным за
аудио
,
ни при каких обстоятельствах. Но новичок просто пы-
тается выполнить задание. К несчастью для нас, эк-
земпляр
AudioPlayer
находится в области глобаль-
ной видимости. Вот так один маленький
#include
может полностью уничтожить архитектуру, которая
так тщательно разрабатывалась.
Но если бы экземпляр аудиоплеера не был в об-
ласти глобальной видимости, даже
#include
в за-
головке не дал бы нужного эффекта. И проблема,
возникшая на пути юного программиста, намека-
ет ему: эти два модуля не должны видеть друг друга,
лучше ему поискать другое решение.
Контролируя
область видимости экземпляров, вы контролиру-
ете связанность.
Специалисты в области
информационных тех-
нологий называют функ-
ции, не использующие
и не изменяющие гло-
бальные данные, «чи-
стыми». Чистые функ-
ции проще для
понимания, их проще
компилировать и опти-
мизировать, а также они
позволяют вам исполь-
зовать различные трюки
вроде меморизации
(memoization), когда вы
сохраняете результаты
предыдущих вызовов
функции, чтобы можно
было их переиспользо-
вать и не повторять вы-
числения при тех же
входных данных.
Поскольку использо-
вать только чистые
функции невероятно
сложно, но их преиму-
щества невероятно со-
блазнительны, специа-
листы в области
информационных тех-
нологий разработали
специальные языки про-
граммирования вроде
Haskell, которые допу-
скают создание
только
чистых функций.
Do'stlaringiz bilan baham: |