Каков наиболее элегантный способ работы с внешней библиотекой с внутренним состоянием с использованием языка программирования функций? - PullRequest
11 голосов
/ 05 сентября 2010

В настоящее время я занимаюсь разработкой Scala, но мне нужно интегрироваться с библиотеками, такими как box2d, для управления физикой.Проблема заключается в том, что это требует зависимости от внешней библиотеки, которая управляет своим собственным состоянием.Вы отслеживаете тела, которые вы передаете в мир box2d.Подводя итог аспектам в игре:

  • Box2d управляет состоянием в мире и изменяет их после каждого тика / шага
  • Вы создаете (используя FP) тела, которые передаются вэтот мир
  • Box2d внутренне изменяет состояние этих тел
  • Для отслеживания объектов, на которые вы ссылаетесь,
  • Скорее всего, вы захотите использовать информациюв теле для визуализации вашего кода, поэтому я предполагаю, что единственный способ отслеживать эту информацию - отслеживать все ссылки в изменяемой коллекции.Нужно пережить все кадры.

Итак, мой вопрос:

Как вы можете элегантно отслеживать эти ссылки (для функционального программирования) и как минимизировать влияние, которое он оказывает начистота в остальной части вашего кода?

Такие вещи, как государственные монады, не помогут мне здесь, я думаю

Ответы [ 2 ]

5 голосов
/ 05 сентября 2010

Самый практический способ - определить, какие инварианты должны храниться для инкапсулирования нечистых действий, без утечки информации о наличии побочных эффектов, а затем, когда у вас есть доказательства того, что это так, скрытьсостояние внутри "unsafePerformIO".

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

3 голосов
/ 05 сентября 2010

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

...