IComparable
chỉ hoạt động một cách
Giả sử bạn có một Employee
lớp học. Trong một chế độ xem, bạn muốn hiển thị tất cả được Employees
sắp xếp theo tên - trong một chế độ khác, theo địa chỉ. Làm thế nào bạn sẽ đạt được điều đó? Không phải với IComparable
, ít nhất là không theo bất kỳ cách thành ngữ nào.
IComparable
có logic ở sai chỗ
Giao diện được sử dụng bằng cách gọi .Sort()
. Trong chế độ xem hiển thị được Customer
sắp xếp theo tên, hoàn toàn không có mã để ngụ ý cách sắp xếp nó.
Mặt khác, Customer
lớp đang giả định cách nó sẽ được sử dụng - trong trường hợp này, nó sẽ được sử dụng trong một danh sách được sắp xếp theo tên.
IComparable
được sử dụng ngầm
So với các lựa chọn thay thế, rất khó để thấy logic so sánh đang được sử dụng ở đâu - hoặc nếu có. Giả sử IDE chuẩn của bạn và bắt đầu từ Customer
lớp, tôi sẽ phải
- Tìm kiếm tất cả các tham chiếu đến
Customer
- Tìm những tài liệu tham khảo được sử dụng trong một danh sách
- Kiểm tra xem những danh sách đó đã bao giờ
.Sort()
được gọi trên chúng chưa
Điều gì có thể tồi tệ hơn, nếu bạn loại bỏ một IComparable
triển khai vẫn đang được sử dụng, bạn sẽ không gặp phải lỗi hay cảnh báo nào. Điều duy nhất bạn sẽ nhận được là hành vi sai lầm ở tất cả những nơi quá mơ hồ để bạn nghĩ đến.
Những vấn đề này kết hợp, cộng với yêu cầu thay đổi
Lý do tôi đến để nghĩ về điều này là vì nó đã sai đối với tôi. Tôi đã hạnh phúc sử dụng IComparable
trong ứng dụng của tôi trong 2 năm nay. Bây giờ, các yêu cầu đã thay đổi và điều cần được sắp xếp theo 2 cách khác nhau. Nó đã nhận thấy rằng không có gì vui khi trải qua các bước được mô tả trong phần trước.
Câu hỏi
Những vấn đề này khiến tôi nghĩ IComparable
là kém hơn IComparer
hoặc .OrderBy()
, đến mức không thấy bất kỳ trường hợp sử dụng hợp lệ nào sẽ không được phục vụ tốt hơn bởi các lựa chọn thay thế.
Có phải luôn luôn tốt hơn để sử dụng IComparer
hoặc LINQ, hoặc có những lợi thế / trường hợp sử dụng mà tôi không thấy ở đây?
IComparable
nữa, điều này củng cố quan điểm của tôi.
SortedXXX
bộ sưu tập, chúng sẽ yêu cầu các yếu tố được lưu trữ phải có IComparable
hoặc IComparer
được cung cấp. Cũng lưu ý rằng việc đảo ngược thứ tự tự nhiên với một bộ so sánh là không quan trọng và làm cho nó hoạt động với tất cả IComparable
các đối tượng.
IComparable
được coi là cơ chế so sánh mặc định . IComparer
được sử dụng khi bạn muốn ghi đè cơ chế so sánh mặc định.
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634