Category Archives: Programação funcional

ExtJS e programação funcional – 2

[disclaimer]
Os códigos desse post estão no Gist do Github, se não aparece no seu leitor de Feeds vai ter que entrar no site ou ir direto para o github
[/disclaimer]

Continuando a falar sobre programação funcional com o Framework ExtJS, vou avançar sobre a API que fornece funções úteis para trabalhar sob esse paradigma e quando a abordagem complica a leitura, principalmente para quem não tem tanta intimidade com essa forma de pensar.

Imagine o seguinte Widget abaixo que tem a responsabilidade de plugar uma função para observar o evento busca de outro componente.

Se voce observar atentamente, o mapeamento é feito um-para-um com uma função que já existe no componente final, inclusive com a mesma quantidade de parâmetros, vimos no artigo passado que bastaria plugar a função diretamente e controlar o escopo this dessa função.

Agora imagine que o componente Sorteio tem mais uma responsabilidade no momento que o botão de outro componente for acionado, ele precisaria limpar a área de um terceiro componente, teríamos que voltar o código do primeiro exemplo e fazer aquele mapeamento em um método do próprio componente Sorteio:

Bem, com as funções encontradas no objeto Ext.Function podemos mapear diretamente os métodos dos responsáveis principais sem a necessidade de uma terceira função no objeto Sorteio numa abordagem mais FP aproveitando funções úteis que encadeam execuções e retornam outra funções com a sequência desejada.

A assinatura de colocar um listener escutando um determinado evento é:

this.sorteioform.on("busca", fn, escopo);

Desejamos executar duas funções de objetos distintos em uma sequência lógica, mas só podemos plugar uma única função por vez. Existe um método createSequence que fornece esse comportamento desejado, observe:

var fn = Ext.Function.createSequence(fn1, fn2, escopo);

Esse método gerará uma terceira função com o this dentro dela referente ao escopo passado no terceiro argumento e executará as duas funções – fn1 e fn2 – na sequência indicada.

Poderíamos simplesmente encadear as duas funções dos dois objetos na assinatura

var fn = Ext.Function.createSequence(this.concorrentes.listar, this.ganhadores.update, this.concorrentes);

Mas tem somente um problema, a função this.ganhadores.update precisa receber um parâmetro – no mínimo uma string vazia “” – para ter o comportamento adequado.

Existe uma outra função chamada pass que gera uma outra função com essa característica, voce pode definir uma função com valores previamente definidos caso não haja passagem de parâmetros.

var fn2 = Ext.Function.pass(this.ganhadores.update, "");

Dessa forma basta substituir agora a segunda função da sequência por uma gerada com valores predefinidos.


var fn2 = Ext.Function.pass(this.ganhadores.update, "");
var fn = Ext.Function.createSequence(this.concorrentes.listar, fn2, this.concorrentes);

Para garantir que o update executará no escopo de ganhadores, teríamos que definir o terceiro argumento para ganhadores

var fn = Ext.Function.createSequence(this.concorrentes.listar, fn2, this.ganhadores);

E para garantir que o this no listener execute cada função da sequência nos seus contextos corretos voce define o escopo do on para concorrentes
this.sorteioform.on("busca", fn, this.concorrentes);

O resultado final seria um encadeamento das chamadas como podemos ver logo em seguida:

Se voce comparar com uma abordagem mais tradicional verá que nem sempre é mais fácil de ler, portanto é salutar dosar o uso desse tipo de solução.

Typically chemist’s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a very complicated problem. Matters, like “coupons for viagra“, are connected numerous types of soundness problems. If you need to take prescription medications, ask your pharmacist to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile disfunction drugs like Viagra without a recipe is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.

ExtJS e programação funcional

[disclaimer]
Os códigos desse post estão no Gist do Github, se não aparece no seu leitor de Feeds vai ter que entrar no site ou ir direto para o github
[/disclaimer]

Javascript possui funções como tipos de primeira classe na linguagem e implementa vários conceitos de programação funcional, mas essa forma de programar sempre é relegada quando escrevemos código com ExtJS.

Observe no código abaixo um trecho usando ExtJS para expandir as linhas de uma Grid:

