Les Options sont nommés et les arguments par défaut comme l'huile et l'eau dans une API Scala?

Je suis en train de travailler sur un Scala (API Twilio pour, par la voie), où les opérations ont un assez grand nombre de paramètres et beaucoup de ces derniers ont des valeurs sensibles par défaut. Pour réduire la frappe et d'augmenter la convivialité, j'ai décidé d'utiliser des classes de cas avec des nommés et des arguments par défaut. Par exemple, pour les TwiML Rassembler verbe:

case class Gather(finishOnKey: Char = '#', 
                  numDigits: Int = Integer.MAX_VALUE, //Infinite
                  callbackUrl: Option[String] = None, 
                  timeout: Int = 5
                  ) extends Verb

Le paramètre d'intérêt, ici, est callbackUrl. C'est le seul paramètre qui est vraiment facultatif dans le sens que si aucune valeur n'est fournie, aucune valeur ne sera appliquée (ce qui est parfaitement légal).

J'ai déclaré comme une option pour faire les monadique carte de routine avec elle sur la mise en œuvre de l'API, mais ce qui met un peu la charge supplémentaire sur l'API utilisateur:

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)

Aussi loin que je peux faire, il existe deux options (no pun intended) pour résoudre ce problème. Soit faire de l'API client importer une conversion implicite dans l'étendue:

implicit def string2Option(s: String) : Option[String] = Some(s)

Ou je peux redeclare le cas de la classe avec une valeur null par défaut et de le convertir à une option sur le côté de mise en œuvre:

case class Gather(finishOnKey: Char = '#', 
                  numDigits: Int = Integer.MAX_VALUE, 
                  callbackUrl: String = null, 
                  timeout: Int = 5
                  ) extends Verb

Mes questions sont les suivantes:

  1. Y a plus élégante des façons de résoudre mon cas particulier?
  2. Plus généralement: les arguments Nommés est une nouvelle fonctionnalité du langage (2.8). Pourrait-il s'avérer que les Options et nommé par défaut arguments sont comme l'huile et l'eau? 🙂
  3. Peut utiliser une valeur par défaut null être le meilleur choix dans ce cas?
  • Merci pour beaucoup de bonnes réponses pour la question 1 et 3! Je vais trouver d'autres exemples d'utilisation les cas d'utilisation de l'API avant de décider d'utiliser Aaron Opt, tenir à l'Option ou tout simplement utiliser une valeur null par défaut. Dommage qu'il n'y sont pas évidents, mais - peut-être que nous avons besoin d'une nouvelle fonctionnalité pour faire le choix d'une évidence?
InformationsquelleAutor DaGGeRRz | 2010-11-16