Tôi đang cố gắng mô hình hóa các phản hồi từ các API REST như các lớp trường hợp mà tôi có thể sử dụng đối sánh mẫu trên đó.Tạo mô hình với trường hợp Scala
Tôi nghĩ rằng nó sẽ phù hợp với giả định thừa kế, nhưng tôi thấy rằng điều này không được chấp nhận. Tôi biết đã có các câu hỏi liên quan đến các trường hợp và thừa kế, nhưng câu hỏi của tôi là nhiều hơn về cách bạn mô hình hóa "đúng cách" sau đây mà không cần thừa kế.
tôi bắt đầu với hai lớp trường hợp sau đây, mà làm việc tốt:
case class Body(contentType: String, content: String)
case class Response(statusCode: Int, body: Body)
tức là một cuộc gọi REST sẽ trở lại với một cái gì đó như:
Response(200, Body("application/json", """{ "foo": "bar" }"""))
mà tôi có thể mô hình phù hợp như:
response match {
case Response(200, Body("application/json", json)) => println(json)
case Response(200, Body("text/xml", xml)) => println(xml)
case Response(_,_) => println("Something unexpected")
}
v.v. hoạt động tốt.
đâu tôi chạy vào rắc rối là: Tôi muốn mở rộng helper cho các lớp này trường hợp, chẳng hạn như:
case class OK(body: Body) extends Response(200, body)
case class NotFound() extends Response(404, Body("text/plain", "Not Found"))
case class JSON(json: String) extends Body("application/json", json)
case class XML(xml: String) extends Body("text/xml", xml)
vì vậy mà tôi có thể làm đơn giản hóa mô hình phù hợp như thế này:
response match {
case OK(JSON(json)) => println(json)
case OK(XML(xml)) => println(xml)
case NotFound() => println("Something is not there")
// And still drop down to this if necessary:
case Response(302, _) => println("It moved")
}
và cũng sẽ cho phép mã REST của tôi trực tiếp sử dụng và trả lại:
Response(code, Body(contentType, content))
là e asier để xây dựng một phản ứng tự động.
như vậy ...
tôi có thể lấy nó để biên dịch (với lời cảnh báo không dùng nữa) thông qua:
case class OK(override val body: Body) extends Response(200, body)
Tuy nhiên, điều này dường như không làm việc với mô hình kết hợp.
Response(200, Body("application/json", "")) match {
case OK(_) => ":-)"
case _ => ":-("
}
res0: java.lang.String = :-(
Bất kỳ ý tưởng nào về cách thức này có thể hoạt động? Tôi mở ra các cách tiếp cận khác nhau, nhưng đây là nỗ lực của tôi để tìm cách sử dụng thực tế cho các trường hợp lớp học
Ah, cảm ơn bạn - Tôi thấy tôi đã hoàn toàn bỏ lỡ mục đích không áp dụng cho đến khi điều này; Điều này rất hữu ích. Sẽ kiểm tra điều này hoàn toàn với mã của tôi để chắc chắn rằng tôi đã bảo hiểm và sẽ chấp nhận sau tối nay. – 7zark7
Câu trả lời hay @Sciss. Trình giải nén tùy chỉnh là một trong những điều tôi thích rất nhiều về Scala. – mergeconflict
@ 7zark7 Lưu ý rằng khi bạn sử dụng bộ giải nén tùy chỉnh, bạn sẽ mất được sự đảm bảo đầy đủ của các lớp được niêm phong. –