首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从角色系统重构到模式匹配

从角色系统重构到模式匹配
EN

Stack Overflow用户
提问于 2016-12-19 16:13:26
回答 1查看 95关注 0票数 1

目前,我有如下使用Actors的内容:

代码语言:javascript
复制
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语句当前。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-19 21:02:04

在阿克卡,你有type Receive = PartialFunction[Any, Unit]def recieve = xmlVersion1 orElse xmlVersion2 orElse xmlVersion3行使用标准库中的orElse组合器简单地组成这些部分函数。结果只是一个更大的PartialFunction[Any, Unit]

你可以在演员之外使用同样的策略。我可能会做这样的事:

代码语言:javascript
复制
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时应该考虑使用的解析器。如果这没有用,那就像以前一样静态地把它们串在一起。

我不知道您的输入和输出类型是什么,所以我假设它们是InputOutput。如果你要离开阿克卡岛,我强烈建议收紧你的类型界限。

在Akka中,一个与您的解析器不匹配的消息将被删除。在这里,我将PartialFunctions提升到返回Option[Output]的(总计) Function1,而处理None案例的责任在于调用者。

然后你就可以:

代码语言:javascript
复制
// 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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41226774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档