Search

Rss Posts

Rss Comments

Login

 

Usando tipos anônimos como parâmetro

mai 13

Quando a Microsoft anunciou os tipos anônimos (Anonymous Types) eu fiquei bastante contente, era possível criar tipos rapidamente de uma forma muito fácil. Para quem ainda não conhece essa nova funcionalidade aqui vai o link.

Olhando a sintaxe de construção de um tipo anônimo logo associei aos arrays associativos das linguagens de script, conhecidos como Hash. O C# sempre teve o objeto Hashtable, mas não é flexível comparando com linguagens como Ruby ou Javascript. Só pra exemplificar o que estou dizendo:

No Ruby posso chamar um método passando um hash como parâmetro, sintaxe bastante utilizada no Ruby on Rails, dessa forma:

link_to("Profile", :controller => "profiles", :action => "show")
link_to("Profile", :controller => "profiles", :id => @id)

Nas duas linhas de exemplo os dois últimos itens formam uma Hashtable, no caso do Ruby se chama Hash. Do lado do método também fica fácil de capturar o que foi passado. Com tipos anônimos do C# podemos fazer uma sintaxe bem próxima, que ficaria assim:

LinkTo("Profile", new { Controller = "profiles", Action = "show" });
LinkTo("Profile", new { Controller = "profiles", Id = id });

Mas porque utilizar essa forma de passar parâmetros?

É elegante e limpo em alguns casos. Alguns métodos realizam funções onde é necessário informar MUITOS parâmetros para que se tenha um bom nível de customização da ação que será realizada. E como alguns parâmetros são opcionais acabamos tendo que criar várias sobrecargas para o mesmo método, afim de facilitar a vida de quem vai usar.

No exemplo acima estamos utilizando um método cria um link HTML em um ambiente MVC. Como são muitos parâmetros (texto, controller, action, style, class, id, querystring…) e raramente usaremos todos, utilizamos um tipo anônimo para informar os parâmetros “opcionais”. Assim não precisaremos encher a nossa classe com sobrecargas do método LinkTo.

Outro ganho que temos é na hora de adicionar mais um parâmetro ao método. Adicionamos no tipo anônimo e não precisamos alterar as chamadas na aplicação inteira. Mesmo com refactoring isso as vezes é problemático.

Ok! Agora, como crio meu próprio método?

Para ver como funciona vamos implementar um método que cria links, parecido com o que exemplifiquei antes. Primeiro veremos como fica o método – que vou chamar de “CriaLink” –, depois explico oque ele está fazendo:

Criei um extension method de nome GetPropertyValue na classe Object – para quem não sabe do que se trata extension methods falei sobre isso aqui. Esse método busca o valor da propriedade de qualquer objeto passando apenas seu nome. Isso vai ser muito útil para tratar os tipos anônimos.

Já na implementação do método “CriaLink” primeiramente busco os valores das possíveis propriedades atribuídas ao tipo anônimo passado por parâmetro, que é do tipo Object porque não é possível prever um tipo anônimo. O método GetPropertyValue já se responsabiliza por saber se existe ou não a propriedade, no caso dela não existir o resultado é null.

Depois fica mais simples. Apenas criei uma StringBuilder para concatenar a tag de link que vou criar. Testo se as variáveis provenientes dos parametros possuem valores e concateno o valor relativo a cada propriedade.

Por ultimo mostro como podemos utilizar o método que criamos e o resultado obtido.

Já falei aqui o quanto sou fã da flexibilidade das linguagens de script. O C# tem incorporado algumas funcionalidades dessas linguagens e mesmo assim, ao contrário do que eu imaginava, consegue manter sua característica de ser fortemente tipado. Temos que aproveitar isso e tornar nosso código mais inteligente.

Espero que tenham gostado e qualquer duvida ou sugestão é só entrar em contato ou comentar aqui mesmo. Até mais.

Formatação padrão para DateTime

abr 13

Um dos métodos mais práticos da plataforma .NET é o ToString(String) do objeto DateTime. Com ele podemos formatar a data sem usar outras classes utilitárias, apenas com a própria instancia do objeto de data, dessa forma: data.ToString(”dd/MM/yyyy”).

