Skip to content

0002 persist state changes as events

Евгений Терехов edited this page Jul 27, 2021 · 4 revisions

2. Сохранять изменения состояния системы в виде событий

Context

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

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

Очевидно, что история изменений состояния игры позволит "воспроизводить" ранее сыгранные игры или восстанавливать состояние на любой момент времени. А вот Действия на эту роль не подходят, т.к. логика их обработки может меняться с течением времени (например, при изменениях баланса или правил), и одна и та же последовательность Действий не будет приводить к одинаковому состоянию в разные моменты времени.

Decision

Мы будем сохранять в постоянном хранилище всю историю изменений состояния как каждой конкретной Игры (партии за Столом), так и системы в целом, в виде событий. Каждое событие должно включать минимум одно изменение состояния. Возможно, для каждого события стоит задавать какое-либо описание, которое может затем быть использовано для воссоздания текстового протокола Игры.

Consequences

Мы рассчитываем, что акцент на сохранении именно Изменений состояния, а не Действий, даст нам возможность изменять логику обработки Действий, не влияя на уже сыгранные игры или игры, находящиеся в процессе.

Повторное воспроизведение записанной истории изменений состояния гарантированно будет приводить к одному и тому же состоянию.

Clone this wiki locally