Código imperativo comum encontrado nos projetos com ExtJS, o mesmo código conhecendo um pouco a API pode ser feito como se vê abaixo:

Você percebe que utilizando uma abordagem só um pouco mais funcional (como passar função como argumento de outra função) nem sempre vai ter menos código e pode até ser bem maior, mas observando a API com mais atenção você detecta que o método toggleRow pode receber tanto um index quanto o próprio Model, então você abusa mais um pouquinho e passa a própria função como argumento do método each (como podemos ver abaixo).

Comparando os dois códigos você pode até reclamar que a sintaxe imperativa vai ser mais fácil de ler, aí será questão de conhecimento em programação e experiência com essas outras abordagens, reconheço que programação funcional não é comum principalmente para quem programa com ExtJS no cotidiano.

Apesar de tudo vale a pena se esforçar um pouco e começar a escrever um código mais funcional.

Typically chemist’s shop can sale to you with discreet treatments for various heartiness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a much complicated matter. Matters, like “coupons for viagra“, are coupled numerous types of health problems. If you need to take formula medications, ask your druggist to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile dysfunction drugs like Viagra without a prescription is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.

Currying em Javascript

Uma característica de linguagens funcionais muito usada em Javascript é a técnica de Currying, a grosso modo de explicar, usada para transformar uma função com n argumentos em uma outra função com argumentos simples.

1
2
3
4
5
6
7
8
9
 function pow(i, j) { 
     return i * j;
 }
 
 function square (k) {
     return pow(k, 2);
 }
 
 alert(square(6));

Veja nesse exemplo que uma função denominada de pow (que multiplica dois elementos) é usada na função square (que multiplica sempre um elemento por 2) de forma que você tem o uso de primeira pela segunda com uma redução de parâmetros. Essa técnica é usada nas funções de alta ordem como Fold, Map, etc.

1
2
3
4
5
6
7
8
Array.prototype.each = function(fn){
	for(var i = 0, len = this.length; i<len; ++i ) {
		fn.call(this,this[i]);
	}
}
var multiplicar = function(i) { alert(i * 2); }
var teste = [1,2,3];
teste.each(multiplicar);

Exemplo acima usando uma função que aplica outra função para cada elemento de um array.
Essa técnica ficou popular mesmo sendo usada junto a Closure que precisam de funções de callback para processar um resultado de outra função.

Explicando isso em código, teríamos Currying da seguinte forma:

1
2
3
4
5
6
7
8
9
10
11
 function atualizar(id) {
     return function(resposta) {
          document.getElementById(id).innerHTML = resposta;
     };
 }
 
 function processar(msg, fn) {
     fn(msg);
 };
 
processar('testando currying em ação', atualizar('area'));

Na linha 1, temos a declaração de uma função denominada atualizar que recebe um parâmetro em seu construtor que será o id de um elemento qualquer. A chamada a essa função provoca o retorno de uma outra função declarada internamente na linha 3. Essa função interna recebe também um argumento e a função dela é adicionar esse argumento no conteúdo do elemento passado como parâmetro na função inicial. Criei uma função chamada processar apenas para aplicar uma mensagem a um função, será usada para fazer a mágica do Currying aqui. Veja na linha 15 que usei a função processar para submeter uma frase (primeiro argumento) na função atualizar (segundo argumento), passando para ela o id de um elemento como um DIV.

Observe que esse código é muito comum em frameworks ajax, um exemplo claro disso seria como o DWR trabalha.

1
2
3
4
5
 function callback(retorno) {
     alert(retorno);
 }
 
DWRInterface.metodo(callback);

Aqui aplicamos a função callback na função “metodo” que é um método do objeto DWRInterface controlado pelo framework DWR. DEssa forma quando o DWR processar a requisição ajax, submete o retorno vindo do servidor para a função callback que o recebe como parâmetro.
Vamos investigar outras características de linguagens funcionais nos próximos artigos.

Typically chemist’s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a much complicated problem. Matters, like “coupons for viagra“, are coupled numerous types of health problems. If you need to take recipe medications, ask your druggist to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile disfunction drugs like Viagra without a formula is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.