Scala、GUI 和不变性

标签 scala user-interface javafx immutability scalafx

我创建了一个计算某些事物的算法。这可以被认为是模型。该算法以全功能方式实现,因此它仅使用不可变类。
现在使用这个模型,我想在它上面开发一个 GUI 层。但是,我对在 Scala 中构建 GUI 的最佳实践一无所知。我打算使用 ScalaFX。

我的问题如下:在 ScalaFX(类似于 JavaFX)中,您可以将 GUI 中的值绑定(bind)到对象属性。这显然违反了函数范式,但看起来很方便。
这将需要重写我的类以使用可绑定(bind)的属性,这感觉就像摇尾部一样——模型将依赖于 GUI。

另一方面,我可以有一个独立的 GUI 层。在这种情况下,我需要绑定(bind)代理对象,并且必须基于这些代理对象创建模型对象。这会感觉更惯用,但意味着大量的代码重复和额外的工作。我的模型和代理对象必须保持同步,并且我必须负责复制属性。

这样做的好方法是什么? GUI 总是充满了可变性,所以函数式编程在这里并不合适。尽管如此,我还是喜欢 Scala,所以我也想继续将它用于 GUI。

最佳答案

尽管付出了额外的努力,但还是采取第二种方法。为每个模型创建小的可变“ View ”实例。将 View 绑定(bind)到小部件并安装观察者或 Hook ,以根据模型中的更改更新 View 代理。不要让 GUI API 决定你的并发方法和模型应该是什么样子。

我相信有一些开源库可以为普通的 Scala-Swing 或 Scala-FX 提供更多功能和/或 react 性的抽象层。

关于Scala、GUI 和不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962359/

相关文章:

java - 在外部 jar 中查找文件而不是在我的类路径中

scala - Scala脚本和应用程序之间的区别

python - 如何使用 python PyQt5 确定我的应用程序(窗口)的事件屏幕(监视器)?

java - Java中JTextArea的自动动态扩展/收缩

java - Maven、JavaFX、Launch4J-Maven-plugin - 如何捆绑 JRE?

java - Scala 中的 Drools Expert 输出对象

scala - 如何从 ListBuffer 中删除多个索引(快速)?

java - 如何在javafx中绘制一条直线,当用户移动鼠标时它会自行更新?

java - 如何在 JavaFx 中动态更改舞台的高度

javafx - 分发使用自动模块的 JavaFX 应用程序