2014-11-16 41 views
8

我創建了一個計算某些東西的算法。這可以被視爲模型。該算法以全功能的方式實現,因此它只使用不可變類。 現在使用這個模型,我想在它的頂部開發一個GUI層。不過,我不知道在Scala中構建GUI的最佳做法。我打算使用ScalaFX。Scala,GUI和不變性

我的問題是:在ScalaFX(類似於JavaFX)中,您可以將GUI中的值綁定到對象屬性。這顯然違反了功能範式,但看起來非常方便。 這將需要重寫我的類來使用可以綁定的屬性,這會感覺像尾巴搖擺狗 - 模型將取決於GUI。

另一方面,我可以有一個獨立的GUI層。在這種情況下,我需要代理對象綁定到,我將不得不基於這些代理對象創建我的模型對象。這會感覺更習慣,但意味着很多代碼重複和額外的工作。我的模型和代理對象必須保持同步,我必須照顧複製屬性。

這樣做的好方法是什麼? GUI總是充滿了可變性,所以函數式編程並不適合這裏。儘管如此,我還是喜歡Scala,所以我想繼續將它用於GUI。

+2

「圖形用戶界面總是充滿可變性,所以函數式編程並不適合這裏。」斜視它正確的方式,它不是很可變:http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming –

回答

5

儘管付出了額外的努力,採取第二種方法。爲每個模型創建小型可變「查看」實例。將視圖綁定到窗口小部件,並根據模型中的更改安裝更新視圖代理的觀察者或掛鉤。不要讓GUI API指定您的併發方法和模型應該如何。

我相信周圍有一些開源的庫可以爲普通的Scala-Swing或Scala-FX提供更多功能和/或反應性的抽象層。