Arquivo da categoria: C#

Generators com Node.js + koa e C#

Agora que você aprendeu tudo sobre generators neste blog, temos uma surpresa bem bacana!

Uns carinhas que criaram um tal de express (que é simplesmente o módulo mais sensacional e utilizado do Node.js), resolveram que com esta especificação do ECMAScripts, temos um novo mundo para ser explorado, mais limpo e performático, que resolverá em muito o mundo da programação assíncrona e da bagunça causada pelos callbacks (uma das coisas mais ilegíveis do Javascript). Foi assim que nasceu o co, um framework para generators.

Baseado no co, eles acabam de lançar o koa – a nova geração de framework web para Node.js – ainda é beta, afinal o ECMAScript 6 nem foi publicado ainda, mas já dá para ver o que vem por aí.

E é por isto que dei tantas voltas no artigo anterior… Para mim é muito importante que você entenda o que são os Generators, pois ele é a base de uma possível revolução que haverá no mundo do Node.js muito em breve.

Agora vamos ao nosso exemplo para frisar a ideia!

Vamos começar com o C#, uma das linguagens mais robustas e impressionante que eu já tive o prazer de trabalhar. Fazia muito tempo que não escrevia nada nesta linguagem e para mim foi como um reencontro com um velho amigo.

Vou criar um projeto de teste unitário. Tudo se resolve no código abaixo, que está no mesmo arquivo! É só copiar no seu Visual Studio e executar o teste.

* Dica: faça um favor e vá debugando linha-a-linha e observe a diferença da execução a partir do método ObterPessoasComYield e ObterPessoasSemYield.

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;

namespace YieldTest{

  [TestClass]
  public class UnitTest1{

    [TestMethod]
    public void Teste(){
        var pessoasComYield = ObterPessoasComYield();

        foreach (var pessoa in pessoasComYield)
          Console.WriteLine(“Com Yield -> Autor: {0} {1}”, pessoa.Nome, pessoa.Sobrenome);

        var pessoasSemYield = ObterPessoasSemYield();

        foreach (var pessoa in pessoasSemYield)
          Console.WriteLine(“Sem Yield -> Autor: {0} {1}”, pessoa.Nome, pessoa.Sobrenome);
    }

    public IEnumerable<Pessoa> ObterPessoasComYield(){
      yield return new Pessoa { Nome = “José”, Sobrenome = “Saramago” };
      yield return new Pessoa { Nome = “Fiódor”, Sobrenome = “Dostoiévski” };
      yield return new Pessoa { Nome = “Liév”, Sobrenome = “Tolstói” };
      yield return new Pessoa { Nome = “Victor”, Sobrenome = “Hugo” };
      yield return new Pessoa { Nome = “Fernando”, Sobrenome = “Pessoa” };
    }

    public IEnumerable<Pessoa> ObterPessoasSemYield(){
      return new List<Pessoa>{
        new Pessoa { Nome = “José”, Sobrenome = “Saramago” },
        new Pessoa { Nome = “Fiódor”, Sobrenome = “Dostoiévski” },
        new Pessoa { Nome = “Liév”, Sobrenome = “Tolstói” },
        new Pessoa { Nome = “Victor”, Sobrenome = “Hugo” },
        new Pessoa { Nome = “Fernando”, Sobrenome = “Pessoa” }
      };
    }
  }

  public class Pessoa{
    public string Nome { get; set; }
    public string Sobrenome { get; set; }
  }
}

Vamos fazer exatamente a mesma coisa, só que com o Node.js e o koa. Um detalhe importante: para rodar este código, você precisa baixar a versão 11.9, considerada uma versão instável, e rodar a sua aplicação com a instrução –harmony (em referência ao ECMAScript 6).

Vou fazer um step-by-step em 10 passos para simplificar.

1)      Baixe a versão 11.9 do Node.js e instale.

2)      Reinicie o computador

3)      Crie um diretório onde você quiser, eu chamei de yield-sample.

4)      Dentro do diretório, crie um arquivo chamado package.json

5)      Adicione o seguinte conteúdo:

{
  “name”: “yield-sample”,
  “version”: “0.0.1”,
  “dependencies”:{
    “koa”:”*”
  }
}

6)      Vá no Command Prompt, no diretório onde está este arquivo, e digite:
npm install

7)      Crie um arquivo chamado app.js e adicione o seguinte conteúdo:

var koa = require(‘koa’);
var app = koa();

app.use(
  function *teste(){
    var pessoasComYield = yield pessoas.map(obterPessoasComYield);
    pessoasComYield.forEach(function(pessoa){
        console.log(‘Com Yield -> Autor: ‘ + pessoa.nome + ‘ ‘ + pessoa.sobrenome);
    });

    var pessoasSemYield = pessoas;
        pessoasSemYield.forEach(function(pessoa){
        console.log(‘Sem Yield -> Autor: ‘ + pessoa.nome + ‘ ‘ + pessoa.sobrenome);
    });
  }
)

function *obterPessoasComYield(pessoa){
  return yield pessoa;
}

var pessoas = [
  { nome: “José”, sobrenome: “Saramago” },
  { nome: “Fiódor”, sobrenome: “Dostoiévski” },
  { nome: “Liév”, sobrenome: “Tolstói” },
  { nome: “Victor”, sobrenome: “Hugo” },
  { nome: “Fernando”, sobrenome: “Pessoa” }
];

app.listen(8080);

8)      Volte ao Command Prompt no local onde está o arquivo app.js e digite:

node –harmony app.js

9)      Abra o seu browser e digite o endereço http://localhost:8080

10)   Volte ao Command Prompt e você deverá ver todo o log impresso na janela

O comportamentos será semelhante ao C#.

É importante ressaltar que o koa não é somente generator e yield – na verdade, é algo bem maior do que isto! – mas ele faz uso destas features para trazer uma nova revolução, que é resolver a sintaxe do callbacks, registro de middlewares e programação assíncrona.

Este * antes de alguns métodos é uma síntese destas novas funcionalidades. Ele é semelhante as funcionalidades do async do C# 4.5, sendo que o yield que aparece dentro das funções callers, da mesma forma é equivalente ao await.

Este GIF mostra o controle de execução do fluxo de uma maneira bem interessante com estes recursos.

Conforme formos evoluindo, vamos explorando mais estes conceitos. Por enquanto ainda está tudo no princípio, com alguns bugs sendo resolvidos. Ou seja, ainda é muito cedo para utilizar num projeto, mas para labs dá para aprender bastante. Creio que mais alguns meses e isto não será mais uma trava para nós.

Bem-vindos a uma nova revolução!

Etiquetado , , , , , , , ,