Clojure : 데스크탑 UI를 설계하는 방법


Answers

Question

레이아웃, 도면, 도면 등의 데스크탑 UI를 디자인하려고합니다. 실제 소프트웨어 디자이너로부터 높은 수준의 조언을 찾고 있습니다.

메모리 내 "데이터베이스"(모든 사용자 데이터에 대한 임의의 깊이의 클로우 져 맵 및 응용 프로그램 환경 설정에 대한 또 다른 깊이 맵 등)를 가정하여 모델 뷰 컨트롤러를 수행하는 방법을 검토하고 있습니다. 데이터는 다음 중 하나 이상에 의해 렌더링 되고 수정 될 수 있습니다.

  1. 상자 너비와 같은 단일 매개 변수를 표시하는 독립 실행 형 텍스트 필드입니다.
  2. 상자 너비, 높이, 색상, 확인란 등과 같이 선택한 객체의 여러 매개 변수를 표시하는 "관리자"유형의보기입니다.
  3. 잠재적으로 전체 데이터베이스 인 여러 객체의 여러 매개 변수를 표시하는 표 / 스프레드 시트 유형의보기
  4. 도식 및 레이아웃보기와 같은 모든 것을 그래픽으로 렌더링합니다.

이 중 하나를 수정하면 "ok"를 클릭하지 않고 텍스트 및 그래픽으로 다른 모든 활성보기에 즉시 표시되어야하므로 모달 상자가 허용되지 않습니다. 어떤 이유로 테이블보기, 관리자보기 및 그래픽 렌더링이 모두 보이면 상자의 모서리를 그래픽으로 즉시 드래그해야합니다.

문제의 플랫폼은 JavaFX이지만 UI와 다른 모든 것들을 명확하게 구분하고 싶습니다. JFX 속성에 bind 하는 것을 피하고 싶습니다. JFX 속성에 내 설계 데이터를 매우 긴밀하게 연결하고 모델을 사용하고, 데이터 처리를위한 표준 클로저 함수 밖에서 작업하거나 전체 getValue / setValue 월드를 크게 처리해야합니다.

나는 여전히 최소한 statefulness / mutability와 원자 / var / ref에서 add-watch 하는 기능과 같은 내장 Clojure 기능의 사용을 가정하고 있으며 런타임 신호가 종속적 인 기능을하도록한다.

플랫폼 고유의 상호 작용은 ActionListener 를 수정하고 ObservableValue 등을 처리하는 것과 같이 실제 UI로 엄격하게 처리되며 실제 응용 프로그램 데이터에 대한 JavaFX Property 와 같은 것에 대한 의존도를 최소화하려고 시도합니다. 나는 이것을 위해 FRP를 접대하지 않는다.

JFX 인터페이스를 확장하거나 애플리케이션 고유의 defrecord 를 사용하기 위해 자체 프로토콜을 만드는 것은 defrecord .하지만 애플리케이션 데이터가 플랫폼에 의해 defrecord 곧은 Clojure 데이터로 유지되는 것을 선호합니다.

문제는 불변 모델을 가장 잘 준수하면서이 모든 것을 설정하는 방법입니다. 몇 가지 옵션이 있습니다.

  1. 미세 입자 : 각 매개 변수 값 / 프리미티브 (즉, Long, Double, Boolean 또는 String)는 원자이며 값을 수정할 수있는 각보기는 값을 변경하기 위해 데이터베이스에서 필요한만큼 "도달"합니다. 잠재적으로 수천 개의 개별 값 (예 : 손으로 그린 ​​곡선의 점)이있을 수 있고 많은 (deref...) 쓰레기가 필요할 수 있기 때문에 빨기도합니다. 이것이 JFX가 리프 노드에서 Properties의 거대한 배열을 사용하여 이것을 수행하는 방법이라고 생각합니다. 이는 부풀어 오른 느낌입니다. 이 방법을 사용하면 Java / C ++로 코딩하는 것보다 훨씬 나아지지 않습니다.
  2. 중간 그레인 : 데이터베이스의 각 오브젝트 / 레코드는 Clojure 맵의 아톰입니다. 값이 변경되면 전체 맵이 대체됩니다. 처리 할 총 원자 수를 줄이고, 예를 들어 다양한 것들에 대한 직선 숫자의 긴 배열을 허용합니다. 그러나 데이터베이스의 일부 개체가 다른 개체보다 중첩이 필요한 경우에는 복잡해집니다.
  3. 굵은 입자 : 데이터베이스는 단지 하나의 원자가 있습니다. 모든 것이 바뀌면 데이터베이스 전체가 바뀌고 모든 뷰는 특정 부분을 다시 렌더링해야합니다. 이것은 해머를 사용하여 날아 다니는 것처럼 조금씩 느껴지 며 순진한 구현을 위해서는 항상 모든 것을 다시 렌더링해야합니다. 그러나 원시적 인 수준 또는 레코드 단위의 수준에서 액세스되는지에 관계없이 루트 노드에서 명확한 액세스 경로가있는 프리미티브가 있으므로 이것이 최상의 트레이드 오프라고 생각합니다.

또한 하나의 데이터 템플릿을 여러 번 인스턴스화하는 기능이 필요합니다. 예를 들어 사용자가 여러 장소에서 사용되는 기호 나 모양을 변경하면 모든 편집이 하나의 수정으로 적용됩니다. 나는 이것이 또한 "포인터"와 같은 행동을 필요로한다고 믿는다. 나는 모델에 원자를 저장할 수 있고 필요에 따라 인스턴스화 할 수 있으며 위의 곡물 모델에서 작동 할 수 있다고 생각합니다.

다른 접근법? 기능적인 언어로 GUI 편집기와 같은 도구를 사용하려고하는 것은 어리석은 일입니까? 감사




Links