Tôi đang làm việc trên API Scala (đối với Twilio, nhân tiện), nơi hoạt động có số lượng thông số khá lớn và nhiều thông số này có giá trị mặc định hợp lý. Để giảm đánh máy và tăng khả năng sử dụng, tôi đã quyết định sử dụng các lớp chữ hoa với các đối số được đặt tên và mặc định. Ví dụ cho TwiML Thu thập động từ:Các tùy chọn và đặt tên các đối số mặc định như dầu và nước trong API Scala?
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE, // Infinite
callbackUrl: Option[String] = None,
timeout: Int = 5
) extends Verb
Tham số quan tâm ở đây là callbackUrl. Đây là tham số duy nhất là thực sự là tùy chọn theo nghĩa là nếu không có giá trị nào được cung cấp, sẽ không có giá trị nào được áp dụng (hoàn toàn hợp pháp).
Tôi đã tuyên bố nó như là một tùy chọn để thực hiện thói quen bản đồ monadic với nó ở phía bên thi hành API, nhưng điều này đặt thêm một số gánh nặng cho người sử dụng 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)
As far như tôi có thể tạo ra, có hai lựa chọn (không có ý định chơi chữ) để giải quyết vấn đề này. Hoặc là làm cho khách hàng API nhập một chuyển đổi ngầm vào phạm vi:
implicit def string2Option(s: String) : Option[String] = Some(s)
Hoặc tôi có thể redeclare lớp trường hợp với một mặc định rỗng và chuyển nó sang một tùy chọn ở phía bên thực hiện:
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE,
callbackUrl: String = null,
timeout: Int = 5
) extends Verb
Câu hỏi của tôi như sau:
- Còn cách nào khác để giải quyết trường hợp cụ thể của tôi không?
- Thông thường hơn: Đối số được đặt tên là một tính năng ngôn ngữ mới (2.8). Nó có thể bật ra rằng tùy chọn và đặt tên đối số mặc định giống như dầu và nước? :)
- Có thể sử dụng giá trị mặc định null là lựa chọn tốt nhất trong trường hợp này?
Cảm ơn rất nhiều câu trả lời hay cho câu hỏi 1 và 3! Tôi sẽ thực hiện một số mẫu sử dụng nhiều hơn các trường hợp sử dụng API trước khi quyết định có nên sử dụng tùy chọn của Aaron hay không, với tùy chọn hoặc chỉ sử dụng một giá trị mặc định null. Tuy nhiên, quá xấu không có sự lựa chọn rõ ràng - có lẽ chúng ta cần một tính năng ngôn ngữ mới để làm cho sự lựa chọn không có trí tuệ? – DaGGeRRz