IComparable hanya bekerja satu arah
Katakanlah Anda memiliki Employeekelas. Dalam satu tampilan, Anda ingin menampilkan semua yang Employeesdiurutkan berdasarkan nama - di tampilan lain, berdasarkan alamat. Bagaimana Anda akan mencapai itu? Tidak dengan IComparable, setidaknya tidak dengan cara idiomatis.
IComparable memiliki logika di tempat yang salah
Antarmuka digunakan dengan memanggil .Sort(). Dalam tampilan yang menunjukkan Customerdiurutkan berdasarkan nama, tidak ada kode sama sekali untuk mengimplikasikan bagaimana kode itu akan diurutkan.
Di sisi lain, Customerkelas mengasumsikan bagaimana akan digunakan - dalam hal ini, bahwa kelas akan digunakan dalam daftar yang diurutkan berdasarkan nama.
IComparable digunakan secara implisit
Dibandingkan dengan alternatif, sangat sulit untuk melihat di mana logika perbandingan digunakan - atau jika sama sekali. Dengan asumsi IDE standar Anda dan mulai dari Customerkelas, saya harus
- Cari semua referensi
Customer - Temukan referensi yang digunakan dalam daftar
- Periksa apakah daftar itu pernah
.Sort()memanggil mereka
Yang mungkin lebih buruk, jika Anda menghapus IComparableimplementasi yang masih digunakan, Anda tidak mendapatkan kesalahan atau peringatan. Satu-satunya hal yang akan Anda dapatkan adalah perilaku yang salah di semua tempat yang terlalu tidak jelas untuk Anda pikirkan.
Masalah-masalah ini digabungkan, ditambah perubahan persyaratan
Alasan saya berpikir tentang ini adalah karena itu salah bagi saya. Saya telah dengan senang hati menggunakan IComparableaplikasi saya selama 2 tahun sekarang. Sekarang, persyaratannya berubah dan masalahnya perlu disortir dalam 2 cara berbeda. Telah memperhatikan bahwa tidak menyenangkan melalui langkah-langkah yang dijelaskan di bagian sebelumnya.
Pertanyaan
Masalah-masalah ini membuat saya berpikir IComparablelebih rendah daripada ICompareratau .OrderBy(), sampai tidak melihat adanya use case yang valid yang tidak akan dilayani dengan lebih baik oleh alternatif.
Apakah selalu lebih baik menggunakan ICompareratau LINQ, atau adakah keuntungan / kasus penggunaan yang tidak saya lihat di sini?
IComparablelagi, yang memperkuat poin saya.
SortedXXXkoleksi, mereka memerlukan elemen yang disimpan IComparableatau IComparerdisediakan. Juga perhatikan, bahwa itu sepele untuk membalik urutan urutan alami dengan satu pembanding dan membuatnya bekerja dengan semua IComparableobjek.
IComparabledianggap sebagai mekanisme perbandingan standar . IComparerdigunakan ketika Anda ingin mengganti mekanisme perbandingan default.
ReverseComparer<T>: gist.github.com/jackfarrington/078e7af7bc82482aa634