2016-12-19 5 views
1

настоящего времени у меня что-то вроде следующей, который использует Актер:Рефакторинга из системы Actor для соответствия шаблона

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 ... 
    } 
} 

Я хочу, чтобы реорганизовать это не использовать актер, что бы быть лучшим способом сделать это?

Самым прямым способом было бы создать большое сопоставление шаблонов, которое содержит все случаи из всех трех признаков XmlVersionXSchema.

Есть ли другие альтернативы, которые я должен учитывать, идея состоит в том, чтобы сохранить логику в других файлах, потому что в настоящее время существует аргумент логики.

ответ

1

В Акке у вас есть 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 сообщение, которое не соответствует ни одному из ваших парсеров, будет просто удалено. Здесь я поднимаю PartialFunction s на общую сумму Function1, которая возвращает Option[Output], а ответственность за обработку флага 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 
} 
+0

Можете ли вы обрисовать, как я хотел бы использовать это? Все еще немного запутано, но звучит интересно! –

+0

Несомненно, просто добавлено больше деталей. Но, учитывая вопрос, отсутствует информация о реальных типах, я не думаю, что могу помочь гораздо больше. – acjay

 Смежные вопросы

  • Нет связанных вопросов^_^