我正在设计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]
的实例?
答案 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