IComparable
hanya bekerja satu arah
Katakanlah Anda memiliki Employee
kelas. Dalam satu tampilan, Anda ingin menampilkan semua yang Employees
diurutkan 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 Customer
diurutkan berdasarkan nama, tidak ada kode sama sekali untuk mengimplikasikan bagaimana kode itu akan diurutkan.
Di sisi lain, Customer
kelas 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 Customer
kelas, 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 IComparable
implementasi 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 IComparable
aplikasi 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 IComparable
lebih rendah daripada IComparer
atau .OrderBy()
, sampai tidak melihat adanya use case yang valid yang tidak akan dilayani dengan lebih baik oleh alternatif.
Apakah selalu lebih baik menggunakan IComparer
atau LINQ, atau adakah keuntungan / kasus penggunaan yang tidak saya lihat di sini?
IComparable
lagi, yang memperkuat poin saya.
SortedXXX
koleksi, mereka memerlukan elemen yang disimpan IComparable
atau IComparer
disediakan. Juga perhatikan, bahwa itu sepele untuk membalik urutan urutan alami dengan satu pembanding dan membuatnya bekerja dengan semua IComparable
objek.
IComparable
dianggap sebagai mekanisme perbandingan standar . IComparer
digunakan ketika Anda ingin mengganti mekanisme perbandingan default.
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634