<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Refatorando para Fluent Interface</title>
	<atom:link href="http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/feed/" rel="self" type="application/rss+xml" />
	<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/</link>
	<description>Blog sobre desenvolvimento de software e tecnologia</description>
	<lastBuildDate>Sun, 16 Oct 2011 12:18:18 -0400</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Fluent Interface no PHP &#171; garotosopa</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-2450</link>
		<dc:creator>Fluent Interface no PHP &#171; garotosopa</dc:creator>
		<pubDate>Wed, 29 Oct 2008 23:44:19 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-2450</guid>
		<description>[...] Post de Guilherme Chapiewski que clareou minhas idéias sobre Fluent Interface http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/ [...]</description>
		<content:encoded><![CDATA[<p>[...] Post de Guilherme Chapiewski que clareou minhas idéias sobre Fluent Interface <a href="http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/" rel="nofollow">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/</a> [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Algumas Idéias &#187; Blog Archive &#187; Fluent Argument Validation</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-1168</link>
		<dc:creator>Algumas Idéias &#187; Blog Archive &#187; Fluent Argument Validation</dc:creator>
		<pubDate>Sun, 31 Aug 2008 17:21:31 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-1168</guid>
		<description>[...] por falar em fluent interfaces, o Guilherme Chapiewski fez dois ótimos posts a alguns [...]</description>
		<content:encoded><![CDATA[<p>[...] por falar em fluent interfaces, o Guilherme Chapiewski fez dois ótimos posts a alguns [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fluent Interface &#171; Meu manifesto!</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-185</link>
		<dc:creator>Fluent Interface &#171; Meu manifesto!</dc:creator>
		<pubDate>Mon, 16 Jun 2008 03:37:45 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-185</guid>
		<description>[...] }  O Guilherme explicou muito bem no blog dele sobre o assunto nesses posts. Vale a pena dar uma espiadinha.       Posted in Domain-Driven Design. Etiquetas HTML:ddd, [...]</description>
		<content:encoded><![CDATA[<p>[...] }  O Guilherme explicou muito bem no blog dele sobre o assunto nesses posts. Vale a pena dar uma espiadinha.       Posted in Domain-Driven Design. Etiquetas HTML:ddd, [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski - Blog sobre desenvolvimento de software e tecnologia &#187; Um exemplo prático de Fluent Interface</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-184</link>
		<dc:creator>Guilherme Chapiewski - Blog sobre desenvolvimento de software e tecnologia &#187; Um exemplo prático de Fluent Interface</dc:creator>
		<pubDate>Mon, 03 Mar 2008 19:27:38 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-184</guid>
		<description>[...] alguns meses escreví um post sobre Fluent Interfaces, mostrando um trabalho que fizemos aqui na empresa para tornar nossa API interna mais fácil de se [...]</description>
		<content:encoded><![CDATA[<p>[...] alguns meses escreví um post sobre Fluent Interfaces, mostrando um trabalho que fizemos aqui na empresa para tornar nossa API interna mais fácil de se [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Leandro</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-183</link>
		<dc:creator>Leandro</dc:creator>
		<pubDate>Wed, 09 Jan 2008 14:03:04 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-183</guid>
		<description>Parabéns pelo post!
O seu exemplo de fluent interface faz pessoas se interessarem mais pelo assunto.</description>
		<content:encoded><![CDATA[<p>Parabéns pelo post!<br />
O seu exemplo de fluent interface faz pessoas se interessarem mais pelo assunto.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Edson Watanabe</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-182</link>
		<dc:creator>Edson Watanabe</dc:creator>
		<pubDate>Thu, 22 Nov 2007 23:21:07 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-182</guid>
		<description>Outra forma que também não é muito fluente pode ser:

Set programas = WebMediaAPI.listar (new Programas(), new ComTitulo (&quot;Fantastico&quot;));

onde os tais construtores adicionam critérios. Mas é sempre melhor que ter 200 métodos com nomes imensos e cada um deles tendo 40 parâmetros.</description>
		<content:encoded><![CDATA[<p>Outra forma que também não é muito fluente pode ser:</p>
<p>Set programas = WebMediaAPI.listar (new Programas(), new ComTitulo (&#8221;Fantastico&#8221;));</p>
<p>onde os tais construtores adicionam critérios. Mas é sempre melhor que ter 200 métodos com nomes imensos e cada um deles tendo 40 parâmetros.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Edson Watanabe</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-181</link>
		<dc:creator>Edson Watanabe</dc:creator>
		<pubDate>Thu, 22 Nov 2007 23:18:43 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-181</guid>
		<description>Respondendo ao Andrik, você pode implementar isso como sendo uma forma de preparar a consulta (ou seja, cada método adiciona um critério, mas não faz uma consulta em si), em vez de uma consulta simples que é sucessivamente filtrada pelas outras consultas.
Por exemplo, você poderia ter algo que é menos fluente mas é mais fácil de implementar como

Set programas = WebMediaAPI.programas().comTitulo(&quot;Fantastico&quot;).listar();

onde o método &quot;listar&quot; executa a consulta que &quot;programas&quot;, &quot;comTitulo&quot; etc. preparam.</description>
		<content:encoded><![CDATA[<p>Respondendo ao Andrik, você pode implementar isso como sendo uma forma de preparar a consulta (ou seja, cada método adiciona um critério, mas não faz uma consulta em si), em vez de uma consulta simples que é sucessivamente filtrada pelas outras consultas.<br />
Por exemplo, você poderia ter algo que é menos fluente mas é mais fácil de implementar como</p>
<p>Set programas = WebMediaAPI.programas().comTitulo(&#8221;Fantastico&#8221;).listar();</p>
<p>onde o método &#8220;listar&#8221; executa a consulta que &#8220;programas&#8221;, &#8220;comTitulo&#8221; etc. preparam.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-180</link>
		<dc:creator>Guilherme Chapiewski</dc:creator>
		<pubDate>Sat, 10 Nov 2007 02:02:28 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-180</guid>
		<description>Oi Andrik.

Pense nessa DSL/Fluent Interface como uma camada POR CIMA da API antiga. Ou seja, o funcionamento interno é exatamente o mesmo, só o que muda é a forma que a aplicação é chamada. Você pode considerar essa minha Fluent Interface como uma &quot;Façade&quot; para o resto do sistema.

Dê uma olhada nos posts recentes no meu blog que estou postando algumas coisas sobre DSLs. Dá uma olhada no material e se voce continuar com dúvida me manda uma mensagem e eu tento ajudar mais.

Araços,
Guilherme</description>
		<content:encoded><![CDATA[<p>Oi Andrik.</p>
<p>Pense nessa DSL/Fluent Interface como uma camada POR CIMA da API antiga. Ou seja, o funcionamento interno é exatamente o mesmo, só o que muda é a forma que a aplicação é chamada. Você pode considerar essa minha Fluent Interface como uma &#8220;Façade&#8221; para o resto do sistema.</p>
<p>Dê uma olhada nos posts recentes no meu blog que estou postando algumas coisas sobre DSLs. Dá uma olhada no material e se voce continuar com dúvida me manda uma mensagem e eu tento ajudar mais.</p>
<p>Araços,<br />
Guilherme</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Andrik Albuquerque</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-179</link>
		<dc:creator>Andrik Albuquerque</dc:creator>
		<pubDate>Fri, 09 Nov 2007 18:13:04 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-179</guid>
		<description>Olá Guilherme, estava lembrando deste post e me surgiu uma dúvida

No exemplo você apresentou primeiro como era feito antes &quot;getIdsUltimasMidiasPublicadasPorPrograma&quot; e mostrou como ficou depois
&quot;WebMediaAPI.videos().recentes().doPrograma(altasHoras)&quot;. Sei que o post é sobre interfaces fluentes, mas estou com uma dúvida sobre a recuperação dos dados.
Gostaria de saber como foi implementado a recuperação dos dados em ambas as abordagens, por exemplo, imagino que no primeiro método tenha uma consulta que faz vários joins entre as tabelas e devolve o resultado, já no segundo você teria consultas pequenas para cada um dos métodos, foi essa a abordagem adotada?

[]&#039;s

Andrik Albuquerque</description>
		<content:encoded><![CDATA[<p>Olá Guilherme, estava lembrando deste post e me surgiu uma dúvida</p>
<p>No exemplo você apresentou primeiro como era feito antes &#8220;getIdsUltimasMidiasPublicadasPorPrograma&#8221; e mostrou como ficou depois<br />
&#8220;WebMediaAPI.videos().recentes().doPrograma(altasHoras)&#8221;. Sei que o post é sobre interfaces fluentes, mas estou com uma dúvida sobre a recuperação dos dados.<br />
Gostaria de saber como foi implementado a recuperação dos dados em ambas as abordagens, por exemplo, imagino que no primeiro método tenha uma consulta que faz vários joins entre as tabelas e devolve o resultado, já no segundo você teria consultas pequenas para cada um dos métodos, foi essa a abordagem adotada?</p>
<p>[]&#8217;s</p>
<p>Andrik Albuquerque</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski - Blog sobre desenvolvimento de software e tecnologia &#187; [QCon 2007] Martin Fowler e Neal Ford: Domain Specific Languages</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-178</link>
		<dc:creator>Guilherme Chapiewski - Blog sobre desenvolvimento de software e tecnologia &#187; [QCon 2007] Martin Fowler e Neal Ford: Domain Specific Languages</dc:creator>
		<pubDate>Wed, 07 Nov 2007 09:49:43 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-178</guid>
		<description>[...] de serem implementadas mas o impacto é muito positivo. Um exemplo real pode ser visto em um post que fiz há algumas semanas sobre uma Fluent Interface que implementei em um projeto, que trouxe vários benefícios [...]</description>
		<content:encoded><![CDATA[<p>[...] de serem implementadas mas o impacto é muito positivo. Um exemplo real pode ser visto em um post que fiz há algumas semanas sobre uma Fluent Interface que implementei em um projeto, que trouxe vários benefícios [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski - Blog sobre desenvolvimento de software e tecnologia &#187; Tiny Types</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-177</link>
		<dc:creator>Guilherme Chapiewski - Blog sobre desenvolvimento de software e tecnologia &#187; Tiny Types</dc:creator>
		<pubDate>Wed, 03 Oct 2007 20:56:01 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-177</guid>
		<description>[...] esse link há algum tempo e eu havia olhado superficialmente. Até que nessa história de fazer Fluent Interfaces e Domain-Driven Design acabei me lembrando que isso poderia ser [...]</description>
		<content:encoded><![CDATA[<p>[...] esse link há algum tempo e eu havia olhado superficialmente. Até que nessa história de fazer Fluent Interfaces e Domain-Driven Design acabei me lembrando que isso poderia ser [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Marcos Silva Pereira</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-176</link>
		<dc:creator>Marcos Silva Pereira</dc:creator>
		<pubDate>Thu, 27 Sep 2007 16:56:49 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-176</guid>
		<description>Guilherme,

Já conhecia o texto do Fowler. Na verdade eu vivo implementando interfaces fluentes o tempo todo, há até uma classe aqui usada assim:
List numeros = sorteador.de(1).ate(20).sortear(1000).maisRepetidos(6);

Que é parte de um testes para candidatos a vagas aqui. Só que, claro, há casos em que Interfaces Fluentes não são necessárias. Como o seu caso possui uma variação muito grande combinações, parece perfeito.

valeuz...</description>
		<content:encoded><![CDATA[<p>Guilherme,</p>
<p>Já conhecia o texto do Fowler. Na verdade eu vivo implementando interfaces fluentes o tempo todo, há até uma classe aqui usada assim:<br />
List numeros = sorteador.de(1).ate(20).sortear(1000).maisRepetidos(6);</p>
<p>Que é parte de um testes para candidatos a vagas aqui. Só que, claro, há casos em que Interfaces Fluentes não são necessárias. Como o seu caso possui uma variação muito grande combinações, parece perfeito.</p>
<p>valeuz&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-175</link>
		<dc:creator>Guilherme Chapiewski</dc:creator>
		<pubDate>Thu, 27 Sep 2007 13:28:27 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-175</guid>
		<description>Marcos,

Dá uma lida no artigo do Martin Fowler (http://martinfowler.com/bliki/FluentInterface.html) pra ver o exemplo que tem lá.

O que é melhor, isso:

    private void makeNormal(Customer customer) {
        Order o1 = new Order();
        customer.addOrder(o1);
        OrderLine line1 = new OrderLine(6, Product.find(&quot;TAL&quot;));
        o1.addLine(line1);
        OrderLine line2 = new OrderLine(5, Product.find(&quot;HPK&quot;));
        o1.addLine(line2);
        OrderLine line3 = new OrderLine(3, Product.find(&quot;LGV&quot;));
        o1.addLine(line3);
        line2.setSkippable(true);
        o1.setRush(true);
    }

ou isso:

   private void makeFluent(Customer customer) {
        customer.newOrder()
                .with(6, &quot;TAL&quot;)
                .with(5, &quot;HPK&quot;).skippable()
                .with(3, &quot;LGV&quot;)
                .priorityRush();
    }

Como já falei antes, os dois fazem a mesma coisa mas um é muito mais semântico que o outro.

[ ]s, Guilherme</description>
		<content:encoded><![CDATA[<p>Marcos,</p>
<p>Dá uma lida no artigo do Martin Fowler (<a href="http://martinfowler.com/bliki/FluentInterface.html" rel="nofollow" onclick="urchinTracker('/outgoing/martinfowler.com/bliki/FluentInterface.html?referer=');">http://martinfowler.com/bliki/FluentInterface.html</a>) pra ver o exemplo que tem lá.</p>
<p>O que é melhor, isso:</p>
<p>    private void makeNormal(Customer customer) {<br />
        Order o1 = new Order();<br />
        customer.addOrder(o1);<br />
        OrderLine line1 = new OrderLine(6, Product.find(&#8221;TAL&#8221;));<br />
        o1.addLine(line1);<br />
        OrderLine line2 = new OrderLine(5, Product.find(&#8221;HPK&#8221;));<br />
        o1.addLine(line2);<br />
        OrderLine line3 = new OrderLine(3, Product.find(&#8221;LGV&#8221;));<br />
        o1.addLine(line3);<br />
        line2.setSkippable(true);<br />
        o1.setRush(true);<br />
    }</p>
<p>ou isso:</p>
<p>   private void makeFluent(Customer customer) {<br />
        customer.newOrder()<br />
                .with(6, &#8220;TAL&#8221;)<br />
                .with(5, &#8220;HPK&#8221;).skippable()<br />
                .with(3, &#8220;LGV&#8221;)<br />
                .priorityRush();<br />
    }</p>
<p>Como já falei antes, os dois fazem a mesma coisa mas um é muito mais semântico que o outro.</p>
<p>[ ]s, Guilherme</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-174</link>
		<dc:creator>Guilherme Chapiewski</dc:creator>
		<pubDate>Thu, 27 Sep 2007 13:22:53 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-174</guid>
		<description>Marcos,

Dessa forma que você propôs você vai ter o mesmo saco de métodos de antes.

Se você fosse implementar todas as variações da minha Fluent Interface dessa sua forma eu chuto que sua classe teria uns 150 métodos (enquanto eu não tenho nenhuma classe com mais de 5 métodos).

Além disso os nomes ficam super toscos. Você pegou um exemplo fácil mas olha esse aqui:

Set videos = api.videosRelacionadosAoCanalDoVideoOrdenadoPorFavoritos(destaquePrincipalGloboVideos, quantidadeMaxima);

Péssimo!

Mas no fim das contas não existe jeito certo ou errado aqui nesse caso. As duas formas são válidas e fazem exatamente a mesma coisa. O caso é que a fluent interface é muito mais elegante.

[ ]s, Guilherme</description>
		<content:encoded><![CDATA[<p>Marcos,</p>
<p>Dessa forma que você propôs você vai ter o mesmo saco de métodos de antes.</p>
<p>Se você fosse implementar todas as variações da minha Fluent Interface dessa sua forma eu chuto que sua classe teria uns 150 métodos (enquanto eu não tenho nenhuma classe com mais de 5 métodos).</p>
<p>Além disso os nomes ficam super toscos. Você pegou um exemplo fácil mas olha esse aqui:</p>
<p>Set videos = api.videosRelacionadosAoCanalDoVideoOrdenadoPorFavoritos(destaquePrincipalGloboVideos, quantidadeMaxima);</p>
<p>Péssimo!</p>
<p>Mas no fim das contas não existe jeito certo ou errado aqui nesse caso. As duas formas são válidas e fazem exatamente a mesma coisa. O caso é que a fluent interface é muito mais elegante.</p>
<p>[ ]s, Guilherme</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Marcos Silva Pereira</title>
		<link>http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/comment-page-1/#comment-173</link>
		<dc:creator>Marcos Silva Pereira</dc:creator>
		<pubDate>Thu, 27 Sep 2007 02:48:55 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/#comment-173</guid>
		<description>Eu gosto muito de interfaces fluentes, mesmo. Então vai aqui uma pergunta de advogado do diabo: Guilherme, e que tal

Set videos = api.videosRecentesDoPrograma(altasHoras);

???</description>
		<content:encoded><![CDATA[<p>Eu gosto muito de interfaces fluentes, mesmo. Então vai aqui uma pergunta de advogado do diabo: Guilherme, e que tal</p>
<p>Set videos = api.videosRecentesDoPrograma(altasHoras);</p>
<p>???</p>
]]></content:encoded>
	</item>
</channel>
</rss>

