取決於您可以或願意對您的服務進行多少假設,這裏是一種完全不成熟的方法,可能仍然是一種選擇。它基本上依賴於1)所有可能的消息類型是已知的,以及b)部分函數僅在一維中是局部的(稍後更多)。
我們需要一組可能的消息類型:
sealed trait Message
case class Hello(who: String) extends Message
case class Lunch(withWhom: String) extends Message
case class Dinner(withWhom: String) extends Message
case class Goodbye(who: String) extends Message
和幾個例子服務:
val service0: PartialFunction[Any, Unit] = {
case Hello(who) =>()
case Goodbye(who) =>()
}
val service1: PartialFunction[Any, Unit] = {
case Hello(who) =>()
case Lunch(withWhom) =>()
case Goodbye(who) =>()
}
var services = List(service0, service1)
接下來,我們還定義了旨在充當消息實例列表接受消息的藍圖:
val simpleInstances = List(Hello("*"), Lunch("*"), Dinner("*"), Goodbye("*"))
最後,我們定義了一個方法,該方法返回acceptte從部分功能d參數和可能的參數列表:
def supportedArguments[F, T, A <: F]
(pf: PartialFunction[F, T], args: Iterable[A]) =
args filter pf.isDefinedAt
一個漂亮的打印機:
def printSupportedArguments(services: Iterable[PartialFunction[Any, Unit]],
messages: Iterable[Message]) {
services.zipWithIndex.foreach {case (s, i) =>
val supported = supportedArguments(s, messages)
println(s"Service $i supports $supported")
}
}
讓我們去:
printSupportedArguments(services, simpleInstances)
// Service 0 supports List(Hello(*), Goodbye(*))
// Service 1 supports List(Hello(*), Lunch(*), Goodbye(*))
// Service 2 supports List(Goodbye(*))
事情變得如果服務是不是更復雜只關於他們接受的消息類型而言是部分的,但對於他們接受的消息內容也是部分的,也就是說,如果它們在多個方向上是局部的:
val service2: PartialFunction[Any, Unit] = {
case Hello("Thomas") =>()
case Hello("Laura") =>()
case Goodbye(who) =>()
}
這樣的服務也需要藍圖的實例列表的改編:
val moreInstances = simpleInstances ++ List(Hello("Thomas"), Hello("Laura"))
,導致:
printSupportedArguments(services :+ service2, moreInstances)
// Service 0 supports List(Hello(*), Goodbye(*), Hello(Thomas), Hello(Laura))
// Service 1 supports List(Hello(*), Lunch(*), Goodbye(*), Hello(Thomas),
// Hello(Laura))
// Service 2 supports List(Goodbye(*), Hello(Thomas), Hello(Laura))
設定這種做法明顯的缺點包括以下內容:
你會發現使用宏或反射(或魔法),請在這裏發表一個真正的解決方案!
我有我的懷疑,有一天有人瘋了會拿出一個宏,給你的信息:) – 2013-05-15 00:17:18
是的,但暫時我試圖自己實現它。由於在2.10中反射的文檔有點缺乏,可能需要一段時間;) – rawphl 2013-05-15 05:24:10