arity-1调用的推荐样式后跟arity-0调用

时间:2014-05-29 16:20:18

标签: scala

鉴于斯卡拉官方风格指南
http://docs.scala-lang.org/style/method-invocation.html
建议为arity-0调用使用中缀表示法,为arity-0调用使用点表示法,arity-1调用后跟arity-0调用的推荐样式是什么?

例如,这是推荐的方法吗?

(bytes map (_.toChar)).mkString

2 个答案:

答案 0 :(得分:3)

样式指南的摘要基本上是:只要简单明了,就使用无点样式。否则,不要。在这种情况下,您的选项是

bytes.map(_.toChar).mkString
(bytes map (_.toChar)).mkString

前者看起来更简单,更清晰,所以它赢了。

真正的长链在无点符号中也不是很清楚

foo bar baz qux quux bippy

再说些什么?

foo.bar(baz).qux(quux).bippy

哦,好的。

务实。无点风格可以干净优雅。良好的编码风格通常会导致您编写看起来不错的代码。但语法的要点是要清楚并避免错误,因此请使用更好的目标来实现目标。

答案 1 :(得分:2)

我不知道是谁写了这本指南,但他看起来肯定有偏见,我建议不要遵循本指南。 Infix符号有很多陷阱,作者没有提及,其好处至少是值得怀疑的。作者使用的论点也不容置疑。

作者争辩说,以下代码使得它看起来像是在函数filter上调用(_.toUpperCase)的方法:

names.map (_.toUpperCase).filter (_.length > 5)

但没有人像那样格式化代码。以下是标准做法,它们都没有引起歧义:

names.map(_.toUpperCase).filter(_.length > 5)

names.map( _.toUpperCase ).filter( _.length > 5 )

中缀符号的缺陷

  1. 无参数方法cannot be used inside a method calls chain

  2. 无参数方法cannot be used in the end of a method calls chain,因为它们从下一行获取术语。

  3. It does not allow splitting to multiple lines。您要么必须引入一些lispy bracketing,要么引入一些place the parameters on the next line。另一个选择是切换回" dot"符号并以inconsistent style结束。

    所有这些选项很难被称为提高可读性。

  4. 它会滋生misunderstandings like that

  5. 最后,它增加了一层你意图的混淆。即,读者必须分析编译器在实际理解代码之前如何推断点和括号。

  6. 结论

    我曾经遇到的这种符号的唯一论据是它增加了可读性。虽然这个论点本身有问题,但我发现它几乎不能抵抗这种符号的任何上述缺点,因为它通常会降低可读性。

    最一致和安全的标准是仅对运算符使用中缀表示法,即名称为+*>>=的方法。