scala:私有效用方法应该存在于伴侣对象中吗?

时间:2014-03-11 00:10:55

标签: scala companion-object

问题是自我解释,但请允许我提供一个例子:

我有以下内容:

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公共静态方法的地方。

2 个答案:

答案 0 :(得分: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 - 样式函数的存储库,尽管它确实充当隐式转换的存储库,其具有可以说是类似的风格,尽管上市。考虑一下收集类型对象中的结果。

考虑分离关注点:

class Foo(f: String => Unit) {
  def doSomethingAndDoSomethingWithIt {
    val result = doSomething()
    def message = s"message formatted with $result"
    f(message)
  }
}

答案 1 :(得分:1)

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

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