javafx - 是否可以将马里奥示例从 Elm 转换为纯 JavaFX 或 JavaFX+RxJava,同时保留 Elm 的高级抽象?

标签 javafx system.reactive reactive-programming rx-java elm

我最近看到了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。

enter image description here

最佳答案

我快速浏览了 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 场景图中的有效呈现。

你可以做的是:
  • 为 JavaFX 创建这样一个小部件库;
  • 甚至将 Elm 编译为 JavaFX(而不是 HTML+JavaScript)。

  • 我很想看到其中任何一个完成。

    (*) 我认为榆树 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/

    相关文章:

    java - 在 javaFX 中的 Togglegroup 上没有按下 toggleButton 时收听

    java - 在使用 gradle 构建 Kotlin 应用程序时,在 Jar 中找不到主类

    c# - 获取包含可观察属性的对象列表的单个可观察值?

    c# - 我可以通过匹配键将两个可观察序列配对——使用重复键吗?

    失去焦点后不调用 JavaFX onInputMethodTextChanged

    java - Platform.runLater 问题 - 延迟执行

    swift - 如何跟踪 rxSwift 是否更改了 textField 值?

    scala - 连接数百个 RxScala Observables(每个都有数百万个事件要发出)的有效方法?

    rxjs - 每当另一个 Observable 发射时跳过来自源的下一次发射的运算符

    java - RxJava - 在 Observable<List<Service>> 中等待所有服务的 Observable<Boolean>