2013-12-18 4 views
1

У меня есть приложение на основе актера (с использованием ), написанное на scala. Теперь у меня есть актер, который должен настроить устройство в сети, отправив ему различные HTTP-запросы в предопределенном порядке.Последовательность действий чистый код

Я инкапсулировал все материалы HTTP в отдельный класс для доступа моих участников. Каждый из этапов настройки может, конечно, сбой, поэтому я использовал Try[Int] как возвращаемый тип методов, которые обрабатывают связь с устройством (возврат HTTP-responseecode как содержимого Try).

Теперь моя проблема в том, что каждый шаг конфигурации зависит от всех шагов, прежде чем они будут успешно завершены, и поэтому мой код становится трудно читаемым (в моем оппионе).

Я его реализовать в основном как этот

action1 match { 
    case Failure(err) => //report error 
    case Success(retCode) if retCode < 400 => 
    nextStep match { 
     ... 
    } 
} 

После нескольких действий это просто становится массивное заявление, в котором вы видите cannont на первый взгляд, что происходит.

Итак, как я мог бы написать это в чистом виде кода?

ответ

1

Вы могли бы реализовать последовательность действий, как ... последовательность действий:

Блокировки версия:

def seq: Seq[() => Try[Int]] = ??? 

// find first failure 
def failed: Option[Try[Int]] = seq.view.map{ _() }.find { 
    case Failure(err) => 
     //report error 
     true 
    case Success(retCode) => retCode > 400 
    } 

Для блокирующей версии вы должны использовать Future вместо Try:

val seq: List[() => Future[Int]] = ??? 

def isSuccess(actions: List[() => Future[Int]]): Future[Boolean] = actions match { 
    case h :: tail => h().flatMap { c => 
     if (c > 400) Future(false) 
     else isSuccess(tail) 
    } 
    case Nil => Future(true) 
} 
+0

Ahh right 'find' останавливается, если он получил« true ». Ну, с задним числом это было своеобразное решение ^^ – mgttlinger

+0

Не имеет значения, если он блокируется здесь, поскольку цель этого актера состоит в том, чтобы выполнить эти действия, и они должны ждать друг друга в любом случае – mgttlinger

+0

@mgttlinger: я не знаете, как вы получаете ответы 'HTTP', но если библиотека предоставляет' Future [Response] ', вы не должны преобразовывать ее в' Try', используя 'Await'. – senia

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