Подтвердить что ты не робот

JavaFX и Clojure: привязка наблюдаемых к неизменяемым объектам

Я пытаюсь выяснить подход, который нужно сделать, чтобы JavaFX TableView (или любая другая вещь JavaFX) представлял некоторые данные Clojure и позволял пользователю манипулировать данными через графический интерфейс.

Для этого обсуждения предположим, что у меня есть список/вектор карт, т.е. что-то вроде [{:col1 "happy1" :col2 "sad1"} {:col1 "happy2" :col2 "sad2"}], и я хочу, чтобы он отображался в графической таблице следующим образом:

mykey1      mykey2
------------------
happy1      sad1
happy2      sad2

Довольно просто. Это было сделано в истории человечества в разы.

Проблема заключается в том, что TableView настаивает на принятии ObservableList и т.д., который по своей сути является изменчивым, как и все наблюдаемые в JavaFX. Это отлично подходит для поддержания актуальности таблицы и в изменяемой модели, что также отлично подходит для того, чтобы пользователь мог напрямую манипулировать данными через графический интерфейс. Я не эксперт, но в этом случае кажется, что JavaFX хочет, чтобы объект GUI фактически содержал реальные данные. Это кажется забавным (не ха-ха) для меня. Чтобы поддерживать мою собственную модель и общаться между графическим интерфейсом и моделью через некоторый API или интерфейс, также подразумевается, что я поддерживаю данные в двух местах: в моей собственной модели и в графическом интерфейсе. Является ли это правильным способом ведения дел? Возможно, это нормально, поскольку графический интерфейс только отображает небольшую часть общих данных, и он позволяет моим данным модели просто быть нормальными данными модели, а не экземпляром какого-либо Java-производного типа.

Таким образом, это приводит к следующим трем общим вопросам при попытке включить графический интерфейс в безстоящую/неизменяемую модель:

  • Как модель под ней будет действительно неизменной, если GUI обязательно позволит вам изменить ситуацию? Я думаю конкретно о каком-то инструменте проектирования, редакторе и т.д., Где пользователь явно меняет ситуацию. Например, LightTable - это редактор, но история заключается в том, что он основан на неизменных данных. Как это может быть? Я не заинтересован в FRP для обсуждения.

  • Предполагая, что на каком-то уровне существует хотя бы один Atom или другой Clojure изменяемый тип (ref/var/agent/etc) (будь то одиночный Atom, содержащий всю конструкцию в памяти базы данных или база данных дизайна является неизменным списком изменяемых Atoms), какая из моделей [MVP, MCP, MVVM и т.д.] лучше всего подходит для этого типа создания?

  • JavaFX поместил иерархию классов с любой возможной вариацией интерфейса Observable (http://docs.oracle.com/javafx/2/api/javafx/beans/Observable.html) с такими драгоценными камнями, как Observable[whatever]Value, включая, например, ObservableMap и ObservableMapValue, а затем десятки десятков реализующих классов, таких как IntegerProperty и SimpleIntegerProperty... geez! WTF?. Предполагая, что мне нужно создать некоторые объекты Clojure (defrecord и т.д.) И реализовать некоторые из методов интерфейса Observable на моих основном неизменяемых объектах, могу ли я просто придерживаться Observable, или я должен реализовать каждый вплоть до листа node, т.е. ObservableIntegerValue и т.д.

Каков правильный подход на высоком уровне? Поддерживать один атом верхнего уровня, который заменяется каждый раз, когда пользователь меняет значение? Поддерживать тысячу низкоуровневых атомов? Пусть мои ценности живут как JavaFX Observables и забывают о структурах данных Clojure? Реализовать мой собственный набор Observables в Clojure с помощью некоторого reify/proxy/gen-class, но реализовать их как неизменяемые, которые заменяются каждый раз при внесении изменений? Есть ли необходимость или место для функции Clojure add-watch? Я бы очень хотел, чтобы мои данные были обычными данными в Clojure, а не "типом" или реализацией интерфейса чего-либо. Целое число должно быть целым числом и т.д.

спасибо

4b9b3361