IComparable
só funciona de uma maneira
Digamos que você tenha uma Employee
aula. Em uma exibição, você deseja mostrar todas as Employees
ordenadas por nome - em outra, por endereço. Como você vai conseguir isso? Não com IComparable
, pelo menos não de maneira idiomática.
IComparable
tem a lógica no lugar errado
A interface é usada chamando .Sort()
. Em uma exibição que mostra Customer
classificada por nome, não há nenhum código que implique como será classificado.
Por outro lado, a Customer
classe está assumindo como será usada - nesse caso, que será usada em uma lista classificada por nomes.
IComparable
é usado implicitamente
Em comparação com as alternativas, é muito difícil ver onde a lógica de comparação está sendo usada - ou se é que existe. Supondo que seu IDE padrão e a partir da Customer
classe, terei que
- Pesquise todas as referências a
Customer
- Encontre as referências usadas em uma lista
- Verifique se essas listas já os
.Sort()
chamaram
O que é provavelmente pior, se você remover uma IComparable
implementação que ainda está sendo usada, você não receberá nenhum erro ou aviso. A única coisa que você terá é o comportamento errado em todos os lugares que eram muito obscuros para você pensar.
Essas questões combinadas, além de requisitos variáveis
O motivo pelo qual eu vim a pensar sobre isso é porque deu errado para mim. Felizmente, uso IComparable
meu aplicativo há 2 anos. Agora, os requisitos foram alterados e a coisa precisa ser classificada de duas maneiras diferentes. Percebeu que não é divertido seguir as etapas descritas na seção anterior.
A questão
Esses problemas me fazem pensar IComparable
como inferior a IComparer
ou .OrderBy()
, a ponto de não ver nenhum caso de uso válido que não seria melhor atendido pelas alternativas.
É sempre melhor usar IComparer
ou LINQ, ou existem vantagens / casos de uso que não estou vendo aqui?
IComparable
mais, o que está reforçando meu argumento.
SortedXXX
coleções, elas exigirão que os elementos armazenados sejam IComparable
ou sejam IComparer
fornecidos. Observe também que é trivial reverter a ordem de classificação natural com um comparador e fazê-la funcionar com todos os IComparable
objetos.
IComparable
é considerado o mecanismo de comparação padrão . IComparer
é usado quando você deseja substituir o mecanismo de comparação padrão.
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634