将功能列表传递给稍后提供数据的方法

时间:2018-10-16 15:59:58

标签: scala validation recursion

我正在尝试构建一个相当通用的多级Validator对象。想法是,如果1级通过,那么您具有验证级别,那么您进行2级,等等。但是我在一个特定领域苦苦挣扎:创建一个函数调用,但要等到以后再执行。

数据:

case class FooData(alpha: String, beta: String) extends AllData
case class BarData(gamma: Int, delta: Int) extends AllData

ValidationError:

case class ValidationError(code: String, message: String)

验证者:

object Validator {

    def validate(validations: List[List[Validation]]): List[ValidationError] = {

        validations match {

            case head :: nil =>  // Execute the functions and get the results back 

            // Recursively work down the levels (below syntax may be incorrect)
            case head :: tail => validate(head) ... // if no errors then validate(tail) etc. 
            ...
        }

    }

}

样本验证器:

object CorrectNameFormatValidator extends Validation {

    def validate(str: String): Seq[ValidationError] = {
        ... 
    }

}

我希望如何使用它:

object App {
    def main(args: Array[String]): Unit = {

        val fooData = FooData(alpha = "first", beta = "second")

        val levelOneValidations = List(
            CorrectNameFormatValidator(fooData.alpha), 
            CorrectNameFormatValidator(fooData.beta), 
            SomeOtherValidator(fooData.beta)
        )

        // I don't want these to execute as function calls here 
         val levelTwoValidations = List(
            SomeLevelTwoValidator (fooData.alpha), 
            SomeLevelTwoValidator(fooData.beta), 
            SomeOtherLevelValidator(fooData.beta),
            SomeOtherLevelValidator(fooData.alpha)
        )

        val validationLevels = List(levelOneValidations, levelTwoValidations)

        Validator.validate(validationLevels)

    }
}

当我不需要做某事或者只是缺少一个组件时,我是否真的在做一些令人费解的事情?

基本上,我想定义何时调用函数以及使用哪个参数,但是直到我在Validator中说完,我才希望调用发生。这可能吗?

1 个答案:

答案 0 :(得分:1)

在定义lazy vallevelOneValidationlevelTwoValidations时可以使用validationLevel或def:

object App {
  def main(args: Array[String]): Unit = {

    val fooData = FooData(alpha = "first", beta = "second")

    lazy val levelOneValidations = List(
      CorrectNameFormatValidator(fooData.alpha),
      CorrectNameFormatValidator(fooData.beta),
      SomeOtherValidator(fooData.beta)
    )

    // I don't want these to execute as function calls here
    lazy val levelTwoValidations = List(
      SomeLevelTwoValidator (fooData.alpha),
      SomeLevelTwoValidator(fooData.beta),
      SomeOtherLevelValidator(fooData.beta),
      SomeOtherLevelValidator(fooData.alpha)
    )

    lazy val validationLevels = List(levelOneValidations, levelTwoValidations)

    Validator.validate(validationLevels)

  }
}

您还需要更改validate的方法来获得ByName而不是

的验证

ByValue使用: =>

object Validator {

  def validate(validations: => List[List[Validation]]): List[ValidationError] = {

    validations match {

      case head :: nil =>  // Execute the functions and get the results back

      // Recursively work down the levels (below syntax may be incorrect)
      case head :: tail => validate(head) ... // if no errors then validate(tail) etc.
    ...
    }

  }

}

无论如何,我认为您可以仅使用某些OOP设计模式(例如责任链)来实现不同的实现。