Передача списка функций в метод, который будет выполняться позже, с предоставленными данными - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь создать многоуровневый 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)

Validator:

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)

    }
}

Я делаю что-то действительно запутанное, когда мне не нужно или я просто пропускаю компонент?

По сути, я хочу определить, когда будет вызываться функция и с какими параметрами, но я не хочу, чтобы вызов происходил, пока я не скажу в Валидаторе.Это возможно?

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете использовать lazy val или def при определении levelOneValidation, levelTwoValidations и validationLevel:

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.
    ...
    }

  }

}

В любом случае, я думаю, вы можете реализовать его по-другому, просто используя некоторые шаблоны проектирования ООП, такие как Chain of Responsibility.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...