Scala编码风格和约定?

Saw*_*yer 17 scala

我认为Scala与简单性相差太远,就像它的语法一样.例如Martin Odersky在他的书中写了这个方法:

def calculate(s: String): Int =
  if (cache.contains(s))
    cache(s)
  else {
    val acc = new ChecksumAccumulator
    for (c <- s)
      acc.add(c.toByte)
    val cs = acc.checksum()
    cache += (s -> cs)
    cs
  }
Run Code Online (Sandbox Code Playgroud)

如果方法增长,读取代码变得非常痛苦,我无法匹配花括号,无法在IDE中折叠方法.那里有Scala编码约定吗?我觉得表达一个简单的方法太灵活了:

def add(b: Byte): Unit = {
  sum += b
}

def add(b: Byte): Unit = sum += b

def add(b: Byte) { sum += b }
Run Code Online (Sandbox Code Playgroud)

Mar*_*sky 35

"如果方法增长,那么阅读代码会变得非常痛苦".我认为部分答案是方法不应该增长.功能编程风格有很多小方法.计算方法已经偏大.

回答有关Scala编程风格指南的更一般问题:这是一个有代表性的例子.


mis*_*tor 27

这是Scala风格指南的链接.


Curly Braces部分说:

大括号:

在控制结构表示纯函数操作并且控制结构的所有分支(与if/else相关)是单行表达式的情况下,应省略大括号.请记住以下准则:

  • if - 如果你有else子句,则省略括号.否则,即使内容只是一行,也要用花括号括住内容.

  • while - 从不省略大括号(虽然不能以纯粹的功能方式使用).

  • for - 如果你有一个yield子句,则省略括号.否则,使用大括号包围内容,即使内容只是一行.

  • case - 如果case表达式ts在一行上,则省略括号.否则,为清晰起见使用花括号(即使解析器不需要它们).

    val news = if (foo)
      goodNews()
    else
      badNews()
    
    if (foo) {
      println("foo was true")
    }
    
    news match {
      case "good" => println("Good news!")
      case "bad" => println("Bad news!")
    }
    
    Run Code Online (Sandbox Code Playgroud)

我希望人们遵循这个风格指南:(


请注意,我不同意"如果ifelse条款,则忽略大括号"部分.我更喜欢看到这样的代码:

def calculate(s: String): Int = {
  if (cache.contains(s)) {
    cache(s)
  } else {
    val acc = new ChecksumAccumulator
    for (c <- s) {
      acc.add(c.toByte)
    }
    val cs = acc.checksum()
    cache += (s -> cs)
    cs
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Mising Faktor:对我来说,使用语法不需要的标点符号通常只是不需要的噪音.我没有看到额外的括号,例如,帮助重构. (3认同)