2010-01-22 36 views
25

Các lớp chữ thường trong Scala là các lớp tiêu chuẩn được tăng cường với mẫu khớp, bằng, ... (hoặc tôi sai?). Hơn nữa, chúng không yêu cầu từ khóa "mới" cho tính năng của chúng. Dường như với tôi rằng họ là đơn giản để xác định hơn các lớp học thông thường (hoặc tôi lại sai?).Trường hợp không nên sử dụng các trường hợp ở Scala?

Có rất nhiều trang web cho biết chúng nên được sử dụng ở đâu (chủ yếu là về khớp mẫu). Nhưng họ nên tránh ở đâu? Tại sao chúng ta không sử dụng chúng ở khắp mọi nơi?

Trả lời

20

Có rất nhiều nơi lớp trường hợp không đủ:

  • Khi người ta muốn che giấu cấu trúc dữ liệu.
  • Là một phần của phân cấp loại hơn hai hoặc ba cấp.
  • Khi hàm tạo yêu cầu cân nhắc đặc biệt.
  • Khi bộ giải nén yêu cầu cân nhắc đặc biệt.
  • Khi bình đẳng và mã băm yêu cầu cân nhắc đặc biệt.

Đôi khi các yêu cầu này hiển thị trễ trong thiết kế và yêu cầu một chuyển đổi một lớp chữ thường thành lớp bình thường. Vì lợi ích của một trường hợp thực sự không phải là tất cả những gì tuyệt vời - ngoài một số trường hợp đặc biệt mà chúng được đặc biệt tạo ra - đề nghị của tôi là không phải để làm bất cứ điều gì một trường hợp trừ khi có sử dụng rõ ràng cho nó.

Hoặc nói cách khác, không được thiết kế quá mức.

16

Thừa kế từ các lớp chữ thường có vấn đề. Giả sử bạn có mã như vậy:

case class Person(name: String) { } 

case class Homeowner(address: String,override val name: String) 
    extends Person(name) { } 

scala> Person("John") == Homeowner("1 Main St","John") 
res0: Boolean = true 

scala> Homeowner("1 Main St","John") == Person("John") 
res1: Boolean = false 

Có lẽ đây là những gì bạn muốn, nhưng thường bạn muốn có một == b khi và chỉ khi b == a. Thật không may, trình biên dịch không thể tự động sửa lỗi này cho bạn một cách tự động.

này được thậm chí tệ hơn vì hashCode của Person("John") là không giống như hashCode của Homeowner("1 Main St","John"), vì vậy bây giờ tương đương với hành động kỳ lạ hashCode hành động kỳ lạ.

Miễn là bạn biết điều gì sẽ xảy ra, kế thừa từ các lớp chữ thường có thể mang lại kết quả dễ hiểu, nhưng nó đã bị coi là dạng xấu (và do đó đã không được chấp nhận trong 2.8).

+0

Bạn có liên kết đến tính năng không dùng nữa mà bạn đề cập không? –

+2

Tìm kiếm "trường hợp thừa kế lớp không được chấp nhận" trên Google và ba lần truy cập hàng đầu sẽ thảo luận về điều đó. Sự phản đối là trong 2.8 codebase đã có - nếu bạn tải xuống bản dựng hàng đêm, bạn có thể dùng thử với một ví dụ nhỏ. –

0

Có thể hấp dẫn khi sử dụng các lớp chữ hoa bởi vì bạn muốn tự do toString/equals/hashCode. Điều này có thể gây ra vấn đề, do đó, tránh làm điều đó.

Tôi muốn có một chú thích cho phép bạn có được những thứ tiện dụng đó mà không cần tạo ra một lớp vỏ, nhưng có thể điều đó khó hơn âm thanh.

+2

"có thể gây ra sự cố". có vấn đề gì? –

1

Một nhược điểm được đề cập trong Programming in Scala là do những thứ được tạo tự động cho các lớp vỏ, các đối tượng sẽ lớn hơn các lớp bình thường, vì vậy nếu hiệu quả bộ nhớ là quan trọng, bạn có thể muốn sử dụng các lớp thông thường.

Các vấn đề liên quan