目前,我有如下使用Actors的内容:
class XmlParserActor extends Actor with XmlVersion1Schema with XmlVersion2Schema with XmlVersion3Schema {
def recieve = xmlVersion1 orElse xmlVersion2 orElse xmlVersion3
}
trait xmlVersion1Schema { this: XmlParserActor =>
def xmlVersion1: Receive = {
case ...
case ...
case ...
}
}我想重构这个不使用演员,什么是最好的方式来做到这一点?
最直接的方法是创建一个大模式匹配,其中包含来自所有3个XmlVersionXSchema特征的所有case子句。
是否还有其他选择,我应该考虑,想法是保持逻辑分开在其他文件,因为有分配的逻辑中的case语句当前。
发布于 2016-12-19 21:02:04
在阿克卡,你有type Receive = PartialFunction[Any, Unit]。def recieve = xmlVersion1 orElse xmlVersion2 orElse xmlVersion3行使用标准库中的orElse组合器简单地组成这些部分函数。结果只是一个更大的PartialFunction[Any, Unit]。
你可以在演员之外使用同样的策略。我可能会做这样的事:
class FullXmlParser(parsers: PartialFunction[Input, Output]*) {
val composedParser = parsers.foldLeft(PartialFunction.empty[Input, Output])(_ orElse _)
def parse(input: Input): Option[Output] = composedParser.lift.apply(input)
}这样,我就可以注入在实例化FullParser时应该考虑使用的解析器。如果这没有用,那就像以前一样静态地把它们串在一起。
我不知道您的输入和输出类型是什么,所以我假设它们是Input和Output。如果你要离开阿克卡岛,我强烈建议收紧你的类型界限。
在Akka中,一个与您的解析器不匹配的消息将被删除。在这里,我将PartialFunctions提升到返回Option[Output]的(总计) Function1,而处理None案例的责任在于调用者。
然后你就可以:
// At setup time (application start-up, or upon configuration)
val parser = new FullXmlParser(xmlVersion1, xmlVersion2, xmlVersion3)
// At parse time
parser.parse(yourInput) match {
case Some(output) => // whatever happens upon success
case None => // failure handling
}https://stackoverflow.com/questions/41226774
复制相似问题