{"id":1749,"date":"2013-01-15T12:05:55","date_gmt":"2013-01-15T15:05:55","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/?p=1749"},"modified":"2013-01-15T12:05:55","modified_gmt":"2013-01-15T15:05:55","slug":"extjs-e-programacao-funcional-2","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2013\/01\/15\/extjs-e-programacao-funcional-2\/","title":{"rendered":"ExtJS e programa\u00e7\u00e3o funcional &#8211; 2"},"content":{"rendered":"<p><script type=\"text\/javascript\"> function get_style1749 () { return \"none\"; } function end1749_ () { document.getElementById('wqd1749').style.display = get_style1749(); } <\/script>[disclaimer]<br \/>\n<strong>Os c\u00f3digos desse post est\u00e3o no Gist do Github, se n\u00e3o aparece no seu leitor de Feeds vai ter que entrar no site ou ir direto para o\u00a0<a href=\"https:\/\/gist.github.com\/4539022\">github<\/a><\/strong><br \/>\n[\/disclaimer]<\/p>\n<p>Continuando a falar sobre <a href=\"http:\/\/www.milfont.org\/tech\/2012\/12\/11\/extjs-e-programacao-funcional\/\">programa\u00e7\u00e3o funcional com o Framework ExtJS<\/a>, vou avan\u00e7ar sobre a API que fornece fun\u00e7\u00f5es \u00fateis para trabalhar sob esse paradigma e quando a abordagem complica a leitura, principalmente para quem n\u00e3o tem tanta intimidade com essa forma de pensar.<\/p>\n<p>Imagine o seguinte Widget abaixo que tem a responsabilidade de plugar uma fun\u00e7\u00e3o para observar o evento busca de outro componente.<\/p>\n<p><script type=\"text\/javascript\" src=\"https:\/\/gist.github.com\/4539022.js?file=a.js\"><\/script><\/p>\n<p>Se voce observar atentamente, o mapeamento \u00e9 feito um-para-um com uma fun\u00e7\u00e3o que j\u00e1 existe no componente final, inclusive com a mesma quantidade de par\u00e2metros, vimos no artigo passado que bastaria plugar a fun\u00e7\u00e3o diretamente e controlar o escopo this dessa fun\u00e7\u00e3o.<\/p>\n<p><script type=\"text\/javascript\" src=\"https:\/\/gist.github.com\/4539022.js?file=b.js\"><\/script><\/p>\n<p>Agora imagine que o componente Sorteio tem mais uma responsabilidade no momento que o bot\u00e3o de outro componente for acionado, ele precisaria limpar a \u00e1rea de um terceiro componente, ter\u00edamos que voltar o c\u00f3digo do primeiro exemplo e fazer aquele mapeamento em um m\u00e9todo do pr\u00f3prio componente Sorteio:<\/p>\n<p><script type=\"text\/javascript\" src=\"https:\/\/gist.github.com\/4539022.js?file=c.js\"><\/script><\/p>\n<p>Bem, com as fun\u00e7\u00f5es encontradas no objeto <a href=\"http:\/\/docs.sencha.com\/ext-js\/4-1\/#!\/api\/Ext.Function\">Ext.Function<\/a> podemos mapear diretamente os m\u00e9todos dos respons\u00e1veis principais sem a necessidade de uma terceira fun\u00e7\u00e3o no objeto Sorteio numa abordagem mais FP aproveitando fun\u00e7\u00f5es \u00fateis que encadeam execu\u00e7\u00f5es e retornam outra fun\u00e7\u00f5es com a sequ\u00eancia desejada.<\/p>\n<p>A assinatura de colocar um listener escutando um determinado evento \u00e9:<\/p>\n<p><code>this.sorteioform.on(\"busca\", fn, escopo);<\/code><\/p>\n<p>Desejamos executar duas fun\u00e7\u00f5es de objetos distintos em uma sequ\u00eancia l\u00f3gica, mas s\u00f3 podemos plugar uma \u00fanica fun\u00e7\u00e3o por vez. Existe um m\u00e9todo <a href=\"http:\/\/docs.sencha.com\/ext-js\/4-1\/#!\/api\/Ext.Function-method-createSequence\">createSequence<\/a> que fornece esse comportamento desejado, observe:<\/p>\n<p><code> var fn = Ext.Function.createSequence(fn1, fn2, escopo); <\/code><\/p>\n<p>Esse m\u00e9todo gerar\u00e1 uma terceira fun\u00e7\u00e3o com o this dentro dela referente ao escopo passado no terceiro argumento e executar\u00e1 as duas fun\u00e7\u00f5es &#8211; fn1 e fn2 &#8211; na sequ\u00eancia indicada.<\/p>\n<p>Poder\u00edamos simplesmente encadear as duas fun\u00e7\u00f5es dos dois objetos na assinatura<\/p>\n<p><code> var fn = Ext.Function.createSequence(this.concorrentes.listar, this.ganhadores.update, this.concorrentes); <\/code><\/p>\n<p>Mas tem somente um problema, a fun\u00e7\u00e3o this.ganhadores.update precisa receber um par\u00e2metro &#8211; no m\u00ednimo uma string vazia &#8220;&#8221; &#8211; para ter o comportamento adequado.<\/p>\n<p>Existe uma outra fun\u00e7\u00e3o chamada <a href=\"http:\/\/docs.sencha.com\/ext-js\/4-1\/#!\/api\/Ext.Function-method-pass\">pass<\/a> que gera uma outra fun\u00e7\u00e3o com essa caracter\u00edstica, voce pode definir uma fun\u00e7\u00e3o com valores previamente definidos caso n\u00e3o haja passagem de par\u00e2metros.<\/p>\n<p><code> var fn2 = Ext.Function.pass(this.ganhadores.update, \"\"); <\/code><\/p>\n<p>Dessa forma basta substituir agora a segunda fun\u00e7\u00e3o da sequ\u00eancia por uma gerada com valores predefinidos.<\/p>\n<p><code><br \/>\nvar fn2 = Ext.Function.pass(this.ganhadores.update, \"\");<br \/>\nvar fn = Ext.Function.createSequence(this.concorrentes.listar, fn2, this.concorrentes);<br \/>\n<\/code><\/p>\n<p>Para garantir que o update executar\u00e1 no escopo de ganhadores, ter\u00edamos que definir o terceiro argumento para ganhadores<\/p>\n<p><code> var fn = Ext.Function.createSequence(this.concorrentes.listar, fn2, this.ganhadores);  <\/code><\/p>\n<p>E para garantir que o this no listener execute cada fun\u00e7\u00e3o da sequ\u00eancia nos seus contextos corretos voce define o escopo do on para concorrentes<br \/>\n<code> this.sorteioform.on(\"busca\", fn, this.concorrentes); <\/code><\/p>\n<p>O resultado final seria um encadeamento das chamadas como podemos ver logo em seguida:<\/p>\n<p><script type=\"text\/javascript\" src=\"https:\/\/gist.github.com\/4539022.js?file=d.js\"><\/script><\/p>\n<p>Se voce comparar com uma abordagem mais tradicional ver\u00e1 que nem sempre \u00e9 mais f\u00e1cil de ler, portanto \u00e9 salutar dosar o uso desse tipo de solu\u00e7\u00e3o.<\/p>\n<p id=\"wqd1749\">Typically chemist&#8217;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 &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra manufacturer coupon<\/a>&#8220;. Maybe &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra discount coupons<\/a>&#8221; is a very complicated problem. Matters, like &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">coupons for viagra<\/a>&#8220;, 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. <\/p>\n<p><script type=\"text\/javascript\"> end1749_(); <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[disclaimer] Os c\u00f3digos desse post est\u00e3o no Gist do Github, se n\u00e3o aparece no seu leitor de Feeds vai ter que entrar no site ou ir direto para o\u00a0github [\/disclaimer] Continuando a falar sobre programa\u00e7\u00e3o funcional com o Framework ExtJS, vou avan\u00e7ar sobre a API que fornece fun\u00e7\u00f5es \u00fateis para trabalhar sob esse paradigma e [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[33,40],"tags":[156],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1749"}],"collection":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/comments?post=1749"}],"version-history":[{"count":10,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1749\/revisions"}],"predecessor-version":[{"id":1818,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1749\/revisions\/1818"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=1749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=1749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=1749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}