C# e a odisséia em busca do modelo linguagem de script?

…é a mãe!

Ok, dos títulos bizarros que este blog verá, dificilmente existirá um mais tendencioso e polêmico como este, porém, de uma certa forma esta frase representa minha visão sobre o futuro das linguagem C#.

A explicação sobre esta visão é a simples linha evolutiva da linguagem e as alterações, ganhos e perdas de funcionalidades que vêm aparecendo no caminho. Não estou contra esta mudanças, muito pelo contrário, acredito que uma tecnologia, linguagem, pessoa, etc que tenha capacidade de adaptação ao ambiente em que atua e mais, possa manter-se confiável e assertivo, tem em si uma fonte contínua de energia.

Independentemente do título do tópico, não acredito que um dia estaremos programando JavaScript compilado ou coisa que o valha, porém, a Microsoft está sabendo como aplicar as coisas boas das linguagens de script dentro da linguagem C# de forma a permitir que ela seja cada vez mais assertivo para a infinidade de problemas que temos que solucionar diariamente. ²

Um outro ponto importante de salientar é que desde que a linguagem nasceu estamos verificando inovações não apenas com base nas linguagens de script. A plataforma como um todo esteve e está se renovando com base em diversas outras linguagens, tecnologias e conceitos de mercado, sem preconceitos ou frescuras; Muito foi tentado/evoluido nestes anos em que o .Net está por aí, vide: JScript, Linq to Sql, SqlXml (este ainda tá por ae), Enterprise Libraries, Lambda expressions,  LINQ (nada de OOP mas muita versatilidade), Spec#, IronPython/Ruby, etc…

Acho até que o C# está para chegar a uma linguagem dividida entre OOP, script e funcional, se é que isto é possivel.

C# – dou-lhe 3.0, 3.5, 4.0…

Como o título mensiona especificamente C#, vamos à minha defesa quanto à mutação contínua de alguns pontos da linguagem em direção à versatilidade e por que não dizer Metodologia de linguagens de script. Em uma linha do tempo resumida, de cabeça, posso citar as seguintes paridades:

  • C# 3.0

    • A keyword var é introduzida:
      Com um paradigma obviamente melhorado da mesma keyword do JavaScript, o var vem trazer ao C# uma forma de se dinamizar o desenvolvimento dando ao desenvolvedor uma forma de se dedicar menos à tipagem (ou declaração dos tipos, como preferir) de seus objetos e mais ao desenvolvimento de suas rotinas propriamente ditas sem afetar a performance. ¹

      var eu = "Felipe";
      

      A diferença neste caso está em que o JavaScript não dá a mínima para o tipo de uma determinada variável, sendo perfeitamente possível realizar (em JavaScript):

      var eu = "Felipe";
      eu = new Humano();
      
    • Anonymous type é o cão (no bom sentido):
      Tá, com o var eu posso declarar uma variável de qualquer tipo. Mas e se o objeto não está definido por uma declaração formal de classe?! Por exemplo, declarar o tipo direto em uma variável… Rá! Aposto que quando você viu anonymous type pela primeira vez, levou um choque né?! Não? Então certeza que você já tinha trabalhado com alguma linguagem de script antes.Acredito que eu posso afirmar que em JavaScript, uma declaração em formato Anonymous Type seria:

      var bola = {tamanho:"pequeno", pula:function(){alert("pulando!")} };
      


      PS: Os Anonymous Type no .Net trabalham apenas com PROPRIEDADES, logo, no caso do C# o objeto contido na variável bola acima não poderia ser manipulado utilizando o método pula. Quem sabe nas versões seguintes. ³

      A declaração do mesmo objeto em C# (óbviamente sem o método):

      var bola = new {tamanho="pequeno"; };
      


  • C# 4.0
    • Dynamic, agora é tudo nosso!
      Dynamic é a grosso modo a forma encontrada pela Microsoft de emular o “desleixo” das linguagens de script pela tipagem (mas não totalmente). Na verdade, segundo a própria Microsoft (e faz todo o sentido) a idéia é facilitar a vida na hora de desenvolver, por exemplo, integrações com componentes COM, conversões e chamadas à métodos.Snipet de código C# 4.0 usando dynamic:

      dynamic bola = new Bola();
      bola.Pula();
      
    • Menção honrosa: Parâmetros opicionais
      Sim, no C# 4 você poderá criar métodos com parâmetros que podem ou não ser fornecidos. No exemplo abaixo, o parâmetro b é opcional, caso não fornecido, o mesmo recebe o valor “2”.

      public void Soma(int a, int b = 2);
      

      Pra quem não sabe, o JavaScript não dá a mínima para a assinatura do seu método mas também não te permite realizar overloads de forma bela. O C# 4 tem uma série de regrinhas para definir qual método será utilizado nos overloads que trabalham com parametros opcionais.

  • C# > 4?
    • Existe um estudo em andamento para adicionar a funcionalidade Eval nativamente ao C#! Imagine você poder realizar o seguinte:
      public dynamic Resolve(string operacao){
      return Eval(operacao);
      }
      
      /// Neste caso, uma chamada ao método da seguinte forma...
      /// Retornaria "2" para a variável "resultado"
      int resultado = Resolve("1+1");
      

      Pra não perder o costume, em JavaScript o método eval já é utilizado faz um bom tempo. Uma das aplicações mais comuns para o referido método é a realização do parse de objetos JSON, como o exemplo abaixo:

      var objeto = eval("{texto:'Adeus mundo!', alerta:function(str){alert('alertando: ' + str);}}");
      
      /// Exibe mensagem "alertando: Adeus mundo!";
      objeto.alerta(objeto.texto);
      

      Que fique claro que utilizar eval no geral não é uma boa prática

Curiosidades pouco curiosas

¹- No VB6 (famoso VBZão), você tinha a possibilidade de declarar uma série de variáveis de uma só vez, porém, ao que me consta, apenas a primeira variável da linha era efetivamente tipada, fazendo com que as demais sofressem unboxing durante o processo de execução, o que custava uma certa quantidade de tempo.

²- Conheça o S# (ou Script#), a linguagem de script escrita em C# para .Net.

³ – Descrição de Anonymous Type segundo o MSDN: “Anonymous types are class types that consist of one or more public read-only properties. No other kinds of class members such as methods or events are allowed. An anonymous type cannot be cast to any interface or type except for object.

³+¹ – Static reflection é uma boa…

3 comentários

  1. Finalmente um post que eu gostei, rs..

    Não fala sobre mãos, GOF, chain of responsability, dendritos, entre outros que para mim NÃO DEVEM ser misturados, hehe.

    Foi um post rico e construtivo. Deu para entender o seu ponto de vista e até diria que, com estes avanços da Microsoft (tendo em vista o F#, C# 4.0, .NET Framework 4.0) e que em NADA (pelo menos eu desconheço mudanças como estas que não comuniquem entre si) afeta a interoperabilidade entre os meios, temos um futuro grandioso pela frente se o C# seguir este caminho.

    Abraços.

    Curtir

    • Caro Geek, falo disto no post. A questão é o quão dinâmico este método e seu escopo serão… suas dependências e a forma que o compilador realizara o evaluate de seu corpo.. e claro, criação dinâmica de objetos inteiros.

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: