sexta-feira, 22 de janeiro de 2010

.NET: Ordenando listas Genéricas

Bom dia galera,

Enquanto não estudo e resumo o segundo capítulo do livro da certificação vou fazer um post hoje sobre ordenação de listas genéricas. Esse post me veio em mente após encontrar esta pergunta em um dos meus fóruns preferidos, o STACKOVERFLOW (se você ainda não tem uma conta, faça agora, é daqueles fóruns legais que você ganha pontos quando responde e tudo mais!). Então na verdade vou replicar a resposta que eu dei lá. AQUI SE ENCONTRA O POST ORIGINAL NO FÓRUM.

Atenção, o código para este exemplo pode ser baixado na íntegra neste endereço:
(link)
(use o seu controlador de versão preferido para baixalo ou clique diretamente no link!)
PERGUNTA:
"Estou precisando ordenar uma lista genérica em ordem ascendente (por um campo de data), Framework 2.0"

RESPOSTA:
Toda lista List implementa o método .Sort(), (a palavra "sort" significa "ordenar" em inglês), e um dos overloads deste método recebe um IComparer comparer como parâmetro. Ja que é exatamente este overload que usaremos vamos responder primeiro a seguinte pergunta:

O que é um IComparer comparer ? Nada mais é do que uma instância de qualquer classe que implemente a interface IComparer. A interface IComparer te obriga a escrever o método .Compare(T a, Tb), que retorna um inteiro dizendo se a instância a é maior, menor ou igual a instância b. Este método deve retornar 1 caso a > b, -1 caso b < a e 0 caso a == b

Para o nosso exemplo ordenaremos uma lista da objeto Produto, que criaremos logo a seguir.

Portanto, o que precisamos são de instâncias de novas classes. Cada classe nova criada deverá ficar responsável por uma maneira (ou uma estratégia) de ordenação de lista, por exemplo, poderiamos criar classes de ordenação chamadas OrdenarProdutoPorNome, ou OrdenarProdutoPorPreço, ou mesmo OrdernarProdutoPorData, como solicitado.

A princípio esta abordagem pode parecer pouco interessante mas ao fim do artigo darei bons argumentos para isto.

Vamos definir a classe produto;



Podemos criar a classe de ordenamento por preço exatamente desta maneira:







O método .CompareTo() de um Decimal tem exatamente este código;

if(this > y) return 1;
if(this < y) return -1;
return 0;

Ou seja, não precisamos miplementar uma lógica específica para isto pois já temos este método pronto. O mesmo para Strings e outros objetos que já implementaram a lógica da comparação através deste método. Ao invés de chamar simplesmente o método .CompareTo() você poderia implementar uma lógica personalizada para qualquer tipo de objeto e desta maneira fazer as ordenações das maneiras mais diversas possíveis.

Mas ainda não cumprimos um dos requisitos da pergunta, a ordenação ASCENDENTE. Na verdade este item já está resolvido, já que "por default" o método .Sort() utiliza o resultado do método .Compare() para ordenar os itens de forma ascendente. Portanto, vamos supor que tivéssemos que ordenar a lista de maneira DECRESCENTE. Para resolver este item, seria muito simples, apenas multiplicariamos o resultado do método .CompareTo() por -1, porém vamos tratar isso de uma maneira melhor, veja o código;




Desta maneira podemos receber a sequência de ordenação como um parâmetro vindo do usuário consumindo esta classe.

A maneira que poderiamos testar o nosso exemplo seria assim:



Obtemos a saída;



Conclusão:

1- Utilizar classes separadas para ordenar uma lista é interessante porque permite a você encapsular o algoritmo de ordenação e se você precisa ordenar este tipo de lista cem vezes no seu sistema e depois precisa mudar este algoritmo você só muda uma vez.

2- Você poderia implementar a interface IComparable no próprio objeto Produto porém você ficaria preso a apenas uma maneira de ordenar seu objeto. Na verdade você poderia implementar um monte de "Ifs" o que com certeza comprometeria a legibilidade do código e ia acabar gerando um método com quinhentas linhas e difícil de entender.

3- Você está usando um Design Pattern chamado STRATEGY sem saber. E isso com certeza é uma boa prática. Este padrão será abordado num próximo post apenas sobre este padrão.

SE VOCÊ GOSTOU OU ESTE POST TE AJUDOU ENTÃO  COMENTE!!!!!!!! 




segunda-feira, 18 de janeiro de 2010

70536: Resumo atualizado - Capitulo 01 Completo!

Fala galera, tudo certo!? Este post é só pra avisar que o resumo foi atualizado no repositório, está com o primeiro capítulo completamente resumido. Na verdade é um resumo até bem detalhado, espero que ajude. Ainda falta fazer a revisão de algumas partes e tudo mais... Ah, quem reclamar do formato, ser em .XLSX, fica tranquilo porque vou fazer uma versão html e postar em um HPG da vida..!!! Hehe

CLIQUE E BAIXE, OU BAIXE PELO TORTOISE (QUALQUER DÚVIDA, É SÓ COMENTAR)
https://estudos70536.svn.sourceforge.net/svnroot/estudos70536


https://estudos70536.svn.sourceforge.net/svnroot/estudos70536


https://estudos70536.svn.sourceforge.net/svnroot/estudos70536

Ah, poiseh, demorou pra atualizar porque a empresa que eu trabalho nos dá 4 horas por semana pra estudar e é basicamente lká que faço este resumo, portanto, reclamem com o meu chefe pra dar mais tempo, que sairá mais rápido o resumo do livro todo!!!

Então galera já estou bolando meu primeiro post sobre padrões de projeto. Esperem, porque vai ser muito legal!!!!!!

Abraço ai galera! Quem gostou, por favor comenta e/ou visite o site dos patrocinadores! ;-]

Até+