我正在使用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中编写此操作的最佳方法。我怎样才能以更具伸缩性的方式修改我的代码?我如何在这里使用案例类?
答案 0 :(得分: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
是一个抽象方法,T
和V
作为error
函数的结果类型,并继续函数f
。 v
是一个更具体的函数,它需要error
的字符串并封装notice()
调用。我们将f
作为花括号v(validation, errormsg){/*todo when there is no problem*/}
中的一部分。
答案 1 :(得分: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
}
答案 2 :(得分: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硬编码。如果您对此感兴趣 - 请问..