Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:如何构建桌面UI_Clojure_Model_Javafx_Cad - Fatal编程技术网

Clojure:如何构建桌面UI

Clojure:如何构建桌面UI,clojure,model,javafx,cad,Clojure,Model,Javafx,Cad,我正试图为原理图、布局和绘图设计一个桌面用户界面。只是从实际的软件设计师那里寻求高层次的建议 假设内存中有一个“数据库”(所有用户数据的任意深度clojure映射,可能还有另一个应用程序首选项的clojure映射,等等),我正在研究如何在这些数据库上执行模型-视图-控制器操作,其中数据可以由以下任意一个或多个对象渲染和修改: 显示单个参数(如框宽)的独立文本字段 “检查器”类型的视图,显示选定对象的多个参数,如框宽、高度、颜色、复选框等 一种表/电子表格类型的视图,显示多个对象(可能是整个数据库

我正试图为原理图、布局和绘图设计一个桌面用户界面。只是从实际的软件设计师那里寻求高层次的建议

假设内存中有一个“数据库”(所有用户数据的任意深度clojure映射,可能还有另一个应用程序首选项的clojure映射,等等),我正在研究如何在这些数据库上执行模型-视图-控制器操作,其中数据可以由以下任意一个或多个对象渲染和修改:

  • 显示单个参数(如框宽)的独立文本字段
  • “检查器”类型的视图,显示选定对象的多个参数,如框宽、高度、颜色、复选框等
  • 一种表/电子表格类型的视图,显示多个对象(可能是整个数据库)的多个参数
  • 整个事物的图形化渲染,如原理图和布局视图
  • 修改其中任何一个应该立即显示在每个其他活动视图中,包括文本和图形视图,而不是在单击“确定”之后。。。因此,不允许使用模态框。如果出于某种原因,表视图、检查器视图和图形呈现都在视图中,则以图形方式拖动方框的角应立即显示在文本中,等等

    所讨论的平台是JavaFX,但我希望UI和其他一切之间有一个清晰的分离,因此我希望避免JFX意义上的绑定,因为这将我的设计数据与JFX属性紧密地联系在一起,增加了模型的颗粒度,并迫使我在处理数据的标准clojure函数之外工作,和/或与整个
    getValue
    /
    setValue
    世界打交道

    我仍然假设至少有一些状态性/可变性,以及使用内置Clojure功能,例如在atom/var/ref上添加watch,并让运行时信号依赖函数

    特定于平台的交互将紧密依赖于实际的UI,例如具体化
    ActionListener
    s,处理
    ObservalEvalue
    s等,并将尝试将实际应用程序数据对JavaFX
    Property
    等的依赖降至最低。我不想为此而生气

    我不介意扩展JFX接口或制定自己的协议来使用特定于应用程序的
    defrecord
    s,但我更希望应用程序数据保持为直接的Clojure数据,不受平台的污染

    问题是如何建立这一切,最接近于不变的模型。我看到一些选择:

  • 细粒度:每个参数值/原语(即Long、Double、Boolean或String)都是一个原子,每个可以修改值的视图在数据库中“到达”以更改值。这可能很糟糕,因为可能有数千个单独的值(例如手绘曲线上的点),并且需要大量的
    (deref…
    垃圾。我相信这就是JFX想要做的,在叶子节点上有巨大的属性数组,等等,这让人感觉臃肿。使用这种方法似乎并不比用Java/C++编写代码好多少
  • 中等粒度:数据库中的每个对象/记录都是Clojure映射的一个原子。当其任何一个值更改时,将替换整个贴图。需要处理的总原子数更少,并且允许例如各种事情的直线数字的长数组。但当数据库中的某些对象需要比其他对象更多的嵌套时,这就变得复杂了
  • 粗粒度:只有一个原子:数据库。任何时候发生任何更改,都会替换整个数据库,每个视图都需要重新渲染其特定部分。这感觉有点像用锤子打苍蝇,而一个幼稚的实现将需要所有的东西一直重新渲染。但我仍然认为这是最好的折衷,因为任何原语都有一个从根节点开始的清晰访问路径,无论它是在每原语级别还是每记录级别上访问的
  • 我还需要能够多次实例化一个数据模板。因此,例如,如果用户更改了在多个位置使用的符号或形状,则单个编辑将应用于所有位置。我相信这也需要一些类似“指针”的行为。我想我可以将一个原子存储到模型中,然后根据需要实例化,它可以在上述任何一种粒度模型中工作

    还有其他方法吗?在函数式语言中尝试使用GUI编辑器之类的工具是愚蠢的吗?
    谢谢

    我不认为使用函数式语言来做GUI编辑器之类的工具是愚蠢的。但我不能声称对你的问题有答案。以下是一些可能对您的旅程有所帮助的链接:

  • 斯图尔特·塞拉-
  • Chris Granger-:解释()是如何构造的
  • 克里斯·格兰杰-:与上述视频相关的博客帖子
  • Conal Elliott-:用于创建可组合的UI,但他的代码在Haskell中
  • Nathan Herzing和Chris Shea-
  • David Nolen-:在ClojureScript中显示了简化UI编程的所有方法。这里的想法可以在桌面UI中使用
  • Rich Hickey-:Clojure的创建者关于系统编程的精彩演讲
  • 对功能代码与命令代码有很好的引用:

    …不管是Haskell、C#Java、F#、Scala、Python、PHP,都要考虑一个想法,那就是拥有大量与外部世界交互的命令式代码,在这些代码中有许多纯代码岛,您可以用纯方法编写函数。 但你必须决定这些岛屿有多大,海洋有多大。但答案永远不是只有岛屿或海洋。一个好的程序员确切地知道正确的平衡


    当您将JavaFX作为GUI工具包时,研究(一个用于图形化编辑JavaFX场景的库框架)及其可能会对您有所帮助。它的一些功能与您描述的类似,但有所不同。它是红色的