Scala有Rubocop吗?

时间:2014-06-01 00:01:51

标签: scala

当我制作Rails应用程序时,我经常使用RuboCop来帮助确保我的代码是干净的,并且高达标准和可读性。

我现在正在学习Scalatra,我想知道是否有类似于RuboCop的插件可以检查代码的样式,并在你写作时给你一个警告"脏代码"。对于经验丰富的Scala开发人员来说,这可能不是必需的,但对于初学者来说,这是一个神派。

2 个答案:

答案 0 :(得分:12)

在编译器选项中打开-Xlint。如果您有空闲时间,请打开-Xfatal-warnings。在任何一种情况下,您都将学到很多关于如何编写更安全的Scala代码的信息。

完成该练习后,请设置WartRemover,这是很多更具见解性的linting工具。你可能不同意WartRemover附带的所有规则 - 我不确定我这样做 - 但是你也会通过试图跟随它们来学习很多东西(并且当你穿上它时与Brian和co。争论。我认为规则的目标实际上是一个疣。)

还有一些面向语法和样式的工具,如Scalastyle(在上面的评论中提到),可以确保你没有混合标签和空格或其他任何东西(公平地说,Scalastyle是一个小的不那么肤浅)。这些东西很有用,但我个人觉得它们并不是很有趣。

最后请注意,Scala最好的静态分析工具是scalac本身(即使没有启用-Xlint)。像RuboCop这样的工具有两个主要目标:鼓励您编写更多惯用的,可读的代码,并尝试捕获在运行时发生之前可能在运行时发生的问题。在编译语言中(特别是像Scala这样的丰富类型系统的编译语言),编译器本身可以在代码中运行之前捕获代码中的问题。

答案 1 :(得分:2)

其他人已经提到过-Xlint,ScalaStyle,WartRemover等等,所以让我对纯粹主义与非纯粹主义进行一些概括。

我认为所考虑的是什么"好"它不是通用的,它取决于用例。当然,使用vals和没有vars,使用漂亮的尾递归来编写所有东西,使用monad是很棒的 - 但是尾递归并不总是可行的,并且当递归时可以吹掉堆栈。得到优化,甚至Scala的理解也转换为map / flatMap / foreach,与while循环相比,这是缓慢的。对于RESTful WS和其他Scalatra的东西,你可能不关心这个,因为我怀疑你会有你自己的深度递归代码,并且Scala比Ruby更快,关心理解与循环性能相对应。所以,我认为你可以在这种背景下保持纯粹主义,这就是为什么用上述工具学习最佳实践的好时机。

然而,当一个人试图从应用程序中挤出最后一点性能时,很少有人是纯粹主义者。当您了解有关Scala的更多信息时,请将纯粹代码与Apache Spark的内部进行比较 - 由于性能原因,它们在许多地方使用while循环而不是for comprehensions(或map / flatMap等)。代码可能看起来很糟糕,纯粹主义者可能会心脏病发作,但有一个特定的原因 - 设计师知道Scala足够自己是纯粹主义者,但是出于特定原因选择做其他优先事项。我认为我们需要"自由宗教" - 99%的时间成为纯粹主义者是件好事,但当成本太高而且你真的知道为什么要违反规则以及后果是什么时,请尝试考虑替代方案。也就是说,就像特拉维斯所说的那样,对于初学者而言,纯粹主义是好的,因为他们需要了解在大多数情况下哪些好的做法是有效的,然后你可以决定只在有情有可原的情况下编写非纯粹的代码:)