【问题标题】:Should a Scala DAO get / select method with no arguments (arity-0) have parentheses?没有参数(arity-0)的 Scala DAO get/select 方法应该有括号吗?
【发布时间】:2016-08-20 07:07:47
【问题描述】:

根据Scala guide,arity-0(无参数)的方法可以并且应该省略括号,如果:

所讨论的方法没有副作用(纯功能)

这是一个相当模棱两可的说法,不是吗?

我试图弄清楚一个带有 getter/select arity-0 方法的 DAO 是否应该有括号。

一方面应该这样做,因为访问数据库可能是一项代价高昂的操作,会对应用程序产生“性能副作用”。

另一方面,它不应该,因为 DAO 特征不知道实现,根据定义,它只是一个不会改变应用程序状态的 getter 方法。

你说什么?

【问题讨论】:

  • 如果函数正在访问数据库,则有明显的副作用,因此foo() 语法更清晰,即使这主要是那里的代码样式问题。
  • 我认为这个问题不需要征求意见。手头的问题是数据库调用是否纯粹是功能性的和/或它是否有副作用。答案显然是,它不是,它确实如此。这不是意见,而是客观事实的陈述。现在,这是否意味着该方法应该有括号确实是一个品味问题,但这似乎根本不是 OP 所要求的,因为该决定被推迟到 scala 指南。
  • 计算中的副作用非常明确。参见en.wikipedia.org/wiki/Side_effect_(computer_science)
  • 我看不出你从哪里得到“只写”的符号。它明确表示Side effects are the most common way that a program interacts with the outside world (people, filesystems, other computers on networks)互动.
  • 程序员期望 properties(这是不带括号的 0 arity 方法)立即返回。我将“立即”定义为 50 毫秒或更短,这通常会排除数据库访问。

标签: scala coding-style conventions parentheses readability


【解决方案1】:

我也会申请 referential transparency 作为指导方针。引用不透明的方法值得() 让用户知道。

例如

def randomInt(): Int

case class Rectangle(width: Int, height: Int) { def area: Int = width * height }

(是的,在这种情况下area 可能是vallazy val,但这不是重点)

在您的情况下,从数据源获取数据不是引用透明的,所以我会选择 ()

【讨论】:

  • Scala 风格指南引用了queue.size 作为一个有效的例子。这不会通过引用透明度测试吗?
  • 是的,那确实会失败。虽然我是一个简单的开发人员,而不是样式规则的维护者,但我发现这条规则可以帮助我和其他人编写更易读的代码。
【解决方案2】:

没有括号的Scala 0 arity 方法本质上是properties.

看看what Microsoft has to say about properties。在下面的语句中用“不带括号的零参数方法”替换“属性”,它仍然有效,在大多数情况下:

如果成员表示该类型的逻辑属性,请考虑使用属性。

例如,BorderStyle 是一个属性,因为边框的样式是 ListView 的一个属性。

如果属性的值存储在进程内存中并且该属性仅提供对该值的访问,请使用属性而不是方法。

    public int Department
    {
        get { return department; } 
        set { department = value; }
    }

请在以下情况下使用方法而不是属性。

  • 操作比字段集慢几个数量级。如果您甚至考虑提供操作的异步版本以避免阻塞线程,很可能手术太贵了,不能成为财产。特别是,访问网络或文件系统的操作(除了一次初始化之外)应该很可能是方法,而不是属性。

  • 操作是一个转换,比如Object.ToString方法。

  • 该操作每次调用都会返回不同的结果,即使参数没有改变。例如,NewGuid 方法每次调用都会返回不同的值。
  • 该操作具有显着且可观察到的副作用。请注意,填充内部缓存通常不被视为可观察到的副作用。
  • 该操作返回一个内部状态的副本(这不包括在堆栈上返回的值类型对象的副本)。
  • 该操作返回一个数组。

如您所见,属性是从对象返回值的简单情况。方法本质上是其他一切。

【讨论】:

  • 似乎第二个项目符号(操作是转换)和最后一个项目符号(操作返回一个数组)不适用于Scala;看看集合的转换方法。但其余的对我来说似乎都不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2016-11-27
相关资源
最近更新 更多