【发布时间】:2012-03-23 11:27:03
【问题描述】:
我想要一个用于 clojure/seesaw 应用程序的简单时间线组件(如在视频编辑软件中),我想知道直接用 clojure 和 seesaw 实现它是否是一种好方法,或者我是否应该用 java 编写它并制作我的clojure包装器。
或更笼统地说:函数式编程语言是否最适合编写 UI 小部件?我无法想象在没有涉及很多状态的情况下这样做。 OO 最初不是为 UI 开发而发明的吗?
【问题讨论】:
我想要一个用于 clojure/seesaw 应用程序的简单时间线组件(如在视频编辑软件中),我想知道直接用 clojure 和 seesaw 实现它是否是一种好方法,或者我是否应该用 java 编写它并制作我的clojure包装器。
或更笼统地说:函数式编程语言是否最适合编写 UI 小部件?我无法想象在没有涉及很多状态的情况下这样做。 OO 最初不是为 UI 开发而发明的吗?
【问题讨论】:
你可以选择任何一种方式。在 Overtone 上,我们使用 Seesaw 构建了许多自定义图形组件directly in Clojure。很多时候,一个原子和(seesaw.core/canvas) 就足够了。
根据您的喜好,在 Clojure 中执行此操作的一个原因是您可以将 Seesaw 的协议(选择、绑定等)扩展到新的小部件,以便它与 Seesaw 无缝协作。另一个考虑因素是您的小部件是否需要使用来自应用程序其他部分的 Clojure 数据。这在 Clojure 中将比 Java 更简洁。
也就是说,如果您对 Swing/Java 感到满意,您可以在那里进行,Seesaw 将非常乐意使用 Java 构建的自定义小部件。祝你好运!
【讨论】:
FP 非常适合进行 UI 编程,但底层 UI 框架也应该基于 FRP 等 FP 概念。在您的情况下,底层 UI 框架(Swing)是基于 OO 的,因此它更容易实现它在 Java 中,但您仍然可以在跷跷板中完成。
【讨论】:
在其他条件相同的情况下(即假设您同时了解 Clojure 和 Java),我可能会将其编写为 Java 中的自定义 Swing 组件。
原因:
当然,对于应用程序逻辑本身,我当然更喜欢 Clojure。
【讨论】:
(set! (. objectExpr fieldName) expr),但即便如此,它还是不如objectExpr.fieldName=expr 方便(尤其是当你考虑缺少静态类型检查并且需要类型提示来避免反射等时)。除此之外,您根本不能使用在 OOP GUI 代码中非常有用的可变局部变量。虽然我很喜欢 Clojure,但它对于管理本地单线程可变状态并不是最方便的。