动作顺序清洁代码

时间:2013-12-18 06:38:26

标签: scala coding-style

我有一个基于actor的应用程序(使用)用scala编写。现在我有一个演员应该通过以预定义的顺序发送各种HTTP请求来配置网络中的设备。

我将所有HTTP内容封装在一个单独的类中供我的actor访问。 每个配置步骤当然都会失败,所以我使用Try[Int]作为处理与设备通信的方法的返回类型(将HTTP响应代码作为Try的内容返回)。 p>

现在我的问题是,每个配置步骤都依赖于成功完成之前的所有步骤,因此我的代码变得难以阅读(在我的意见中)。

我基本上已经实现了这个

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

经过几次行动之后,这只是一个巨大的陈述,乍一看你看不出发生了什么。

那么我将如何以干净利落的方式撰写本文呢?

1 个答案:

答案 0 :(得分: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)
}