分解行为的首选方法是什么

时间:2013-04-06 00:08:53

标签: scala coding-style refactoring

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

def workspace = Plugin.get.reallyGet.getWorkspace

将它排除在外的最佳方法是什么?我看到两种可能性可以在使用代码中等效使用。

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

并将其混合或

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

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

2 个答案:

答案 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中实现它。