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我不确定一般问题是什么,但通过分离关注点,格式和输出应该完全在不同的地方。这将是我最宽泛的回答。但最好的愿望是找到一个令人满意的解决方案。在这种情况下,这个答案可能是正确的,因为该方法非常简单,但对于较长的方法,提取不是为了重复使用,而是为了组织代码,这不会有帮助。