E aí pessoal, gostei desse lance de blog e acabei arrumando um host e um domínio próprio, coisa que nunca tive por falta de necessidade.
Agora com total flexibilidade vai ser possível deixar o blog com uma cara mais agradável, espero que gostem.
É, parece que eu substimei o poder das “expressões lambda“, não que eu achasse que era um recurso ruim ou dispensável, mas cometi o erro gravíssimo de achar que esse recurso consistia apenas numa forma simplificada de se escrever um “delegate anônimo“, recurso que utilizo bastante, muito prático e deixa o código clean quando se precisa de algo simples e rápido.
Mas vocês sabiam que existe uma diferença nas duas linhas de codigo abaixo?
param1 => { return param1.someProperty == someValue; }
param1 => param1.someProperty == someValue
Ambas as linhas de código podem ser usadas como um método que recebe um parâmetro e retorna um valor booleano como resultado. E vocês podem estar se perguntando: “Se as duas podem ser usadas da mesma forma, então o que esse maluco está falando tanto em poder das lambda expressions?”, a resposta é simples e está debaixo do nasmepace System.Linq.Expressions, a primeira linha mostrada acima não pode virar uma Expression Tree, e o que isso quer dizer? Simples, uma Expression é uma classe que possui todas as informações disponíveis sobre a expressão que você montou, ou seja, olhando nós sabemos que a expressão exemplo do exemplo que dei é uma operação binária de igualdade senda aplicada sobre 2 operandos, o da esquerda (param1.someProperty) e o da direita (someValue). Vocês podem falar: “Tá, olhando é fácil deduzir isso, quero ver mostrar o código retornando essas informações”:
Expression<Func<SomeClass, Boolean>> a = param1 => param1.someProperty == someValue;
Console.WriteLine((a.Body as BinaryExpression).Left);
Console.WriteLine((a.Body as BinaryExpression).Method);
Console.WriteLine((a.Body as BinaryExpression).Right);
Com isso eu só deduzo uma coisa, esse recurso é EXTREMAMENTE flexível. É possível inventar basicamente o que quiser onde o uso de expressões sejam o forte, e com essas informações detalhadas sobre cada expressão é possível traduzir isso para qualquer outra coisa, não é à toa que o Linq é baseado nesse recurso das Expressions Trees, o Lambda torna o código muito sucinto e com todas as vantagens das checagens em compile time.
Agora fiquei eufórico de estudar isso a fundo e fazer um artigo sobre Expressions Trees, mas vou primeiro pesquisar na web para ver se já não tem muito material por aí, se eu achar que vale a pena fazer podem esperar.
Vou deixar só uma pergunta no ar: “Se de uma Lambda Expression é possível pegar a Expression Tree, o que vocês achariam de gerar um Lambda através de Expressões?”
Que isso mané? esse C# tá demais, só me surpreende…
Olá, a intenção desse post não é explicar em detalhes como manipular esse recurso que foi incluso na versão 3.0 do C#, mas sim tentar mostrar, com alguns pequenos exemplos, as possíveis maravilhas que o mesmo nos permite fazer. Em algum momento, programando, você já deve ter precisado de algum método simples que não existe naquela classe que você está utilizando, e o pior, essa classe é de terceiros e você não possui permissão de alteração ou o fonte para isso, e aí qual a solução? Vamos a um exemplo:
protected void btnOk_Click(Object sender, EventArgs e) {
pessoa.Altura = Decimal.Parse(txtAltura.Text);
pessoa.Peso = Decimal.Parse(txtPeso.Text);
//... more code ...
}
De cara nós já vemos na primeira linha uma possibilidade de erro caso o conteúdo do txtAltura ou txtPeso não seja um número válido, que tal checarmos se o valor está em um formato numérico válido para conversão?? Bom, infelizmente nós não temos um método unica e exclusivamente para esta finalidade, mas temos um outro que “quebraria nosso galho” e poderíamos recorrer da seguinte forma:
protected void btnOk_Click(Object sender, EventArgs e) {
decimal altura;
decimal peso;
if(Decimal.TryParse(txtAltura.Text, out altura) && Decimal.TryParse(txtPeso.Text, out peso)) {
pessoa.Altura = altura;
pessoa.Peso = peso;
}
//... more code ...
}
Bom, estamos garantindo que nosso código não falhará no caso de uma entrada inválida. Mas convenhamos, não está mais tão bonito de se ler, eu fui forçado a criar 2 variáveis por não existir nenhum método que apenas cheque se uma string está em um formato númerico válido, tanto em String como em Decimal, com isso já estamos aí com 5 linhas de código.
Mas o que vocês acham se pudéssemos fazer da forma abaixo?
protected void btnOk_Click(Object sender, EventArgs e) {
if(txtAltura.Text.Is<Decimal>() && txtPeso.Text.Is<Decimal>()) {
pessoa.Altura = txtAltura.Text.To<Decimal>();
pessoa.Peso = txtPeso.Text.To<Decimal>();
}
//... more code ...
}
Bom, eu achei que ficou bem fácil de ler tudo que está acontecendo aí, vocês também não acham? A questão é, como nós vamos escrever assim se a classe String não possui os métodos Is<T>() e o método To<T>()?? Extension Methods eu respondo ![]()
Você mesmo implementa esses métodos e diz que eles afetam a classe String, feito isso será possível fazer construções do tipo: “12″.Is<int>() mesmo não tendo o código fonte da classe String e isso é possível para qualquer classe. Quem é curioso já deve ter visto que o Linq utiliza bastante deste recurso de Extension Methods, todas as coleções no .net 3.5 estão recheadas de facilidades como Sum, Average, Any, All e muitos outros que foram implementados através do recurso aqui apresentado, ou seja, não foi preciso meter a mão no código das coleções para adicionar estes novos comportamentos, isso é demais.
Com um recurso assim, podemos tornar nosso código muito simples para quem está lendo, e para quem estava acostumado com classes Helper pode repensar em como usar esse recurso no lugar dos Helpers, pois a finalidade é bem parecida sendo o Extesion Methods mais poderoso
Para quem quiser se aprofundar no recurso nada melhor do que o site oficial: http://msdn.microsoft.com/en-us/library/bb383977.aspx
Hoje o assunto é sobre um novo recurso implantado no C# 4.0, o dinamismo. Conheço desenvolvedores que não gostam dessa idéia, afirmam que é um retrocesso abandonar a tipagem estática para deixar toda a checagem em tempo de execução. Eu como defensor de novos recursos nas linguagens gostei da novidade e de saber que posso contar com esse recurso caso o julgue necessário, pode até ser perigoso, mas todo recurso pode ser perigoso se não for utilizado de forma adequada, e não é privando o desenvolvedor de recursos que vamos evitar os códigos ruins.
Na minha opnião, o grande lance de se ter o recurso do dinamismo no C# é que o C# por natureza é tipado estaticamente e o meu pensamento foi: “Maravilha, eles vão juntar o melhor dos 2 mundos que é a checagem em tempo de compilação dos trechos tipados estaticamente associado ao poder da inferência de tipos que o C# já possui, e também vamos poder usufruir da checagem somente em runtime nos objetos tipados como dynamic. Isso vai ficar muito interessante.”, quando de repente me deparei com a seguinte situação ao acompanhar o seguinte post no .NET Unplugged,
static int Funcao(int z) {
return 1;
}
static void Main() {
dynamic x = 3;
DateTime y = Funcao(x);
}
como assim a DLR passa por cima da tipagem estática e trata toda a chamada de um método tipado estáticamente como se fosse dinâmico? Pois este trecho de código retirado do blog citado acima só dá erro em runtime. Eu achava que o recurso dynamic fosse mais inteligente, e nesse caso por exemplo o compilador tinha toda a informação necessária para dar erro em tempo de compilação, a única checagem em runtime que deveria haver na minha opnião é se a variável x pode ser tratada como um int, pois é o tipo de dado que a Funcao espera.
Bom, mesmo não concordando com este comportamento em específico citado acima, ainda acho interessante ter acesso ao recurso dynamic na linguagem, apenas teremos que utilizar com muito cuidado.
E vocês, o que acham deste novo recurso que foi disponibilizado nessa nova versão do C#?
É, depois de muitos boatos no passado, parece que a Google resolveu finalmente criar o seu próprio sistema operacional. E aí? Quais são suas apostas? Será que vai pegar? Bom, a Google é grande e não está aí para brincar, mas também não há como prever a aceitação do mercado em relação a esse novo S.O.
Pelo que deu para saber com esse anúncio oficial é que o alvo inicial serão os notebooks e o Chrome OS pretende focar na facilidade de integração entre a web e o computador, disponibilizando um sistema leve. Parece que eles vão basear o sistema deles no já conhecido kernel do Linux.
Agora especulando um pouquinho, acredito que eles consigam algumas vantagens se aproveitarem as tantas ferramentas na web que eles já possuem, poderiam poupar o usuário de bastante configuração ou instalação de programas salvando parte do perfil do usuário na web, sendo assim o usuário ganharia tempo até mesmo se fosse preciso migrar de equipamento recuperando grande parte de suas configurações, seria no mínimo interessante. Eu até consigo ver uma desvantagem nisso, pois o usuário precisaria estar on line “full time”, a questão é que a seguinte: “De que serve um computador hoje em dia se ele não estiver conectado??” Eu já tentei mexer no meu computador offline, quando meu modem queimou e na boa, não tem como, parece um monte de sucata que não serve para nada. Estar conectado hoje em dia é uma necessidade, e talvez seja aí o Google OS veja oportunidade e consiga inovar de alguma forma. Um amigo sempre me disse: “O sistema operacional está no browser” se referindo ao fato de que tudo em breve estaria na web, talvez o pessoal da Google consiga trazer a web para a máquina aproveitando boa parte do processamento local e não só processamento nos servidores
Ou talvez isso tudo seja somente especulação e esse novo OS não faça nada além da barulho como foi o caso do browser Chrome, que na minha opnião é o mais rápido do mercado, porém não conseguiu bater a concorrência, eu continuei no meu Firefox com todas as extensões que eu utilizo.
Bom, o jeito é esperar para ver. Que venha o Chrome OS para aumentar essa competitividade entre sistemas operacionais, pois quem sai ganhando com isso são os usuários com mais opções e as empresas pesquisando novas tecnologias para derrubar as concorrentes
Welcome to Programming Land, aqui nasce mais um blog sobre tecnologia. Espero poder trazer um bom conteúdo a todos os interessados neste assunto, além de colocar em pauta alguns assuntos que possam ser polêmicos e discutí-los com o pessoal afim de conhecer seus pensamentos sobre tal assunto. Como sou programador geralmente o assunto será relacionado à algum recurso específico de uma plataforma ou linguagem de programação, porém nada impede que eu escreva sobre algum assunto tecnológico como o lançamento de algum browser, S.O. e etc.
Minha maior motivação para esse blog no momento é tentar centralizar o conhecimento dos assuntos que tenho estudado além de compartilhá-los com todos e também colocar minhas idéias sobre determinados assuntos que tenho discutido em blogs alheios.
É isso aí, vamos ver no que isso vai dar