使用模式匹配和Future映射时如何减少代码重复?

时间:2014-10-10 09:53:26

标签: scala

我在我的一个控制器中有这个代码:

def addPayment(id:String, amount:String) = Action.async(implicit request =>
  User.isBalanceRecordExisting(id).flatMap{
    yesOrNo => yesOrNo match{
      case true => User.getCurrentPaymentBalance(id).flatMap(
        balance => User.updatePayment(id, balance + amount.toDouble)
      ).flatMap(
        result => User.putBonus(id, amount.toDouble, 1)
      ).map(result => Redirect(routes.Application.userBonuses()))
      case false => User.addPayment(id, amount.toDouble).flatMap(
        result => User.putBonus(id, amount.toDouble, 1)
      ).map(result => Redirect(routes.Application.userBonuses()))
    }
  }
)

所以逻辑很简单:我检查数据库中是否有记录,如果不存在,我添加它,如果它在那里,那么我更新它。在那之后,我在两种情况下都重复完全相同的行动链。 所以我很高兴在这两个流程中我都有重复的代码。是否有简洁明了的方法来简化这个? 所有业务逻辑方法都有一些Future [T]返回类型。

1 个答案:

答案 0 :(得分:2)

实际上,你没有使用添加/更新的结果,但为了保持你的逻辑:

def addPayment(id:String, amount:String) = {
  def processResult[T](result: T) = User.putBonus(id, amount.toDouble, 1))
    .map(result => Redirect(routes.Application.userBonuses())) 

  Action.async(implicit request => User.isBalanceRecordExisting(id) flatMap {    
      case true => User.getCurrentPaymentBalance(id) flatMap {
                   balance => User.updatePayment(id, balance + amount.toDouble)
                 } flatMap processResult

      case false => User.addPayment(id, amount.toDouble) flatMap processResult
    } 
  )
}

已更新