scala - 什么是基于规则验证的 Scala 惯用方法?

标签 scala business-rules

是否有惯用的解决方案来应用一系列业务规则,例如,来自传入的 JSON 请求。 “传统的”Java 方法非常if-then,Scala 必须提供更好的解决方案。

我已经对模式匹配进行了一些试验,但还没有真正想出一个行之有效的模式。 (我总是以荒谬的嵌套 match 语句结束)...

这是我正在尝试做的一个非常简单的例子:

if (dateTime.isDefined) {
    if (d == None)
        // valid, continue
    if (d.getMillis > new DateTime().getMillis)
        // invalid, fail w/ date format message
    else
    if (d.getMillis < new DateTime(1970).getMillis)
        // invalid, fail w/ date format message
    else
        // valid, continue
} else
    // valid, continue

if (nextItem.isDefined) {
    // ...
}

我在想也许是一种使用一系列链式 Try() 的方法...但看起来这种模式肯定已经存在了。

最佳答案

你的意思是这样的吗?

def test(dateTime: Option[DateTime], nextItem: Option[String]) {
  (dateTime, nextItem) match {
    case (Some(time), _) if time.getMillis > new DateTime().getMillis =>
      //do something
    case (Some(time), _) if time.getMillis > new DateTime(1970).getMillis =>
      //do something
    case (Some(time), _) =>
      //do something else
    case (None, Some(next)) =>
      //do something else
  }
}

当然你也可以使用 for comprehensions with options

val dateTime: Option[DateTime] =
  for {
    date <- getDate()
    time <- getTime()
  } yield new DateTime(date, time)

test(dateTime, nextItem)

链式尝试有很多种方式 这是一个

def validate[A](elem: A): Try[Unit] = {
  ???
}

def test[A](thingsToValidate: Iterable[A]): Try[Unit] = {
  thingsToValidate.view // view makes the whole thing lazy
    .map {              // so we don't validate more than necessary
      case elem: String => validateString(elem)
      case elem: Int => validateInt(elem)
    }.find(_.isFailure)
    .getOrElse(Success(Unit))
}

如果事物的数量是固定的,你也可以使用 for comprehension

def test(a: String, b: String, c: String): Try[Unit] = {
  for {
    _ <- validate(a)
    _ <- validate(b)
    _ <- validate(c)
  } yield(Unit)
}

或使用异常(exception)

def test(a: String, b: String, c: String): Try[Unit] = {
  try {
    validate(a).get
    validate(b).get
    validate(c).get
    Success(Unit)
  } catch {
    case e: Throwable => Failure(e)
  } 
}

关于scala - 什么是基于规则验证的 Scala 惯用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30416862/

相关文章:

scala - Sbt 依赖运行测试

dynamic - 开发人员如何让业务用户定义应用逻辑?

drools - 使用drools规则引擎时如何表示一个对象为null

c# 在域驱动设计中放置业务规则

java - 如何使用 Drools debugWorkingMemorylistener?

php - PHP 中的约束编程

postgresql - 在 slick 中插入默认值

scala - 为什么Scala库只定义直到Tuple22的元组?

scala - Spark : How to run logistic regression using only some features from LabeledPoint?

regex - Scala 如何删除字符串前面和末尾的引号