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é+

terça-feira, 12 de janeiro de 2010

70536: Resumo disponível!

Fala galera, só de boa?! Vou postar bem rapidinho só para avisar que a primeira versão do resumo está no repositório!!! O endereço, novamente é este aqui:

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

Por enquanto não organizei uma estrutura de pastas, farei isso ao longo do tempo, até lá o resumo em formato excel está disponível no diretório raiz. Como comecei a estudar ontem, o resumo ainda está pequeno e só abrange o primeiro capítulo, lição 1 e 2, mas acho que amanhã termino o primeiro capítulo todo e ai subirei uma nova versão!!!

Haverão arquivos de Visual Studio, farei uma solution para os exemplos do livro, acho que pode ajudar uma galera além de mim. Enfim, é isso, obrigado pela visita, se gostou COMENTE!

OBS.: PEÇO QUE CASO ENCONTRE QUALQUER INCOÊRENCIA NO RESUMO ME AVISE URGENTEMENTE!!! MUITO OBRIGADO!!!

segunda-feira, 11 de janeiro de 2010

70536: Materiais no SourceForge

Boa noite galera, tudo certo?!

Bem, agora vou esclarecer mais um pouco sobre o objetivo final do blog; na verdade é bem simples; vai ser um blog sobre desenvolvimento de software em geral e terão várias coisas interessantes, como artigos meus (principalmente sobre arquitetura de software, que é um assunto que eu particularmente gosto muito) e de colegas, artigo interessantes traduzidos do inglês e por ai vai.

Porém como agora estou focado em estudar para a prova 70-536 da Microsoft, que é basicamente sobre o Framework .NET, então a maioria dos posts iniciais serão sobre a prova.

Já bolei uma maneira bacana de compoartilhar o material que eu vou produzir como resultado do meu estudo (resumos, e pequenos projetos para testar os conceitos aprendidos, os famosos "hello world"). Criei uma conta no SourceForge (se você ainda não tem cria uma agora; www.sourceforge.com) e então criei um projeto lá, neste repositório estará todo o material.


link do repositório
https://estudos70536.svn.sourceforge.net/svnroot/estudos70536
(É só copiar e colar na aba de checkout do seu controlador de versão favorito)


De cara já posso dizer que estou bolando um resumão do livro (que é em inglês), e eu espero que este resumo que estou fazendo de maneira bem detalhada, possa ser útil a todos na mesma situação que eu!!! O resumoo você também baixa no repositório!



Se você baixar o repositório agora não vai ter nada lá, amanha já coloco a primeira versão do material e faço um post sobre a estrutura do repositório também!!!

Grande abraço galera, se achou legal comente!!!

Um abraço!

70536: Primeiro post!

Fala galera, estou começando este blog para acompanhar a minha evolução nos estudos para a prova de certificação Microsoft 70-536 (prova do framework .NET)... Hoje começo a estudar pra valer, vamo ver no que dá! Até o próximo post, abrazzz!