不是纯函数的括号

时间:2013-10-06 11:34:32

标签: scala coding-style

我知道如果方法有副作用,我应该按惯例使用()

def method1(a: String): Unit = {
  //.....
}

//or

def method2(): Unit = {
  //.....
}

如果方法没有副作用但是它不是纯粹的,没有任何参数,当然,每次调用它时会返回不同的结果,我是否必须做同样的事情?

def method3() = getRemoteSessionId("login", "password")

2 个答案:

答案 0 :(得分:1)

Scala style guide建议:

  

作为任何类型的访问器(封装字段或逻辑属性)的方法应该在没有括号的情况下声明,除非它们有副作用。

除了访问者之外,它没有提及任何其他用例。所以问题归结为你是否认为这个方法是一个访问者,而这又取决于如何设置类的其余部分,也许还取决于(预期的)呼叫站点。

答案 1 :(得分:1)

编辑:在回顾了Luigi Plinge的评论之后,我开始认为我应该重写答案。这也不是一个明确的是/否答案,而是一些建议。


首先:关于var的案例很有意思。声明var foo会为您提供一个不带括号的getter foo 。显然这是一个不纯的调用,但它没有副作用(它不会改变调用者未观察到的任何内容)。

第二,关于你的问题:我现在不会说getRemoteSessionId的问题是它不纯,但实际上它让服务器为你维护一些会话登录,所以很明显你会破坏性地干扰环境。然后,由于这种副作用,method3()应该用括号写成。

第三个例子:获取目录的内容因此应该写成file.children而不是file.children(),因为它再次是一个不纯的函数,但不应该有副作用(除了读取之外)只能访问您的文件系统)。

第四个例子:鉴于上述情况,你应该写System.currentTimeMillis。我倾向于来编写System.currentTimeMillis()但是......

使用这个案例,我的初步答案是:当函数有副作用时,括号是最好的;或者如果它是不纯的,取决于不受您的计划控制的州。

根据这个定义,getRemoteSessionId是否已知副作用并不重要。另一方面,它意味着恢复写file.children() ...