Je travaille sur une API Scala (pour Twilio, d'ailleurs) où les opérations ont un nombre assez important de paramètres et beaucoup d'entre eux ont des valeurs par défaut raisonnables. Pour réduire la saisie et améliorer la convivialité, j'ai décidé d'utiliser des classes de cas avec des arguments nommés et par défaut. Par exemple pour le verbe TwiML Gather :
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE, // Infinite
callbackUrl: Option[String] = None,
timeout: Int = 5
) extends Verb
Le paramètre qui nous intéresse ici est callbackUrl . C'est le seul paramètre qui est vraiment facultatif dans le sens où si aucune valeur n'est fournie, aucune valeur ne sera appliquée (ce qui est parfaitement légal).
Je l'ai déclaré en tant qu'option afin de réaliser la routine de carte monadique avec elle du côté de l'implémentation de l'API, mais cela représente une charge supplémentaire pour l'utilisateur de l'API :
Gather(numDigits = 4, callbackUrl = Some("http://xxx"))
// Should have been
Gather(numDigits = 4, callbackUrl = "http://xxx")
// Without the optional url, both cases are similar
Gather(numDigits = 4)
D'après ce que je peux voir, il y a deux options (sans jeu de mots) pour résoudre ce problème. Soit faire en sorte que le client API importe une conversion implicite dans la portée :
implicit def string2Option(s: String) : Option[String] = Some(s)
Je peux aussi redéclarer la classe case avec un défaut nul et la convertir en option du côté de l'implémentation :
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE,
callbackUrl: String = null,
timeout: Int = 5
) extends Verb
Mes questions sont les suivantes :
- Existe-t-il des moyens plus élégants de résoudre mon cas particulier ?
- Plus généralement : Les arguments nommés sont une nouvelle fonctionnalité du langage (2.8). Il se pourrait que les options et les arguments nommés par défaut soient comme l'huile et l'eau :)
- L'utilisation d'une valeur par défaut nulle pourrait-elle être le meilleur choix dans ce cas ?