Я работаю над Scala API (кстати, для Twilio), где операции имеют довольно большое количество параметров, и многие из них имеют разумные значения по умолчанию. Чтобы сократить ввод текста и повысить удобство использования, я решил использовать классы case с именованными аргументами и аргументами по умолчанию. Например, для глагола TwiML Gather:
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE, // Infinite
callbackUrl: Option[String] = None,
timeout: Int = 5
) extends Verb
Здесь интересует параметр callbackUrl. Это единственный параметр, который действительно является необязательным в том смысле, что, если значение не указано, никакое значение применяться не будет (что совершенно законно).
Я объявил это как вариант, чтобы использовать с ним процедуру монадической карты на стороне реализации API, но это накладывает дополнительную нагрузку на пользователя 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)
Насколько я понимаю, есть два варианта (без каламбура), чтобы решить эту проблему. Либо сделайте так, чтобы клиент API импортировал неявное преобразование в область видимости:
implicit def string2Option(s: String) : Option[String] = Some(s)
Или я могу повторно объявить класс case с нулевым значением по умолчанию и преобразовать его в параметр на стороне реализации:
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE,
callbackUrl: String = null,
timeout: Int = 5
) extends Verb
У меня следующие вопросы:
- Есть ли более элегантные способы решить мой конкретный случай?
- В более общем смысле: именованные аргументы - это новая функция языка (2.8). Может ли оказаться, что Опции и именованные аргументы по умолчанию подобны маслу и воде? :)
- Может ли в этом случае использование нулевого значения по умолчанию?