IEqualityComparer facilitado

by Fujiy 25. fevereiro 2010 22:16

Quando usamos o Linq temos alguns extension methods muito úteis como Distinct e Except. Porém para fazer uma comparação customizada é necessário criar uma classe que herde de IEqualityComparer<T> e passar uma instancia como parâmetro, o que considero muito sujo, principalmente se cada comparar for de um jeito.

Encontrei uma solução no blog do Brendan Enrick, porém pra mim não funcionou. não sei se fiz algo errado, mas o LINQ sempre chamava primeiro o GetHashCode, que se não fosse igual já retornava false sem nem passar pelo Equals. Alterei para aceitar uma Func que será usada no GetHashCode também, assim só precisamos dessa classe e podemos fazer a chamada da seguinte forma:

List<MyObject> x = myCollection.Except(otherCollection, (x, y) => x.Codigo == y.Codigo, z => z.Codigo).ToList();

Onde "(x, y) => x.Codigo == y.Codigo" é nossa comparação, e  z => z.Codigo o GetHashCode. Assim usamos o Except ou Distinct da mesma maneira que o Where, First, Any, etc

Código:

public static class InterfaceEnumerableExtension
{
     public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first,
     IEnumerable<TSource> second, Func<TSource, TSource, bool> comparer, Func<TSource, int> hashFunction)
     {
         return first.Except(second, new LambdaComparer<TSource>(comparer, hashFunction));
     }
 }

public class LambdaComparer<T> : IEqualityComparer<T>
{
     private readonly Func<T, T, bool> lambdaComparer;
     private readonly Func<T, int> lambdaHash;

     public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
     {
         if (lambdaComparer == null)
             throw new ArgumentNullException("lambdaComparer");
         if (lambdaHash == null)
             throw new ArgumentNullException("lambdaHash");

         this.lambdaComparer = lambdaComparer;
         this.lambdaHash = lambdaHash;
     }

     public bool Equals(T x, T y)
     {
         return lambdaComparer(x, y);
     }

     public int GetHashCode(T obj)
     {
         return lambdaHash(obj);
     }
}

Tags:

Podcast sobre Qualidade de Software

by Fujiy 11. fevereiro 2010 10:01

Estou acompanhando os podcasts do .Net Architects e tenho gostado muito dos debates.

Esta semana saiu mais um, sobre Qualidade de Software:

"Neste episódio do .Net Architects Podcast Alexandre Valente, Giovanni Bassi e Denis Ferrari falam sobre qualidade de software, esse episódio nasceu de uma discussão iniciada pelo Alexandre Valente no .Net Architects.

Alguns dos temas abordados foram:
O que é qualidade de software.
Como medir qualidade de Software.
Responsabilidades do gerente de TI.
Treinamento x Qualidade."

Download (13,06MB)

.Net Architects Podcast

Tags: ,

Notícias

ASP.NET MVC 2 Release Candidate 2

by Fujiy 6. fevereiro 2010 11:41

Foi lançado um novo release candidate do ASP.NET MVC 2. Esta versão será importante pois traz algumas modificações importantes, principalmente nas validações.

Antes se você recebia um tipo "Comentario" no seu Action Method, o Model Binder do ASP.NET MVC somente validava os campos que vieram no POST, por exemplo um campo obrigatório que viesse vazio. O problema era que um usuário mal intencionado poderia alterar o seu html do lado cliente e fazer um under-post, evitando que a validação pegasse o erro. Este era um comportamento intencional, pois os desenvolvedores do ASP.NET MVC queriam permitir que fossem criadas Views parciais sem a necessidade de se ter outra classe específica para ela.

Alguns desenvolvedores do MVC ainda alertam que mesmo assim o problema não está totalmente resolvido, pois a Validação não é um sistema de segurança, e sim somente para validar. Não vai previnir que o usuário faça por exemplo um over-post, por exemplo mudando a flag do comentario para Aprovado. Por isso a importância de ser usar uma white/black-list em todos os binds, principalmente as white-lists que são mais seguras.

 Além disso os Input Helpers fortemente tipados agora suportam indices, algumas melhorias de usabilidade nos validators, o jQuery foi atualizado pro 1.4.1 e foram feitas melhorias de performance.

Tags:

Notícias

CodePlex agora suporta Mercurial

by Fujiy 27. janeiro 2010 09:56

Recentemente o CodePlex passou a suportar o Mercurial como opção para controle de versão, assim como o GoogleCode também. O Mercurial assim como o Git, é um sistema de controle de versão distribuído, permitindo que os usuários criem clones do seu repositório e possam dar commit nos seu próprio repositório por exemplo.

