Архитектура движка.Статьи

Паттерны GoF - Command (лекция)

Автор:

<MiF> Command
<MiF> Назначение - инкапсулиция запроса в виде объекта
<MiF> Применять когда:
<MiF> 1. нужны callback's
<MiF> 2. нужна очередь запросов, управление временем выполнения
<MiF> 3. поддержка redo/indo
<MiF> *undo
<MiF> ну и так далее
<MiF> можно много чего придумать
<MiF> Участники:
<MiF> 1. Command - интерфейс выполнения операции
<MiF> 2. ConcreteCommand - реализация, определяет связь между
  объектом-получателем (Reveiver) и действием, реализует
  выполнение путем вызова операция receiver'а
<MiF> *операций
<MiF> 2. Client - создает конкретные комманды и задает им
  получателя
<MiF> 3. Invoker - инициатор, обращается к комманде для ее
  выполнения
<MiF> 4. Receiver - знает как выполнять конкретные операции
<MiF> Что в результате:
<MiF> 1. инициатор операции и знающий как ее выполнить теперь не связаны
<MiF> 2. можно собирать составные комманды
<MiF> 3. Простота добавления новых комманд
<MiF> <CEMEH> Вопрос на будущее. Часто существует соблазн применить Command как
  команды для мира вообще, для передачи по сети только изменений, предсказаний,
  и отмотки обратно в случае коллизий.
<MiF> <CEMEH> Какие достоинства и проблемы у этого подхода?
<MiF> Кто-нибудь может по этому поводу что-нибудь сказать?
<kas> ?
<kas> ну
<kas> дибужить наверна
<kas> нисавсем тривильано
<CEMEH> Кас, ты вопрос видел?
<MiF> да
<kas> ага
<CEMEH> oh ok
<kas> команд он же подразумевает отложенное выполнение и в общем случае
  комплексных команд
<CEMEH> Дебаг - хороший тезис.
<kas> вот, чото гдето накосячица, и нипонятно что делать
<MiF> Rageous говорил, что у них с такой системай были косяки как раз из-за
  сложного дебага
<MiF> *системой
<CEMEH> Такие источники косяков могут быть очень разные.
<CEMEH> Например, разный framerate на разных машинах.
<CEMEH> Например, необходимость merge, а не отката во время коллизий.
<kas> нисавсем понятно как синхронизировать
<CEMEH> Синхронизовать более или менее ясно как.
<kas> м?
<CEMEH> Приходит команда с игровым временем, и делов.
<kas> а
<CEMEH> Иногда checksum. В общем, как всегда.
<CEMEH> Но с самим паттерном проблемы, что он очень полагается на историю.
<CEMEH> Как только эта связь становится не железобетонной - могут быть проблемы.
<CEMEH> У меня все :)
<kas> с другой стороны
<kas> очень удобный он
<MiF> ok, пример кода кому-нибудь нужен?
<CEMEH> Думаю, нет.
<MiF> ок, тогда поехали дальше

21 января 2006