2

假设我有几个类在内部共享一些行为,例如

def workspace = Plugin.get.reallyGet.getWorkspace

将其分解的最佳方法是什么?我看到了两种可以在 using 代码中等效使用的可能性。

trait WorkspaceProvider {
  def workspace = Plugin.get.reallyGet.getWorkspace
}

并将其混合或

object WorkspaceProvider {
  def workspace = Plugin.get.reallyGet.getWorkspace
}

并导入它。你更喜欢什么,为什么?

4

2 回答 2

4

前者更可取。后者本质上是静态的、不可模拟的并且难以测试。

由于您正在考虑耦合(一件非常好的事情),您应该熟悉蛋糕模式(它在 'Net 上有很多介绍,从首次描述该概念的论文开始)。

于 2013-04-06T02:03:39.243 回答
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 中实现的。

于 2013-04-06T07:44:20.460 回答