【问题标题】:What is the prefered way to factor out behavior排除行为的首选方法是什么
【发布时间】:2023-03-14 20:31:01
【问题描述】:

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

def workspace = Plugin.get.reallyGet.getWorkspace

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

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

并混合它或

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

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

【问题讨论】:

    标签: scala coding-style refactoring


    【解决方案1】:

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

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

    【讨论】:

    【解决方案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 中实现的。

    【讨论】:

    • 我检查了链接。其中一个问题似乎是名称冲突,这也是我最初想到的事情之一。提供这两种选择似乎是提供方的一个不错的决定。
    猜你喜欢
    • 2010-09-15
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2013-03-07
    • 2018-01-02
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多