问题是自我解释,但请允许我提供一个例子:
我有以下内容:
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公共静态方法的地方。
答案 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语言。
私有帮助器方法就是这样的帮助方法,使您的代码更易于使用。如果你的班级需要它们,那么没有理由在另一个班级中展开那个逻辑......只是因为。将它们放在同一个地方(并添加一些方法来访问这些方法以进行单元测试,例如包可见性。)