Option
monade est une grande manière expressive de traiter avec quelque chose-ou-rien des choses en Scala. Mais que faire si on doit se connecter à un message quand "rien" se produit? Selon la Scala de documentation de l'API,
L'un ou l'autre type est souvent utilisé comme un alternative à la scala.Option où de Gauche représente l'échec (par convention) et Droit est semblable à Certains.
Cependant, je n'avais aucune chance de trouver les meilleures pratiques à l'aide de l'une ou de bons exemples du monde réel impliquant Soit pour des échecs de traitement. Enfin j'ai trouvé le code suivant pour mon propre projet:
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)
}
(Veuillez noter que ceci est un extrait de un projet réel, de sorte qu'il ne compile pas sur son propre)
Je serais heureux de savoir comment vous utilisez Either
dans votre code et/ou de meilleures idées sur la refactorisation du code ci-dessus.