0

我正在使用 Lift 框架和 Scala。我有一个表格来注册我的应用程序,我想验证其中的所有字段。我有一个片段用于访问我的表单值,还有一个验证类用于编写验证函数。以下代码是我迄今为止尝试过的。在我的片段中:

if(validationClassObject.validateName(first_name)){
  if(validationClassObject.validateName(last_name)){
    if(validationClassObject.validateEmail(email)){
      if(validationClassObject.validateUserName(name)){

        // Adding values to the DB
        S.redirectTo("/")

      }
      else{
        S.notice("Invalid User Name")
      }               
    }
    else{
      S.notice("Invalid Mail Id")                 
    }
  }
  else{
    S.notice("Invalid Last name")
  }           
}
else{
  S.notice("Invalid First Name")
}

validationClass我写的验证代码看起来像:

//function for validating mail address
 def validateEmail(email: String): Boolean =
     """(\w+)@([\w\.]+)""".r.unapplySeq(email).isDefined
 //code for validating remaining fileds like above

这是可行的,但我知道这不是在 Scala 中编写此操作的最佳方式。如何以更具可扩展性的方式修改我的代码?我如何在这里使用案例类?

4

3 回答 3

1

你可以这样做:

  def av[T,V](validationFunction: => Boolean, error: => T)(f: => V)={
    if(!validationFunction) error
     else f
  }
  def v[V](validationFunction: => Boolean, error: => String)(f: => V)=av(validationFunction,S.notice(error))(f)


  import validationCalssObject._

  v(validateName(last_name),"Invalid Last name"){v(validateName(name),"Invalid User Name"){...}}

av是一个抽象方法,TV结果类型为errorfunction 和 continue function fv是更具体的函数,它需要一个字符串error并封装notice()调用。我们给出f花括号中的部分v(validation, errormsg){/*todo when there is no problem*/}

于 2013-04-18T10:31:48.467 回答
1

我无法在评论中进行格式化,所以我会发布一个新答案。

def badName() = if ("name" == "") Some("bad name") else None

def badEmail() = if ("email" == "") Some("bad email") else None

val verifications = List[() => Option[String]](badName, badEmail)

val failed = verifications.flatMap(_())
if (failed.nonEmpty) {
    // handle failed
} else {
    // your custom logic here
}
于 2013-04-18T13:17:32.027 回答
0
if (badName) S.notice
else if (badEmail) S.notice
else if (badDay) S.notice
else { // everything OK...
    // return a JsCmd or what else do you wanted here
}

可以使用 Option 和 flatMap 编写替代解决方案,而无需对所有“if”-s 进行硬编码。如果您对此感兴趣 - 问..

于 2013-04-18T12:47:35.587 回答