Elm をざっと見てみましたが、非常に印象的です (そして表現力豊かです)。
Elm では、シーンを次のように構築します。
Signal Element
これはJavaFXではほぼ同等です
ObservableValue<Node>
JavaFX への単純な変換は、更新のたびにシーン全体を交換することを意味し、非常にコストがかかります。Elm ではElement
、画面外 (DOM 外) に構築された、シーン ノードの不変の抽象表現です。更新のたびにシーン グラフ全体を再作成するのに十分なコストがかかります (不変性のため、変更されていないブランチを安全に再利用できます)。ルートElement
はDOMにレンダリングされますが、私が理解しているように、完全なDOMが構築されるのは初めてです。その後の更新では、Elm ランタイムはアルゴリズムを実行して新しいルート要素を古いものと比較し、更新が必要な DOM の部分のみを変更します。これは十分に高速です。React.jsでも同じ手法が使用されています. そのため、Elm と React.js はどちらも高レベルの機能抽象化を提供しますが、パフォーマンス上の理由から内部で可変性を使用します。
いくつかの追加の構文ノイズを使用すると、ほとんどの Elm 構造を JavaFX (*)に変換できます。例えば、
lift2 display Window.dimensions gameState
と同等です
import static org.fxmisc.EasyBind.*;
combine(Window.dimensions, gameState, display)
欠けているのは、不変の抽象的なウィジェット表現のライブラリと、JavaFX シーン グラフへの効率的なレンダリングです。
あなたができることは次のとおりです。
- そのような JavaFX 用のウィジェット ライブラリを作成します。
- または、Elm を (HTML+JavaScript の代わりに) JavaFX にコンパイルすることもできます。
私はそれらのいずれかが行われるのを楽しみにしています。
(*) Elmレコードは非常に強力で、Java で多くのボイラープレートが必要になると思います(またはスカラ).
エルム:
type Point = { x:Float, y:Float }
p = { 0.0, 0.0 }
q = { p | x <- 5.0 }
ジャワ:
class Point {
public final float x;
public final float y;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
public Point updateX(float x) {
return new Point(x, y);
}
public Point updateY(float y) {
return new Point(x, y);
}
}
Point p = new Point(0.0, 0.0);
Point q = p.updateX(5.0);
スカラ:
case class Point(x: Float, y: Float)
val p = Point(0.0, 0.0)
val q = p.copy(x = 5.0f)