Option
モナドは、Scalaで何かまたは何もないことに対処するための優れた表現方法です。しかし、「何も起こらない」ときにメッセージをログに記録する必要がある場合はどうなるでしょうか。Scala APIのドキュメントによると、
どちらかのタイプは、scala.Optionの代わりによく使用されます。ここで、Leftは(慣例により)失敗を表し、RightはSomeに似ています。
ただし、Eitherを使用したベストプラクティス、または処理の失敗にEitherを含む実際の良い例を見つけることができませんでした。最後に、自分のプロジェクト用に次のコードを考え出しました。
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
コードでどのように使用されているか、および/または上記のコードをリファクタリングするためのより良いアイデアを知っていただければ幸いです。