No blog do CodePlex a Sara Ford da  uma explicação para quem nunca usou um controle de versão distribuído.

Tags:

Notícias

jQuery 1.4

by Fujiy 19. janeiro 2010 08:54

Foi lançada a versão 1.4 do jQuery e para divulgar o lançamento foi publicado o site jQuery14.com. O site será atualizado diariamente durante 14 dias, com vídeos e artigos sobre as novas funcionalidades. Parece que a nova nersão está bem mais rápida. Para fazer o download, acesse o site oficial jQuery

Tags:

Notícias

Desafio V - Retornando tipos anônimos

by Fujiy 13. janeiro 2010 08:41

Os tipos anônimos introduzidos no C# 3.0 para facilitar o uso do LINQ agilizam o desenvolvimento, evitando que tenhamos que declarar uma classe em casos específicos.

Mas esses tipos tem alguma limitações, intencionais, por exemplo, não podemos usar os tipos gerados como retorno ou parâmetro de um método. Até porque os tipos gerados são internal.

O desafio é retornar um tipo anônimo e usá-lo no seu código, sem usar Reflection. Não tem uso prático, já que não é uma boa prática fazer isso, mas serve como exercício.

 

Para adiantar, vou postar o método que faz o retorno:

public static object RetornaAnonimo()
{
return new {Id = 1, Nome = "João"};
}

 

Agora resta conseguir usar o tipo numa chamada. Ex.:

var retorno = RetornaAnonimo();

....

 

Tags:

Artigos

O Melhor do JavaScript

by Fujiy 13. janeiro 2010 06:47

Estou lendo o livro "O Melhor do JavaScript" depois que ouvi falar dele num podcast sobre linguagens dinâmicas do .Net Architects. O livro é pequeno, cerca de 160 páginas, mas da uma boa noção sobre JavaScript, e melhor sobre como usá-lo bem.

JavaScript apesar  de ser poderoso, tem muitas "armadilhas" e problemas na linguagem (quem nunca usou == achando que estava fazendo um ===?). No ECMAScript 5 muitos problema são resolvidos com a opção "use strict", mas enquanto isso, cabe a nós definir suas melhores características e usá-las.

O autor, Douglas Crockford, que é desenvolvedor no Yahoo, considerado "O especialista" em JavaScript pela comunidade de desenvolvimento e também quem manter o formato JSON, mostra o melhor do JavaScript e só cita as partes ruins para podemos evitá-las.

Você pode achar o livro no Submarino

 

Tags:

Livros

ASP.NET MVC 2 Release Candidate

by Fujiy 18. dezembro 2009 07:10

Já está disponível o RC do ASP.NET MVC 2 no seguinte link: ASP.NET MVC 2 RC

As novidades são em maioria nas validações do lado cliente.

Já vou atualizar, eu estava usando o Beta, mas parece que não teve quase nenhum breaking change entre eles.

Outra novidade que vi no blog do ScottGu é que teremos um RC público do Visual Studio 2010 em fevereiro, eles estão fazendo diversas otimizações para deixar a IDE mais rápida. Assim esperam um retorno dos usuários e talvez o lançamento final, previsto pra março, atrase algumas semanas, para ter mais tempo de enviarmos os feedbacks.

Tags: , ,

Notícias

Noda Time

by Fujiy 6. novembro 2009 19:47

Depois de pedir sugestões sobre o nome do projeto, Jon Skeet iniciou um novo projeto open source. É um "port" do Joda Time, uma biblioteca para manipular data e hora no Java.

Segundo ele, o foco não será apenas no código, mas em administrar o projeto e fazer as escolhas corretas.

Alguns exemplos:

Qual versão do .Net surportar? 2.0? 3.5? 4.0? Silverlight? etc...

Será possível compilar uma versão usando recursos do .Net 4.0 e mesmo assim facialmente criar uma versão pro 3.5?

Quais ferramentas para documentar, testar, mocks deve ser usada?

Entre outras...

Já existe o site do projeto, Noda Time e o grupo no google, pretendo acompanhar e até contribuir, é uma boa chance pra aprender mais sobre como gerenciar um projeto, além de como desenvolver um código de alta qualidade.

Tags:

Notícias

Visual Studio 2010 Beta 2 disponível para o público

by Fujiy 22. outubro 2009 07:01

Segunda-feira, 19, o VS2010 foi disponibilizado aos assinantes do MSDN, o ontem para o grande público.

Para fazer o download basta ir para esta página: Visual Studio 2010. Encontrei o link em um blog da Microsoft, pois o site oficial do VS2010 apenas disponibiliza um web installer. O que não me agrada muito.

Tags: ,

Notícias