Использование Either для обработки сбоев в коде Scala
Option
Монада - отличный выразительный способ иметь дело с чем-то или ничем в Scala. Но что делать, если нужно зарегистрировать сообщение, когда «ничего»? происходит? Согласно документации Scala API,
The Either type is often used as an alternative to scala.Option where Left represents failure (by convention) and Right is akin to Some.
Однако мне не повезло найти лучшие практики, использующие Либо, либо хорошие примеры из реальной жизни, в которых Либо для обработки ошибок Наконец, я придумал следующий код для моего собственного проекта:
def logs: Array[String] = {
def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
val config = ca.getConfiguration(PID, null)
config.properties getOrElse immutable.Map.empty
}
def checkType(any: Any): Option[Array[String]] = any match {
case a: Array[String] => Some(a)
case _ => None
}
def lookup: Either[(Symbol, String), Array[String]] =
for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
val array <- checkType(logsParam).toRight('warning -> "unknown type of 'logs' confguration parameter").right}
yield array
lookup.fold(failure => { failure match {
case ('warning, msg) => log(LogService.WARNING, msg)
case ('debug, msg) => log(LogService.DEBUG, msg)
case _ =>
}; new Array[String](0) }, success => success)
}
(Обратите внимание, что это фрагмент из реального проекта, поэтому он не будет компилироваться самостоятельно)
Я был бы признателен за информацию о том, как вы используетеEither
в вашем коде и / или лучшие идеи по рефакторингу приведенного выше кода.