gpt4 book ai didi

Clojure:如何构建桌面 UI

转载 作者:行者123 更新时间:2023-12-03 00:40:21 27 4
gpt4 key购买 nike

我正在尝试为原理图、布局、绘图内容设计桌面 UI。只是寻求实际软件设计师的高级建议。

假设一个内存中的“数据库”,(所有用户数据的任意深度的clojure map ,可能还有另一个应用程序首选项等),我正在研究如何在这些数据库上做模型- View - Controller 的事情,其中数据可以由以下任何一个或多个渲染和修改:

  • 显示单个参数(例如框宽度)的独立文本字段。
  • 一种“检查器”类型的 View ,显示选定对象的多个参数,例如框的宽度、高度、颜色、复选框等。
  • 一种表格/电子表格类型的 View ,显示多个对象的多个参数,可能是整个数据库
  • 整个事物的图形渲染,例如原理图和布局 View 。

  • 修改其中任何一个都应该立即显示在所有其他事件 View 中,包括文本和图形,而不是在单击“确定”之后......所以不允许使用模态框。如果由于某种原因表 View 、检查器 View 和图形渲染都在 View 中,则以图形方式拖动框的角应立即显示在文本中,等等。

    有问题的平台是 JavaFX,但我希望 UI 和其他所有内容之间完全分离,所以我想避免 JFX 意义上的 bind ing,因为这将我的设计数据与 JFX 属性紧密联系在一起,增加了模型,并迫使我在处理数据的标准 clojure 函数之外工作,和/或大量处理整个 getValue/ setValue 世界。

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

    特定于平台的交互将与实际 UI 紧密相关,例如具体化 ActionListener 和处理 ObservableValue 等,并将尝试最大程度地减少对 JavaFX Property 等实际应用程序数据的依赖。我不会为此取悦 FRP。

    我不介意扩展 JFX 接口(interface)或编写自己的协议(protocol)以使用特定于应用程序的 defrecord s,但我更希望应用程序数据保持为纯 Clojure 数据,不受平台影响。

    问题是如何设置这一切,最接近不可变模型。我看到几个选项:
  • 细粒度:每个参数值/原语(即 Long、Double、Boolean 或 String)都是一个原子,每个 View 都可以修改值“到达”数据库中需要更改的值.这可能很糟糕,因为可能有数千个单独的值(例如手绘曲线上的点),并且需要大量 (deref...) 垃圾。我相信这就是 JFX 想要这样做的方式,在叶节点等处有巨大的属性数组,感觉很臃肿。使用这种方法似乎并不比仅用 Java/C++ 编写代码好多少。
  • 中等粒度:数据库中的每个对象/记录都是 Clojure 映射的一个原子。当任何一个值发生变化时,整个 map 都会被替换。要处理的原子总数更少,并且允许例如用于各种事物的长数组的直接数字。但是当数据库中的某些对象需要比其他对象更多的嵌套时,这会变得复杂。
  • 粗粒度:只有一个原子:数据库。任何时候发生任何变化,整个数据库都会被替换,并且每个 View 都需要重新呈现其特定部分。这感觉有点像用锤子打苍蝇,一个幼稚的实现需要所有的东西一直重新渲染。但我仍然认为这是最好的权衡,因为任何原语都有一个从根节点开始的清晰访问路径,无论是在每个原语级别还是每个记录级别上访问。

  • 我还需要能够多次实例化一个数据模板。因此,例如,如果用户更改了在多个地方使用的符号或形状,则单个编辑将应用到任何地方。我相信这也需要某种类似“指针”的行为。我想我可以将一个原子存储到模型中,然后根据需要实例化,它可以在上述任何颗粒模型中工作。

    还有其他方法吗?试图用函数式语言做一个类似 GUI 编辑器的工具是愚蠢的吗?
    谢谢

    最佳答案

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

  • 斯图尔特·塞拉 - Components Just Enough Structure
  • 克里斯·格兰杰 - Light Table :解释如何Light Table ( source ) 是结构化的。
  • 克里斯·格兰杰 - The IDE as a Value :与上述视频相关的博文
  • Conal Elliott - Tangible Functional Programming : 使用 Functional Reactive Programming创建一个可组合的 UI,但他的代码是在 Haskell 中。
  • Nathan Herzing & Chris Shea - Helping voters with Pedestal, Datomic, Om and core.async
  • 大卫·诺伦 - Comparative Literate Programming : 显示所有使用 core.async简化 ClojureScript 中的 UI 编程。这里的想法可以用在桌面 UI 中。
  • Rich Hickey - The Language of the System :Clojure 的创建者关于系统编程的精彩演讲。

  • Erik Meijer有一个关于函数式代码和命令式代码的很好的引用:

    ...no matter whether it's Haskell, C# Java, F#, Scala, Python, PHP think about the idea of having a sea of imperative code that interacts with the outside world and in there have islands of pure code where you write your functions in a pure way. But you have to decide how big the islands are and how big the sea is. But the answer is never that there are only islands or only sea. A good programmer knows exactly the right balance.

    关于Clojure:如何构建桌面 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908721/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com