类型类还是通过隐式添加方法?

时间:2018-06-23 12:30:33

标签: scala functional-programming typeclass implicit

我正在设计Service类,并面临设计问题。这是我目前拥有的:

trait Service {
  def isFailed(): Boolean
  def start(): Unit
  def stop(): Unit
}

然后为了将彼此相关的Service分组(为了重新启动/恢复该组,而不是其他服务),我创建了以下软件包对象:

package object app {
  type FaultTolerantServiceGroup = Seq[Service]
  object FaultTolerantServiceGroup{
    def apply(svcs: Service*): FaultTolerantServiceGroup = Seq(svcs: _*)
  }

  class FaultTolerantServiceGroupOps(val F: FaultTolerantServiceGroup){
    def hasFailed: Boolean = F.forall(_.failed())
  }

  trait FaultTolerantServiceGroupSyntax{
    implicit def serviceGroup2Ops(F: FaultTolerantServiceGroup) = new FaultTolerantServiceGroupOps(F)
  }
}

因此,我将方法hasFailed添加到了FaultTolerantServiceGroup。但是我不确定这个决定。

最好定义一个类型类,例如

trait Watchable[T]{
     def hasFailed(t: T): Boolean
}

并隐式提供Watchable[FaultTolerantServiceGroup]的实例?

1 个答案:

答案 0 :(得分:2)

以我的拙见,之后隐式函数变得更难阅读。即使阅读我的旧代码,当对象的方法突然出现时,有时也会造成混淆。

我还没有看到一个比声明性函数更容易推断隐式实例的例子:

ddof

生成的代码似乎不比隐式更好或更糟,但至少在哪里功能显而易见:

val failedGroup : FaultTolerantServiceGroup => Boolean = _.forall(_.failed())

显式函数还使val group : FaultTolerantServiceGroup = ??? //no implicit val failed = failedGroup(group) //with implicits : how does a Seq have a hasFailed method? val failed = group.hasFailed 函数更易于阅读:

Iterable