Ich habe einen Algorithmus erstellt, der bestimmte Dinge berechnet. Dies kann als Modell angesehen werden. Der Algorithmus ist voll funktionsfähig implementiert, so dass nur unveränderliche Klassen verwendet werden. Jetzt möchte ich mit diesem Modell eine GUI-Ebene auf der Oberseite entwickeln. Ich weiß jedoch nichts über die Best Practices beim Erstellen von GUI in Scala. Ich beabsichtige, ScalaFX zu verwenden.
Mein Problem ist folgendes: In ScalaFX (ähnlich wie JavaFX) können Sie Werte von der GUI an Objekteigenschaften binden. Dies verstößt eindeutig gegen das funktionale Paradigma, scheint aber sehr praktisch zu sein. Dies würde erfordern, meine Klassen neu zu schreiben, um bindbare Eigenschaften zu verwenden, die sich anfühlen würden, als würde der Schwanz mit dem Hund wedeln - das Modell würde von der GUI abhängen.
Auf der anderen Seite könnte ich eine unabhängige GUI-Ebene haben. In diesem Fall würde ich Proxyobjekte benötigen, um zu binden, und ich würde meine Modellobjekte basierend auf diesen Proxyobjekten erstellen müssen. Dies würde sich mehr idiomatisch anfühlen, beinhaltet jedoch viel Code-Duplizierung und zusätzliche Arbeit. Mein Modell und die Proxy-Objekte müssten synchronisiert werden, und ich müsste mich um das Kopieren der Attribute kümmern.
Was ist ein guter Weg, dies zu tun? Eine GUI ist immer voll veränderbar, so dass sich die funktionale Programmierung hier nicht richtig anfühlt. Nichtsdestotrotz liebe ich Scala und möchte es auch weiterhin für die GUI verwenden.
Trotz der zusätzlichen Anstrengung, nehmen Sie den zweiten Ansatz. Erstellen Sie kleine veränderbare "view" -Instanzen für jedes Modell. Binden Sie die Ansichten an die Widgets und installieren Sie Beobachter oder Hooks, die die Ansichts-Proxys basierend auf Änderungen in Ihrem Modell aktualisieren. Lassen Sie die GUI-API nicht diktieren, wie Ihr Ansatz und Ihr Modell für den gemeinsamen Zugriff aussehen sollten.
Ich glaube, dass es ein paar Open-Source-Bibliotheken gibt, die dem einfachen Scala-Swing oder Scala-FX eine funktionalere und / oder reaktive Abstraktionsebene bieten.
Tags und Links scala user-interface javafx immutability scalafx