Ao imprimir a data atual com Console.Write(DateTime.Now) temos um resultado mais ou menos assim na tela: 07/04/2009 23:17:25. Isso acontece porque o Console utiliza o método ToString() de qualquer objeto para transformá-lo em caracteres e imprimir na tela. O objeto a ser impresso nesse caso é um DateTime que por sua vez utiliza internamente ToShortDateString() + ” ” + ToLongTimeString().

Quando se está trabalhando com muitas datas - geração de relatórios, por exemplo - fica trabalhoso e feio ficar replicando a mesma formatação de data no código, como: data.ToString(”dd-MM-yyyy [HH:mm]“) diversas vezes. Não seria mais fácil padronizar a saída de data? Isso é fácil!

var customCulture = new CultureInfo("pt-BR");
customCulture.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy";
customCulture.DateTimeFormat.LongTimePattern = "[HH:mm]";

Thread.CurrentThread.CurrentCulture = customCulture;
Thread.CurrentThread.CurrentUICulture = customCulture;

O que eu fiz aí foi criar uma cultura customizável com base na pt-BR. Depois mudei as formatações de data curta e hora longa - justamente as formatações utilizadas por padrão pelo DateTime. Por ultimo é só atribuir essa cultura à thread corrente, o que geralmente abrange toda nossa aplicação.

Agora o método ToString() do DateTime vai utilizar a formatação “dd-MM-yyyy” para data (ToShortDateString) e “[HH:mm]” para hora (ToLongTimeString). Dessa forma podemos imprimir novamente no console que teremos um resultado diferente: 07/04/2009 [23:17].

Código repetitivo dificulta mudanças, gera erros e retrabalho. Portanto devemos sempre buscar alternativas quando isso acontece.

Afinal, o que é HTTP?

fev 09

Você vê essa sigla diversas vezes por dia, até mesmo quando não está sentado no computador. As vezes nem mesmo olhando a novela consegue se livrar dessa maldita sigla - pode conferir lá nos créditos, está lá. Geralmente vem acompanhada de um site. Mas afinal, o que é HTTP? Mas não me venha com a resposta pronta: Hypertext Transfer Protocol.

Não quero fazer uma abordagem muito técnica para explicar esse protocolo. Vou fazer isso com analogias para que todos possam entender, desde o desenvolvedor WEB - infelizmente alguns não tem nem idéia do que faz o HTTP - até sua avó. Ta bom, a sua avó talvez terá dificuldades.

Protocolo, para esse caso, é um padrão de escrita para que periféricos se entendam. Imagine que dois computadores, projetados por engenheiros que jamais se viram na vida, precisam se “entender”. Como fazer isso? Criando padrões. Na nossa própria linguagem do dia-a-dia temos diversos padrões estabelecidos. Sempre que alguém diz “tchau” você entende que a conversa acabou, isso é um padrão, um protocolo.

Ta, mas e o HTTP? Esse é um protocolo de comunicação de hypertexto, esse nome estranho nada mais é do que uma página na internet. Seu email e portal de fofocas preferido são hypertextos.

Na pratica funciona assim: Quando você digita um endereço no navegador ele precisa enviar alguma coisa para algum lugar dizendo que você quer ler alguma coisa. Imagine que você digitou o endereço do Google. Seu navegador prepara uma carta, isso mesmo, literalmente uma carta para o servidor onde fica o site do Google. O conteúdo dessa carta é mais ou menos isso:

Host: www.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR
3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

Não se apegue aos códigos, como já disse isso são apenas padrões. Esses padrões em especifico são conhecidos como HTTP. Se você não entende é porque não tem muito contato com esse tipo de linguagem, e se não é um desenvolvedor WEB não há problema algum. O importante nessa carta é o seguinte:

Bom dia Google.com,

Gostaria de ler sua página.
Estou usando o navegador Firefox na versão 3.0.6.
No momento eu aceito HTML.
Gostaria de receber o conteúdo em português, mas também entendo inglês.
Uso o padrão de caracteres (letras) ISO-8859 e UTF-8.

Seu navegador vai envelopar essa carta e enviar ao servidor do Google, que você solicitou (um dia falarei sobre TCP e outros protocolos que seriam esse envelope). Essa carta é tecnicamente conhecida como Request HTTP.

Esse servidor vai ler sua carta, porque ele lê TODAS as cartas que chegam, diferente do Papai Noel. Com base nas solicitações feitas na carta, o Google vai criar a resposta:

