Я пытаюсь выяснить подход, который нужно сделать, чтобы 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, а не "типом" или реализацией интерфейса чего-либо. Целое число должно быть целым числом и т.д.
спасибо