Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
Scala、GUI和不变性_Scala_User Interface_Javafx_Immutability_Scalafx - Fatal编程技术网

Scala、GUI和不变性

Scala、GUI和不变性,scala,user-interface,javafx,immutability,scalafx,Scala,User Interface,Javafx,Immutability,Scalafx,我创建了一个计算某些事情的算法。这可以看作是一个模型。该算法是以全功能方式实现的,因此它只使用不可变类。 现在使用这个模型,我想在上面开发一个GUI层。然而,我对在Scala中构建GUI的最佳实践一无所知。我打算使用ScalaFX 我的问题如下:在ScalaFX(类似于JavaFX)中,可以将GUI中的值绑定到对象属性。这显然违反了功能范式,但似乎非常方便。 这将需要重写我的类,以使用可绑定属性,这就像尾巴摇狗一样——模型将依赖于GUI 另一方面,我可以有一个独立的GUI层。在这种情况下,我需要

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

我的问题如下:在ScalaFX(类似于JavaFX)中,可以将GUI中的值绑定到对象属性。这显然违反了功能范式,但似乎非常方便。 这将需要重写我的类,以使用可绑定属性,这就像尾巴摇狗一样——模型将依赖于GUI

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


这样做的好方法是什么?GUI总是充满了易变性,因此函数式编程在这里感觉不太好。尽管如此,我还是喜欢Scala,所以我也希望继续在GUI中使用它。

尽管付出了额外的努力,还是采用第二种方法。为每个模型创建小的可变“视图”实例。将视图绑定到小部件,并安装观察器或挂钩,根据模型中的更改更新视图代理。不要让GUI API规定您的并发方法和模型应该是什么样子


我相信有一些开源库为普通的Scala Swing或Scala FX提供了更具功能性和/或反应性的抽象层。

“GUI总是充满了易变性,因此函数式编程在这里并不合适。”。用正确的方式斜视它,它就不那么易变了: