Как обработать недопустимое действие на состояние в функциональном программировании - PullRequest
0 голосов
/ 13 апреля 2019

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

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

onLeft() {
  // try catch style
  try {
    this.state = moveLeft(this.state);
  } catch (err) {
    // oh no!
  }

  // callback style
  moveLeft(
    (err) => {
     // oh no!
    }, 
    (newState) => {
      this.state = newState 
    }
  );

  // return false for invalid state
  this.state = moveLeft(this.state) || this.state;
}

1 Ответ

0 голосов
/ 12 июля 2019

Я знаю, что в играх много состояний, и что большинство ресурсов игровой разработки сильно зависят от упа, но состояние здесь видоизменяется во многих местах.Это уменьшает преимущества fp и приводит к запутанным ситуациям, подобным этому.

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

Когда несколько строк кода изменяют состояние, и вы используете методы в классе для выполнения реальных мутаций, вы действительно выполняете oop.Обработка нелегальных ходов игрока как ошибки не имеет смысла для меня.Зачем вам разрабатывать программу, которая позволяет пользователям выдавать ошибки?Если вы просто ловите их и делаете что-то еще, то почему бы не создать свой собственный контейнер для их обработки?

...