IComparable
funziona solo in un modo
Supponiamo che tu abbia una classe Employee
. In una vista, vuoi mostrare tutto Employees
ordinato per nome - in un altro, per indirizzo. Come hai intenzione di raggiungere questo? Non con IComparable
, almeno non in modo idiomatico.
IComparable
ha la logica nel posto sbagliato
L'interfaccia viene utilizzata chiamando .Sort()
. In una vista che mostra Customer
ordinata per nome, non vi è alcun codice per implicare il modo in cui verrà ordinato.
D'altra parte, la classe Customer
sta assumendo come verrà utilizzata - in questo caso, verrà utilizzata in una lista ordinata per nome.
IComparable
è usato implicitamente
In confronto con le alternative, è molto difficile vedere dove viene utilizzata la logica comparativa, o se non del tutto. Assumendo il tuo IDE standard e partendo dalla classe Customer
, dovrò
- Cerca tutti i riferimenti a
Customer
- Trova i riferimenti utilizzati in un elenco
- Verifica se tali elenchi hanno mai ricevuto
.Sort()
su di essi
Ciò che è probabilmente peggio, se rimuovi un'implementazione IComparable
ancora in uso, non ricevi alcun errore o avviso. L'unica cosa che otterrai è un comportamento sbagliato in tutti i posti che erano troppo oscuri per te da pensare.
Questi problemi combinati, oltre a cambiare i requisiti
La vera ragione per cui sono venuto a pensare a questo è perché è andato storto per me. Ho usato felice IComparable
nella mia domanda per 2 anni. Ora, i requisiti sono cambiati e la cosa deve essere ordinata in 2 modi diversi. Ha notato che non è divertente seguire i passaggi descritti nella sezione precedente.
La domanda
Questi problemi mi fanno pensare a IComparable
come inferiore a IComparer
o .OrderBy()
, al punto di non vedere alcun caso d'uso valido che non sarebbe servito meglio dalle alternative.
È sempre meglio usare IComparer
o LINQ, o ci sono vantaggi / casi d'uso che non vedo qui?