我最近看到了this关于 Elm 中响应式(Reactive)编程的有趣演示。
这让我想知道用于实现马里奥游戏的语言结构(在显示的演示文稿中以及在下图中)是否可以映射到类似的 高层语言结构是纯 JavaFX 还是 JavaFX 与 RxJava 结合?
换句话说,是否有可能在单独的 JavaFX 或 JavaFX+RxJava 中使用相同的概念抽象(即时间相关值)来表达在 Elm 中实现的马里奥游戏?
因此,如果有经验的 1) JavaFX 程序员或有经验的 2) JavaFX+RxJava+Functional 程序员想要将马里奥游戏从 Elm 移植到 1) JavaFX 或 2) JavaFX+RxJava,那么哪个程序员可以通过 完成此任务使用类似的高级抽象 就像在 Elm 中使用的那样?
我想到的 JavaFX 的抽象是绑定(bind),而 JavaFX+RxJava 的抽象是绑定(bind)+Observables/Subjects/Subscription。
最佳答案
我快速浏览了 Elm,它给人留下了深刻的印象(并且富有表现力)。
在 Elm 中,您将场景构建为
Signal Element
在 JavaFX 中大致相当于
ObservableValue<Node>
对 JavaFX 的幼稚转换意味着您在每次更新时交换整个场景,这是非常昂贵的。在榆树,
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 场景图中的有效呈现。
你可以做的是:
我很想看到其中任何一个完成。
(*) 我认为榆树 records非常强大,需要大量 Java(或 Scala)样板。
榆树:
type Point = { x:Float, y:Float }
p = { 0.0, 0.0 }
q = { p | x <- 5.0 }
java :
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)
关于javafx - 是否可以将马里奥示例从 Elm 转换为纯 JavaFX 或 JavaFX+RxJava,同时保留 Elm 的高级抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22795062/