2

这个问题是不言自明的,但请允许我提供一个例子:

我有以下内容:

class Foo {
    def doAndPrint {
        val result = doSomething()
        val msg = message(result)
        println(msg)
    }

    private def message(result: Result): String = {
        "message formatted with %s".format(result)
    }
}

在这种情况下,问题是:应该def message(result: Result)住在object Foo?

赞成的论点是明确表示def message(result: Result)不依赖于class Foo. 反对的论点是伴随对象的动机是提供一个放置java公共静态方法的地方。

4

2 回答 2

4

这种错误的二分法的答案是两者都不是。它应该是一个本地方法doAndPrint

class Foo {
  def doAndPrint {
    val result = doSomething()
    def message(result: Result): String = s"message formatted with $result"
    val msg = message(result)
    println(msg)
  }
}

实际上,

class Foo {
  def doAndPrint {
    val result = doSomething()
    def message = s"message formatted with $result"
    println(message)
  }
}

请注意,它实际上取决于当地状态。

编辑:好的,作为对“不言自明”的点头,我会补充说,使用有意义的最小范围,并且该示例指出了同伴之间私人关系的不对称性。这需要我没有时间提供的许多双关语。

根据我的观察,更直接地回答是,伴随模块通常不用作FooUtil-style 函数的存储库,尽管它确实用作隐式转换的存储库,尽管它是公开的,但可以说具有相似的风格。考虑一下集合类型的对象中的结果。

考虑关注点分离:

class Foo(f: String => Unit) {
  def doSomethingAndDoSomethingWithIt {
    val result = doSomething()
    def message = s"message formatted with $result"
    f(message)
  }
}
于 2014-03-11T00:17:51.483 回答
1

您应该将方法放在它们所属的位置。如果您出于测试目的、可读性甚至可维护性需要分解事物,那么您需要将它们分解。尽管 Scala 受到 FP 概念、FP 模式和 FP 思维方式的影响,但它仍然是一种 OO 语言。

私有辅助方法就是这样,使您的代码更易于使用的辅助方法。如果您的班级需要它们,那么没有理由将这种逻辑传播到另一个班级......只是因为。将它们放在同一个地方(并添加一些方法来访问这些方法以用于单元测试目的,例如包可见性。)

于 2014-03-11T00:37:15.457 回答