12

我正在尝试使用 JavaFX 和 Scala 实现一个具有一些思维导图功能的简单笔记管理器。

我正在尝试决定是否应该直接从 Scala 或通过 ScalaFX 调用 JavaFX 代码?我不知道是否值得学习 ScalaFX,直接从 Scala 代码中调用 JavaFX 会不会更简单?

ScalaFX官方网站提到了 ScalaFX 的 4 个好处:

1) 自然语言绑定表达式

- 这很好,但我并没有真正计划使用那么多绑定(我打算将 EventBus 用于 gui 组件间事件和一些用于 gui 组件内事件的绑定)。

2) 定制动画语法

-我不打算在我的项目中使用动画。

3) 完整的类型安全 API

这似乎是一个无关紧要的点……类型安全是 Java 开发人员一直拥有的东西(并且通常认为是理所当然的),而其他脚本语言的开发人员则没有(并且在不知不觉中遭受运行时错误的影响)。但是,如果您正在开发的应用程序在部署后不会出现意外的运行时错误和错误,那么它是一项关键功能。

一个好的编译器将能够通过比较预期类型和实际类型来找出许多常见的编码错误,一个好的编译器(如 Scala)会自动为您推断类型,因此您不必在整个代码中繁琐地重复它们。

ScalaFX 通过类似脚本的 DSL 语法获得了两全其美的优势,您很少需要显式类型对象,Scala 编译器的强大类型安全性将推断和检查每个表达式和 API 调用的类型。这意味着在调试奇怪的代码错误和拼写错误上花费的时间更少,而且代码质量更高!

-这看起来很有趣!但我的问题是:我怀疑直接从 Scala 调用 JavaFX 给了我与通过 ScalaFX 调用 JavaFX 相同的类型安全保证,或者不是?我不知道。

4) 无缝 JavaFX/ScalaFX 互操作性:

- 如果我直接从 Scala 调用 JavaFX,那么与通过 ScalaFX 调用 JavaFX 相比,我不必担心互操作性问题。

总之:

似乎第 3 点是唯一可能给我一些我在简单项目中关心的好处的好处,但我只是不知道他们真正在谈论什么样的类型安全?

为什么在类型安全方面通过 ScalaFX 调用 JavaFX 比直接从 Scala 调用更好?如果我们使用 ScalaFX 而不是直接从 Scala 访问,我们可以获得什么样的额外类型安全优势?我问这个是因为我真的无法想象ScalaFX 可以提供什么样的额外类型安全?

所以,换句话说,我知道 ScalaFX 是一个很好的绑定语法糖,但它提供的还不止这些吗?如果我可以在没有它提供的(非常好的)合成糖的情况下生活,我真的应该使用它吗?

除了糖之外还有什么东西值得使用这个包装层(ScalaFX),它引入了额外的复杂性(和错误的来源)?

请注意,我非常感谢 ScalaFX 创作者的工作!我问这些问题只是为了能够做出更明智的决定。

4

2 回答 2

10

ScalaFX 是用于与 JavaFX 一起工作的DSL 。提供,你所说的“语法糖”是 DSL 的主要目的

(传统上,DSL 还将宿主语言的范围限制在目标域中,但这通常是 Scala DSL 所不希望的。)

现在,如何以及何时有用,这本身就是一场辩论,但这基本上就是它所提供的全部内容。就个人而言,我总是更喜欢一个 API,它可以让我更清楚地向同事未来的自己传达我的意图,但这是每个团队和项目必须自己决定的事情。ScalaFX 的绑定语法非常棒,因为属性和绑定正在进入越来越多的后端(即使没有 JavaFX GUI)。

我认为 ScalaFX 宣传类型安全的原因并不是因为它是 ScalaFX 本身的一个特殊功能,而是因为值得注意的是,使用 ScalaFX 这样一种简洁的、类似脚本的语言并利用平台的力量那就是 Scala,仍然会为您提供类型安全性(这对于新手和不熟悉 Scala 的人来说可能是违反直觉的)。

建议在您的情况下使用 ScalaFX ,因为听起来您正在处理一个项目,该项目主要关注通过 JavaFx GUI提供的用户体验(我假设给出了您的描述)。ScalaFX 将允许您在 GUI 上快速迭代

一开始不要担心开销,您的用例几乎不会是对性能要求很高的应用程序。如果您确实需要担心性能,为什么要使用 Scala ;)?

ScalaFX的最大缺点是每个 JavaFX 类型都需要用SFXDelegate包装,如果您需要的某些类型没有被包装,或者将来某些东西被添加到 JavaFX 并且您需要等待 ScalaFX 在您之前包装它,这会很麻烦可以使用它(这两个都不是真正的阻塞器,尽管首先,包装 JavaFX 类型很简单(参见 ScalaFX Wiki),其次,JavaFX 的发布周期比 ScalaFX 慢得多

于 2014-03-30T14:01:23.290 回答
4

从纯粹实用的角度来说,它更加简洁易读。

我建议您通过比较 Java 和 Scla 中的代码来亲自了解这一点。有两个很好的例子:

  1. 代码摘自Pro JavaFX一书,在本机 Java 和github上的 scalaFX 中都可用(该页面上有 javafx 代码的链接)。

  2. 此外,您可以将JavaFX-ensemble的代码与ScalaFX-ensemble的代码进行比较。同样,您会发现它不那么杂乱且更易于阅读。

正如@OJKrylow 指出的那样,并非所有JavaFX 都已被移植,因此它确实存在一些薄弱环节。这在 scalafx-ensemble 中很明显,并非所有内容都已移植到 scala 中。如果您计划构建自己的控件,那么最好用 Java 编写它们,然后为 ScalaFX 创建一个包装器对象。

但是,如果您正在编写一个小程序,就像您的情况一样,这应该会降低理论上的复杂性。但是,缺乏标准的介绍性文本意味着您基本上最终会求助于上述两个 JavaFX 资源,并查看它们如何转换为 ScalaFX(不幸的是,您无法真正独立学习它)。我希望这在未来会有所改变。

于 2014-06-01T16:26:11.310 回答