Я работаю над API Scala (для 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). Может ли оказаться, что параметры и названные аргументы по умолчанию похожи на нефть и воду?:)
- Возможно ли использовать нулевое значение по умолчанию в этом случае?