Option
Монада - отличный выразительный способ справиться с чем-то или чем-либо в Scala. Но что, если нужно регистрировать сообщение, когда "ничего" не происходит? Согласно документации Scala API,
Любой тип часто используется как альтернатива Scala.Option, где Left представляет собой отказ (по соглашению) и Правильно сродни Некоторым.
Однако мне не повезло найти лучшие практики с использованием Либо или хороших примеров реального мира, связанных с Либо для обработки сбоев. Наконец, я придумал следующий код для своего собственного проекта:
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
в своем коде и/или более совершенные идеи по рефакторингу вышеуказанного кода.