Готовый перевод Game Programming Patterns / Паттерны программирования в играх: 4.1 Component

Цель

Позволить классу соединить несколько доменов без завязывания доменов друг на друга.

Мотивация

Предположим, мы делаем платформер.

Демография итальянских сантехников уже покрыта, так что нашим главным героем будет датский пекарь Бьёрн.

Разумеется, у нас будет класс, воплощающий нашего дружелюбного кондитера, и он будет описывать все, что Бьёрн может делать в игре.

Блестящие игровые идеи как эта - причина, по которой я - программист, а не дизайнер.

Игрок управляет им - управляющие команды читаются и приводятся в движение.

И, конечно же, ему надо взаимодействовать с уровнем, так что появляется физика и контакт между объектами.

После этого он хочет увидеть это на экране, пора бросить силы на анимацию и рендеринг.

Он, вероятно, также захочет услышать звук.

Постой на минутку; это выходит из под контроля.

Софтверная Архитектура 101 гласит: разные домены в программе должны быть изолированы друг от друга.

Если мы делаем текстовый редактор, код, который отвечает за печать не должен быть подвержен влиянию кода, который загружает и сохраняет документы.

У игры нет доменов бизнес-приложения, но правила остаются те же.

По возможности, мы не хотим чтобы ИИ, физика, рендеринг, звуки и остальные домены знали друг о друге, но теперь они все впихнуты в один класс.

Мы знаем куда ведёт эта дорога: пятитысячистрочный загруженный, фрагментированный исходный файл, настолько большой, что самые храбрые ниндзя-кодеры осмеливаются только подойти к нему.

Это хорошая защита для той пары человек, кто может "приручить" его, но сущий ад для остальных.

Настолько большой класс указывает на то, что даже очевидно небольшие изменения могут иметь далеко идущие последствия.

Вскоре класс начинает обрастать ошибками быстрее, чем набирать функционал.

Запутанный узел.

Куда большей проблемой, чем банальное разрастание, является спутывание.

Все отдельные системы нашей игры оказались связанными в огромный клубок кода, подобно этому:

if (collidingWithFloor() && (getRenderState() != INVISIBLE))

{

playSound(HIT_FLOOR)

;

}

Любой программист пытающийся изменить подобный код должен знать как реализованы физика, графика и звук, дабы не поломать ничего.

Переведено на Нотабеноиде
http://notabenoid.org/book/51192/215226

Переводчики: BaMnup16, adm244, kamillxiii, marapper

Настройки

Готово:

4.60% КП = 1.1

Непереведённые фрагменты будут пропущены.