5

Elm でのリアクティブ プログラミングに関する興味深いプレゼンテーションを最近見ました

これは、マリオ ゲームを実装するために使用される言語構造 (表示されているプレゼンテーションと下の図でも) が、純粋な JavaFX または RxJava と組み合わせた JavaFX のいずれかで、同様の高レベル言語構造にマッピングできるかどうか疑問に思いました。

言い換えれば、Elm に実装されたマリオ ゲームを JavaFX 単独または JavaFX+RxJava で同じ概念的抽象化 (つまり、時間依存の値) を使用して表現することは可能でしょうか?

したがって、経験豊富な 1) JavaFX プログラマーまたは経験豊富な 2) JavaFX+RxJava+Functional プログラマーがマリオ ゲームを Elm から 1) JavaFX または 2) JavaFX+RxJava に移植したい場合、どのプログラマーが同様の高機能を使用してこのタスクを達成できますか? - Elm で使用されていたようなレベルの抽象化?

私が JavaFX で考えている抽象化はバインディングであり、JavaFX+RxJava ではバインディング + オブザーバブル / サブジェクト / サブスクリプションです。

ここに画像の説明を入力

4

4 に答える 4

7

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)
于 2014-05-29T23:54:42.940 に答える
2

私はこの質問を1年前に提起しました。それ以来、私は FRP について 1 つまたは 2 つのことを学びました。答えはノーだと思います。少なくとも RX では簡単ではありません。JavaFX+ Sodium FRPライブラリを使用する方がはるかに良いでしょう。

RX で (非常に簡単に) できないのはなぜですか? ELMはFRPであるのに対し、RXはFRPからトランザクションを差し引いたものです(漠然と言えば)。したがって、実際には、ELM でマリオ ゲームを実装したい場合は、トランザクションを RX に追加する必要があります (グリッチを回避するため)。

于 2015-07-08T16:25:20.960 に答える