IComparable chỉ hoạt động một cách
Giả sử bạn có một Employeelớp học. Trong một chế độ xem, bạn muốn hiển thị tất cả được Employeessắ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 Customersắ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, Customerlớ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ừ Customerlớ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 IComparabletriể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 IComparabletrong ứ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ĩ IComparablelà kém hơn IComparerhoặ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 IComparerhoặ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?
IComparablenữa, điều này củng cố quan điểm của tôi.
SortedXXXbộ sưu tập, chúng sẽ yêu cầu các yếu tố được lưu trữ phải có IComparablehoặ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ả IComparablecá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