Code Style and Quality Guide — Scala #
序言 #
Pull Requests & Changes #
常用编码指南 #
Java 语言指南 #
Scala 语言指南 #
组件指南 #
格式指南 #
Scala 语言特性 #
在哪儿使用(和不使用) Scala #
对于 Scala 的 API 或者纯 Scala libraries,我们会选择使用 Scala。
在 core API 和 运行时的组件中,我们不使用 Scala。我们的目标是从这些组件中删除现有的 Scala 使用(代码和依赖项)。
⇒ 这并不是因为我们不喜欢 Scala,而是考虑到“用正确的工具做正确的事”的结果(见下文)。
对于 API,我们使用 Java 开发基础内容,并在上层使用 Scala。
- 这在传统上为 Java 和 Scala 提供了最佳的互通性
- 这意味着要致力于保持 Scala API 的更新
为什么我们不在 Core API 和 Runtime 中使用 Scala ?
- 过去的经验显示, Scala 在功能上的变化太快了。对于 Flink 社区来说,每次 Scala 版本升级都是一个比较棘手的处理过程。
- Scala 并不总能很好地与 Java 的类交互,例如 Scala 的可见性范围的工作方式不同,而且常常向 Java 消费者公开的内容比预期的要多。
- 由于使用 Scala ,所以 Flink 的 artifact/dependency 管理增加了一层额外的复杂性。 * 我们希望通过接口抽象,同时也在运行时保留像 Akka 这样依赖 Scala 的库,然后将它们加载到单独的类加载器中,以保护它们并避免版本冲突。
- Scala 让懂 Scala 的程序员很容易编写代码,而对于不太懂 Scala 的程序员来说,这些代码很难理解。对于一个拥有不同经验水平的广大社区的开源项目来说,这尤其棘手。解决这个问题意味着大量限制 Scala 特性集,这首先就违背了使用 Scala 的很多目的。
API 等价 #
保持 Java API 和 Scala API 在功能和代码质量方面的同步。
Scala API 也应该涵盖 Java API 的所有特性。
Scala API 应该有一个“完整性测试”,就如下面 DataStream API 的示例中的一样: https://github.com/apache/flink/blob/master/flink-streaming-scala/src/test/scala/org/apache/flink/streaming/api/scala/StreamingScalaAPICompletenessTest.scala
语言特性 #
- 避免 Scala 隐式转换。
- Scala 的隐式转换应该只用于面向用户的 API 改进,例如 Table API 表达式或类型信息提取。
- 不要把它们用于内部 “magic”。
- 为类成员添加显式类型。
-
对于类字段和方法返回类型,不要依赖隐式类型推断:
不要这样:
var expressions = new java.util.ArrayList[String]()
要这样:
var expressions: java.util.List[String] = new java.util.ArrayList[]()
-
堆栈上局部变量的类型推断是可以的。
-
- 用严格的可见性。
- 避免使用 Scala 的包私有特性(如 private[flink]),而是使用常规 private/protected 替代。
- 请注意:在 Java 中,
private[flink]
和protected
的成员是公开的。 - 请注意:在 Flink 提供的示例中,
private[flink]
仍然会暴露所有成员。
编码格式 #
使用换行来构造你的代码。
- Scala 的函数性质允许长的转换链 (
x.map().map().foreach()
). - 为了强制让实现者构造其代码,因此将行长度限制为 100 个字符以内。
- 为了更好的可维护性,每次转换使用一行。