scala:私有实用程序方法应该存在于伴随对象中吗?

scala:私有实用程序方法应该存在于伴随对象中吗?,scala,companion-object,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".for

这个问题不言自明,但请允许我举一个例子:

我有以下资料:

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消息(result:result)
object Foo

赞成的论点是明确说明
def消息(result:result)
不依赖于
类Foo中的任何状态。

反对的理由是,伴随对象的动机是提供放置java公共静态方法的场所。

对于这种错误的二分法,答案是两者都不是。它应该是一种本地方法,用于
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)
  }
}

你应该把这些方法放在它们应该放的地方。如果为了测试的目的、可读性甚至可维护性,您需要将它们分解。尽管Scala受到FP概念、FP模式和FP心态的影响,但它仍然是一种OO语言


私有helper方法就是使代码更易于使用的helper方法。如果您的类需要它们,那么没有理由在另一个类中扩展该逻辑。。。只是因为。将它们放在同一个位置(并添加一些方法来访问那些用于单元测试目的的方法,如包可见性)。

我认为OP可能打算在其他几种方法中重用私有方法。嗯,she(语法性欣快)说这是不言自明的,并给出了一个例子…@som snytt当你为我的例子问题提供了一个具体的解决方案时,我希望能对这个普遍的困境找到一个更一般的答案。:)所以,让我们把这个问题概括一下。@euphoria83我不确定一般问题是什么,但通过分离关注点,格式和输出应该完全在不同的地方。这将是我最宽泛的回答。但最好的愿望是找到一个令人满意的解决方案。在这种情况下,这个答案可能是正确的,因为该方法非常简单,但对于较长的方法,提取不是为了重复使用,而是为了组织代码,这不会有帮助。