假设我有几个类在内部分享一些行为,比如
def workspace = Plugin.get.reallyGet.getWorkspace
将它排除在外的最佳方法是什么?我看到两种可能性可以在使用代码中等效使用。
trait WorkspaceProvider {
def workspace = Plugin.get.reallyGet.getWorkspace
}
并将其混合或
object WorkspaceProvider {
def workspace = Plugin.get.reallyGet.getWorkspace
}
并导入它。你更喜欢什么?为什么?
答案 0 :(得分:4)
前者更可取。后者本质上是静态的,不可模仿且难以测试。
既然你正在思考耦合(一个非常好的事情),你应该熟悉蛋糕模式(它在'网络上有很多内容,从paper开始,其中概念首先被描述)。
答案 1 :(得分:2)
您可以同时定义:
trait WorkspaceProvider {
def workspace = Plugin.get.reallyGet.getWorkspace
}
object WorkspaceProvider extends WorkspaceProvider
第一种形式更灵活。例如,它允许在实例中混合:
trait Foo { this:WorkspaceProvider =>
def bar = workspace.doSomethingRelevantHere
}
val myFoo = new Foo with WorkspaceProvider
但是如果您只想使用workspace
方法,第二种形式会更方便。例如,在测试,原型等中
修改强>
有关此方法的详细说明,请查看"Selfless Trait Pattern",其中Bill Venners展示了如何在ScalaTest中实现它。