Location: http://www.google.com.br/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Date: Mon, 08 Feb 2009 22:00:00 GMT
Server: gws
Content-Length: 222
...

O Google está dizendo o seguinte:

Olá,

Aqui é o Google.com.
Estou enviando a página que pediu.
Você pode guardar as informações em seu computador e usa-las em outras visitas.
Estou enviando apenas texto e HTML como você pediu.
Essa carta foi feita as 22:00 horas do dia 08/02/2009 utilizando servidor GWS.
O conteúdo é formado por 222 letras, segue:
...

Coloquei três pontinhos substituindo o conteúdo da página. Esse conteúdo é um pouco mais extenso, mas não é nada de outro mundo. Nada mais é do que a forma codificada do que você vê no navegador. Essa carta de resposta também é conhecida como Response HTTP.

Claro que eu abordei de forma simplista, há muito mais o que se falar sobre esse protocolo e isso vou fazer em outros artigos. O próximo será um pouco mais técnico e sua avó realmente não vai entender. Falarei sobre Cookie e Sessão. Para saber mais detalhes e dar uma treinadinha no inglês técnico nada melhor do que a especificação oficial do HTTP, aqui.

Espero que tenha ficado um pouco mais claro, tanto para desenvolvedores quanto para usuários da internet. E que as avós hi-tech me desculpem!

Agora também no iMasters

fev 09

Esse é um artigo um pouco diferente do habitual. Dessa vez quero apenas agradecer o retorno que tenho recebido desde que comecei a escrever aqui.

Na última sexta-feira (06/02) publiquei meu primeiro artigo no iMasters. Para mim é uma grande honra colaborar com um portal que é tão importante para os profissionais brasileiros na área da internet. Espero que essa parceria dure bastante tempo e que seja bem aproveitada por todos.

No mais, sigo escrevendo, respondendo e principalmente ouvindo sugestões e aprendendo. Obrigado.

Windows 7 no Macbook

jan 28

Eu sei que não estou escrevendo nada novo aqui, todos já leram sobre primeiras impressões do Windows 7. Mas como instalei no Macbook com 1GB de memória - que é folcloricamente um ambiente hostil para Windows -, o sistema ainda é Beta e principalmente por eu não acreditar em todas boas impressões que li, resolvi instalar e pagar pra ver.

O Windows XP é um excelente sistema, mas já está ultrapassado e o tiu Balmer até quer tirá-lo das lojas. Compare com os jogos que saíram no mesmo período, Outubro de 2001, e as mesmas franquias agora em 2009. Nossa, que diferença! Precisamos de um novo sistema da plataforma Microsoft. Baixei o novo Windows com preconceitos pelas ultimas investidas deles em sistemas operacionais para usuários finais - sem citar nomes - mas no fundo esperançoso.

Queimei o DVD, abri o Boot Camp, partição de 40GB para a Microsoft, coloquei o DVD, reiniciou, bonito design do instalador… na hora de selecionar a partição de instalação já tive o primeiro problema: o Boot Camp criou uma partição FAT32 e o W7 precisa de NTFS.

Aí já me deu medo. Não preciso dizer o quão problemático é a manipulação de partições na instalação do Windows. E esse sistema ainda é Beta, mas esse não é meu computador Beta! Mas tive uma grata surpresa, foi simples e fácil. Não sei se minha mãe faria porque não tem a menor ideia do que é partição, mas é só clicar em alguns botões e está tudo pronto, partição formatada. Não precisei apertar L, D, C, F3, Scroll Lock ou qualquer outro botão que meu Macbook nem tem.

Depois disso só foi esperar ele instalar, respondi algumas perguntas como nome do usuário e outras configurações bem explicadas e comecei a usa-lo sem nenhum problema. Desliguei o note apenas antes de dormir, aí percebi que não precisei reiniciar nenhuma vez depois do termino da instalação. Se tratando de Windows isso é demais! Estava acostumado a instalar o XP e reiniciar várias vezes, até pra colocar o mouse… ta bom, exagerei no mouse. Não cheguei a usar o Boot Camp pra Windows, fiquei com preguiça de baixar a versão pra Vista que não vem no CD do Leopard.

No fim, a instalação do Windows 7 em um Macbook foi bem tranquila. Não vou fazer analise das melhorias do sistema, prós e contras, isso é fácil de achar. Se estão curiosos sugiro que instalem o Windows 7, é uma bela surpresa.