当 return 值可以更改时,我是否应该为方法 getClients 使用 `()`?

Should I use `()` or not for the method `getClients` when the return value can be changed?

在 Scala 中,我有一个 server class,它有一个方法,比如说,getClients,它 return 是当前连接的客户端。

我不知道该如何定义它:

  1. getClients
  2. clients
  3. getClients()
  4. clients()

当新客户端连接或断开连接时,此方法的 return 值会随时间变化。

我应该选择哪一个?

我看到的一个新兴标准似乎是明智的,它是只在它有副作用时用 () 定义它,而不是在它前面加上 get。如果您要遵循惯例,这意味着您将使用 2.

根据 the Scala style guide 解决您的问题如下:

Methods which act as accessors of any sort (either encapsulating a field or a logical property) should be declared without parentheses except if they have side effects.

你应该定义你的方法而不带括号(getClientsclients,这是一个品味问题,但是,指南建议第二个选项)因为它充当访问器而不是出现副作用。关于集合更改,我会说这是可变集合的一个特性,而不是方法本身。

此外,如果您不打算在聚合之外修改集合,也许您应该考虑将返回结果更改为不可变变体,并提供一些方式来通知客户端有关更改。

关于括号,重要的是该方法是否有副作用:

来自 Scala 风格指南 (http://docs.scala-lang.org/style/naming-conventions.html#parentheses)

Methods which act as accessors of any sort (either encapsulating a field or a logical property) should be declared without parentheses except if they have side effects.

确实,如果函数依赖于一些变化的值,那么它就不是纯函数。然而,这对于调用者来说是非常清楚的,因为该方法被命名为访问器,并且它是 arity-0(arity-0 是访问器或有副作用 - 否则它是无用的!)。更大的问题是应该通过使用或不使用括号来传达的副作用。

在我看来,clientsgetClients 之间的区别不是很大,因为两者都可以被视为基本访问器。将 get 排除在外是 Scala 中的一种约定,所以我会使用 clients