<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ensaios Noturnos &#187; Engenheiro</title>
	<atom:link href="http://www.ruppel.eng.br/category/engenheiro/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ruppel.eng.br</link>
	<description>Engenheiro, psicólogo, jornalista, médico, louco, palmeirense...</description>
	<lastBuildDate>Thu, 29 Jul 2010 03:07:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>Upload automático de imagem do clipboard!</title>
		<link>http://www.ruppel.eng.br/2010/07/28/upload-automatico-de-imagem-do-clipboard/</link>
		<comments>http://www.ruppel.eng.br/2010/07/28/upload-automatico-de-imagem-do-clipboard/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 03:07:23 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[screenshotme]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=127</guid>
		<description><![CDATA[Escrever posts com imagens traz uma dificuldade: o processo de upload não é prático! Você tem que tirar uma screenshot, salvar a Imagem, depois clicar num botãozinho para upload e inserir a imagem no seu post. Talvez, num futuro próximo, será possível copiar e colar diretamente do Word, por exemplo, para o seu editor de [...]]]></description>
			<content:encoded><![CDATA[<p>Escrever posts com imagens traz uma dificuldade: o processo de upload não é prático! Você tem que tirar uma screenshot, salvar a Imagem, depois clicar num botãozinho para upload e inserir a imagem no seu post.</p>
<p>Talvez, <a href="http://www.w3.org/TR/html5/editing.html#paste-from-clipboard">num futuro próximo</a>, será possível copiar e colar diretamente do Word, por exemplo, para o seu editor de texto web e ele fará o trabalho.</p>
<p>É verdade que se você usasse algo como o <a href="http://explore.live.com/windows-live-writer">Writer</a>, você teria a imagem automaticamente carregada no seu servidor. Mas o futuro são os softwares na Web. E eu venho falar de mais um aqui: <a href="http://dailyffs.com/share-screen/">ScreenShotMe</a></p>
<p>É fantástico! Agora você faz um print screen, acessa o endereço: <a href="http://dailyffs.com/shotme/">http://dailyffs.com/shotme/</a> e já pode colar sua imagem que será automaticamente enviada ao servidor deles. Melhor ainda: você pode recortar diretamente na página!</p>
<p>Para este <a href="http://www.ruppel.eng.br/2010/07/28/design-patterns-patterns-criacionais-prototype/">post aqui</a> eu já usei essa técnica. Acho que vai me ajudar muito.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/07/28/upload-automatico-de-imagem-do-clipboard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Patterns &#8211; Patterns Criacionais: Prototype</title>
		<link>http://www.ruppel.eng.br/2010/07/28/design-patterns-patterns-criacionais-prototype/</link>
		<comments>http://www.ruppel.eng.br/2010/07/28/design-patterns-patterns-criacionais-prototype/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 03:05:52 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patterns criacionais]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[resumo dos clássicos da computação]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=126</guid>
		<description><![CDATA[A penúltima pattern criacional do livro Design Patterns têm uma motivação muito semelhante à pattern anterior, Factory. A prototype é usada quando você precisa instanciar um tipo não conhecido em tempo de compilação. Essa motivação também foi vista no uso das factories, com a diferença de que, com o Prototype, não há a criação de [...]]]></description>
			<content:encoded><![CDATA[<p>A penúltima pattern criacional do livro Design Patterns têm uma motivação muito semelhante à pattern anterior, <a href="http://www.ruppel.eng.br/2010/03/23/design-patterns-patterns-criacionais-factory-method/">Factory</a>.  A prototype é usada quando você precisa instanciar um tipo não conhecido em tempo de compilação. Essa motivação também foi vista no uso das factories, com a diferença de que, com o Prototype, não há a criação de uma hierarquia paralela de classes, situação que foi vista com a <a href="http://www.ruppel.eng.br/2010/03/23/design-patterns-patterns-criacionais-factory-method/">Factory</a>.</p>
<p>O funcionamento da Prototype é muito simples: para criação de um novo objeto você utiliza uma instância pré-existente desse objeto (um protótipo) e pede a ele mesmo que crie um clone.</p>
<p>A única dependência que você cria no seu sistema é de que essa interface comum passe a conter um método Clone, como mostra a figura abaixo.</p>
<p><img class="alignnone" title="Prototype" src="http://dailyffs.com/shotme/?T7x3bd" alt="Prototype" width="528" height="256" /></p>
<p>Essa pattern torna o cliente não dependente dos produtos concretos, diferentemente por exemplo da Builder (engraçado que o livro fala que a Builder também é independente, mas acho que erraram&#8230;. do alto da minha modéstia&#8230;rs).</p>
<p>E a grande vantagem dessa pattern é a simplicidade. Porém tendo que pagar o preço de implementar um método Clone, que pode não ser muito simples.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/07/28/design-patterns-patterns-criacionais-prototype/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Configurar Servidor DNS para o Registro.br</title>
		<link>http://www.ruppel.eng.br/2010/07/19/configurar-servidor-dns-para-o-registro-br/</link>
		<comments>http://www.ruppel.eng.br/2010/07/19/configurar-servidor-dns-para-o-registro-br/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 23:30:29 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=116</guid>
		<description><![CDATA[Eu sempre tive curiosidade de configurar um servidor DNS. Em especial o servidor DNS porque, para se colocar um site no ar, acessível à toda Internet, eu sabia que você precisava de: 1. Computador com um ip fixo e com um servidor web (como o Apache) instalado2. Registro no Registro.br E na hora do cadastro [...]]]></description>
			<content:encoded><![CDATA[<p>Eu sempre tive curiosidade de configurar um servidor DNS.</p>
<p>Em especial o servidor DNS porque, para se colocar um site no ar, acessível à toda Internet, eu sabia que você precisava de:</p>
<p>1. Computador com um ip fixo e com um servidor web (como o <a href="http://www.apache.org/">Apache</a>) instalado<br />2. Registro no <a href="http://registro.br">Registro.br</a></p>
<p>E na hora do cadastro no Registro.br ele me pedia um bendito nome de servidor DNS.</p>
<p>Quando você contrata uma hospedagem eles vêm na forma &#8220;ns1.nomedahospedagem.com.br&#8221;. Mas se eu estou justamente cadastrando o meu domínio no Registro.br como será possível eu já ter um nome nesse estilo?</p>
<p>Eis que, hoje, lendo o <a href="http://www.registro.br/faq/index.html">FAQ do Registro.br</a> eu me deparei com o seguinte trecho:</p>
<blockquote><p>Os campos de endereço IP e IPv6 devem ser preenchidos somente nos casos em que o domínio do servidor DNS seja igual ou esteja contido no que está sendo delegado.<br />&#8230;<br />Exemplo: No caso do domínio XYZ.COM.BR delegado para os servidores FOO.XYZ.COM.BR, NS1.BAR.XYZ.COM.BR e NS1.KZX.COM.BR, para os dois primeiros servidores, o preenchimento do campo endereço IP é obrigatório</p>
</blockquote>
<p>Ou seja, se você vai cadastrar o seu domínio: ruppel.eng.br, pode colocar no registro.br o servidor DNS ns1.ruppel.eng.br. Mas aí você coloca tb o ip fixo (que era um pré-requisito que eu já conhecia). O Registro.br só usa o ip nesses casos de o DNS fazer parte do próprio domínio que você vai cadastrar. Super interessante!</p>
<p>Agora indo à parte prática.</p>
<p>Para configurar o DNS no Windows Server 2003++ você primeiro precisa ativar o Serviço:</p>
<p>1. Painel de Controle -&gt; Adicionar ou Remover Programas -&gt; Adicionar ou Remover Componentes do Windows -&gt; Serviços de Rede -&gt; Clique em Detalhes e Selecione &#8220;Domain Name System (DNS)&#8221;. </p>
<p>Com o serviço ativado você pode acessá-lo diretamente através das Ferramentas Administrativas.</p>
<p>Então você precisa criar uma zona (sem trocadilhos). No meu domínio a zona seria &#8220;ruppel.eng.br&#8221;. Botão direito em &#8220;Foward Lookup Zone&#8221; (Zona Direta) e &#8220;New Zone&#8221;.</p>
<p>Dentro dessa sua zone, você já pode adicionar suas entradas (ou registros, como preferir). Botão direito e você terá as opções de Registro A, Registro CNAME, Registro MX, que servem, respectivamente, para linkar o seu nome de domínio para ip, outro nome de domínio e para configurar email.</p>
<p>Um exemplo de Registro A é não preencher nada e colocar o ip da sua hospedagem. Outro exemplo é colocar como subdomínio o &#8220;www&#8221;. Outro tb interessante é colocar como subdomínio o asterisco &#8220;*&#8221;, assim qualquer subdomínio será direcionado para aquele ip.</p>
<p>Aqui tem o material Microsoft sobre a instalação e configuração de servidor DNS: <a href="http://http://support.microsoft.com/kb/814591" title="" target="">http://support.microsoft.com/kb/814591</a></p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/07/19/configurar-servidor-dns-para-o-registro-br/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>disable optimizations ou &#8220;cannot obtain value of local or argument &#8230; possibly because it has been optimized away&#8221;</title>
		<link>http://www.ruppel.eng.br/2010/07/10/disable-optimizations-ou-cannot-obtain-value-of-local-or-argument-possibly-because-it-has-been-optimized-away/</link>
		<comments>http://www.ruppel.eng.br/2010/07/10/disable-optimizations-ou-cannot-obtain-value-of-local-or-argument-possibly-because-it-has-been-optimized-away/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 01:30:07 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[disable optimizations]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=111</guid>
		<description><![CDATA[eu já tive esse problema: Cannot obtain value of local or argument &#8216;variableName&#8217; as it is not available at this instruction pointer, possibly because it has been optimized away mas na época não dei muita atenção, é uma pequena limitação enquanto vc tenta debugar alguns códigos nativos do .Net Framework. aliás, achei bem natural haver [...]]]></description>
			<content:encoded><![CDATA[<p>eu já tive esse problema:</p>
<blockquote><p>Cannot obtain value of local or argument &#8216;variableName&#8217; as it is not available at this instruction pointer, possibly because it has been optimized away</p></blockquote>
<p>mas na época não dei muita atenção, é uma pequena limitação enquanto vc tenta debugar alguns códigos nativos do .Net Framework.</p>
<p>aliás, achei bem natural haver restrições pra isso</p>
<p>eis que não existem restrições! e a solução para o problema acima está descrita <a href="http://blogs.msdn.com/b/sburke/archive/2008/01/29/how-to-disable-optimizations-when-debugging-reference-source.aspx">aqui</a></p>
<p>foi bacana que eu <a href="http://alfredmyers.spaces.live.com/Blog/cns!19D601BD22E34F6E!3842.entry?sa=55955823">achei essa solução por acaso</a>, num <a href="http://alfredmyers.spaces.live.com/blog/">blog simpático e não muito ativo</a> que eu acompanho</p>
<p>na verdade, na época eu nem achei q era um &#8220;problema&#8221;, por isso não fui atrás de solução&#8230; mas agora jah sei =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/07/10/disable-optimizations-ou-cannot-obtain-value-of-local-or-argument-possibly-because-it-has-been-optimized-away/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>futuro da UI</title>
		<link>http://www.ruppel.eng.br/2010/07/06/futuro-da-ui/</link>
		<comments>http://www.ruppel.eng.br/2010/07/06/futuro-da-ui/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 01:41:13 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[futuro]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=103</guid>
		<description><![CDATA[Hoje as pessoas usam Mouses, teclados e monitores como se fossem as coisas mais naturais do mundo mas eu vejo nisso um quê de passado existem algumas alternativas para controlar um computador: reconhecimento de voz, as ultimamente badaladas &#8220;touchscreens&#8221;, mas há coisas ainda mais modernas: talvez encontrar o verdadeiro futuro da UI (esses padrões parecem [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje as pessoas usam Mouses, teclados e monitores como se fossem as coisas mais naturais do mundo</p>
<p>mas eu vejo nisso um quê de passado</p>
<p>existem algumas alternativas para controlar um computador: reconhecimento de voz, as ultimamente badaladas &#8220;touchscreens&#8221;, mas há coisas ainda mais modernas:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="250" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/b6YTQJVzwlI&amp;hl=pt_BR&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="400" height="250" src="http://www.youtube.com/v/b6YTQJVzwlI&amp;hl=pt_BR&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>talvez encontrar o verdadeiro futuro da UI (esses padrões parecem bizarros qdo vc pensa em uma lan house usando qqler um deles: ou seria um monte de gente falando ao mesmo tempo com seus computadores, ou fazendo gestos, e aí as coisas mais tradicionais parecem mais sensatas)</p>
<p>pois bem&#8230; encontrar o futuro da UI parece um bom caminho de inovação</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/07/06/futuro-da-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fancybox vs colorbox</title>
		<link>http://www.ruppel.eng.br/2010/04/21/fancybox-vs-colorbox/</link>
		<comments>http://www.ruppel.eng.br/2010/04/21/fancybox-vs-colorbox/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 22:58:10 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[colorbox]]></category>
		<category><![CDATA[fancybox]]></category>
		<category><![CDATA[jquery. plugin]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=90</guid>
		<description><![CDATA[meu último post fala do uso de fancybox em suas páginas mas eu tive alguns problemas com fancybox, e decidi trocar pelo colorbox. O bug determinante para isso foi que eu tive problemas para abrir o fancybox em IE7 quando usando o IIS do Windows 7.  E ainda depois da segunda ou terceira vez que [...]]]></description>
			<content:encoded><![CDATA[<p>meu último post fala do uso de<a href="http://fancybox.net/"> fancybox </a>em suas páginas</p>
<p>mas eu tive alguns problemas com <a href="http://fancybox.net/">fancybox</a>, e decidi trocar pelo <a href="http://colorpowered.com/colorbox/">colorbox</a>. O bug determinante para isso foi que eu tive problemas para abrir o fancybox em IE7 quando usando o IIS do Windows 7.  E ainda depois da segunda ou terceira vez que se tenta abrir a modal. Sim, problema muito específico, então nada muito grave.</p>
<p>A única vantagem que vi do fancybox em relação ao colorbox é permitir o posicionamento centralizado da modal, mesmo quando fazemos scroll do conteúdo que está atrás. Opção &#8220;centerOnScroll&#8221;.</p>
<p>O colorbox é mais leve, mais simples, e não tem esse bug do fancybox. Além disso, há um problema chato com fancybox:</p>
<p>Quando eu abro arquivos da minha máquina direto no navegador, o fancybox não vai funcionar com ajax. O modo ajax só funciona através de um servidor http.</p>
<p>Novamente, ambos os jquery plugins são excelentes. Mas esses dois detalhes do fancybox me irritaram, então resolvi trocar para o colorbox.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/04/21/fancybox-vs-colorbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>abrir fancybox ajax manualmente</title>
		<link>http://www.ruppel.eng.br/2010/03/29/abrir-fancybox-ajax-manualmente/</link>
		<comments>http://www.ruppel.eng.br/2010/03/29/abrir-fancybox-ajax-manualmente/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 00:18:43 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[fancybox]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=88</guid>
		<description><![CDATA[estava procurando  como abrir uma pop-in do fancybox com conteúdo carregado via AJAX o jeito indicado é usar um selector no link e chamar o método validate não encontrei na internet como fazer essa chamada javascript manualmente, para forçar a pop-in em um momento específico a solução descobri fuçando o código do plugin: basta incluir [...]]]></description>
			<content:encoded><![CDATA[<p>estava procurando  como abrir uma pop-in do fancybox com conteúdo carregado via AJAX</p>
<p>o jeito indicado é usar um selector no link e chamar o método validate</p>
<p>não encontrei na internet como fazer essa chamada javascript manualmente, para forçar a pop-in em um momento específico</p>
<p>a solução descobri fuçando o código do plugin: basta incluir o type ajax nas opções da chamada manual:</p>
<blockquote>
<div id="_mcePaste">$.fancybox(&#8216;endereco_popup.html&#8217;, { &#8216;type&#8217; : &#8216;ajax&#8217; } );</div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/03/29/abrir-fancybox-ajax-manualmente/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Design Patterns &#8211; Patterns Criacionais: Builder</title>
		<link>http://www.ruppel.eng.br/2010/01/27/design-patterns-patterns-criacionais-builder/</link>
		<comments>http://www.ruppel.eng.br/2010/01/27/design-patterns-patterns-criacionais-builder/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 23:08:49 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[builder]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patterns criacionais]]></category>
		<category><![CDATA[resumo dos clássicos da computação]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=71</guid>
		<description><![CDATA[A segunda pattern explicada no livro Design Patterns é o builder. Ela é muito parecida com a pattern AbstractFactory explicada no post anterior, mas ela possui um foco diferente. O intuito desta pattern é separar o processo de criação de um objeto da sua representação. Assim, um objeto complexo, que exigiria algumas etapas para sua [...]]]></description>
			<content:encoded><![CDATA[<p>A segunda pattern explicada no livro Design Patterns é o builder. Ela é muito parecida com a pattern AbstractFactory explicada no post anterior, mas ela possui um foco diferente.</p>
<p>O intuito desta pattern é separar o processo de criação de um objeto da sua representação. Assim, um objeto complexo, que exigiria algumas etapas para sua construção, pode ter um builder genérico que serviria para diferentes representações desse objeto.</p>
<p>O exemplo utilizado no livro é de um leitor de formato RTF. Esse leitor pode criar uma outra representação do formato RTF de várias maneiras: em puro texto, em formatação alternativas como o LeX, ou até em representações gráficas. Cada uma dessas representações é um produto distinto, mas, em todas elas, o processo de conversão a partir do RTF analisaria o texto sequencialmente, e executaria processos especiais para coisas como: mudança de fonte, mudança de parágrafo, inserção de caracteres especiais e etc.</p>
<p>O diagrama de classes abaixo ilustra como é a solução oferecida por esta pattern.</p>
<p><a href="http://www.ruppel.eng.br/wp-content/uploads/2010/01/builder.jpeg"><img class="aligncenter size-full wp-image-72" title="Builder" src="http://www.ruppel.eng.br/wp-content/uploads/2010/01/builder.jpeg" alt="" width="566" height="211" /></a></p>
<p>Na ilustração não está o papel do cliente. O interesse do cliente é obter um Produto. Para isso ele precisará ter conhecimento do Diretor (genérico) e do Builder, mas reparem que o Cliente precisa conhecer o builder <strong>concreto</strong> e não apenas o abstrato. Isso porque o método GetResult não está declarado na interface Builder.</p>
<p>Esta pattern, portanto, torna o seu sistema <strong>dependente</strong> do produto final. O que a pattern vai abstrair é o processo de criação do produto, guiado pela implementação do método Construct pelo Diretor (que vai construindo as partes do produto, sem precisar conhecer sequer qual é a interface do produto).</p>
<p>É decisivo nesta pattern a escolha de um processo de criação do produto com uma granularidade fina o suficiente para a criação das diferentes representações do Produto. Isso pode ser um problema para alguns dos builders concretos mais simples, que necessitem implementar várias partes vazias desse processo. Um jeito interessante de se fazer o Builder para evitar isso é através de métodos BuildPart vazios, para que os builders concretos implementem apenas os processos que lhe são interessantes.</p>
<p>Eu confesso nunca vi esta pattern em ação, mas fazendo uma comparação com a AbstractFactory vejo duas diferentes:</p>
<ol>
<li>O builder está focado na construção do objeto na forma de passos (partes)</li>
<li>O cliente fica dependente da classe concreta do builder (não é um defeito, a pattern foi feita propositadamente desta forma, a intenção era permitir diferentes conjuntos de construção e representação para um produto conhecido)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/01/27/design-patterns-patterns-criacionais-builder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Patterns &#8211; Patterns Criacionais: Abstract Factory</title>
		<link>http://www.ruppel.eng.br/2010/01/16/design-patterns-patterns-criacionais-abstract-factory/</link>
		<comments>http://www.ruppel.eng.br/2010/01/16/design-patterns-patterns-criacionais-abstract-factory/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 02:40:10 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[abstract factory]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patterns criacionais]]></category>
		<category><![CDATA[resumo dos clássicos da computação]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=65</guid>
		<description><![CDATA[Patterns Criacionais A Abstract Factory é a primeira Design Pattern descrita no livro Design Patterns. Ela faz parte da categoria de Patterns Criacionais, cujo objetivo é a instanciação de objetos. Essa categoria é importante pois ela sustenta o princípio mais importante do livro: &#8220;programe para interfaces e não para implementações&#8221;. Todas as patterns tratam a [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: bold;">Patterns Criacionais</span></p>
<p>A Abstract Factory é a primeira Design Pattern descrita no livro Design Patterns. Ela faz parte da categoria de Patterns Criacionais, cujo objetivo é a instanciação de objetos. Essa categoria é importante pois ela sustenta o princípio mais importante do livro: &#8220;programe para interfaces e não para implementações&#8221;.</p>
<p>Todas as patterns tratam a respeito de relações entre os objetos, de forma que eles sejam independentes das implementações. Porém, em algum momento esses objetos deverão ser instanciados, e aí entram em cena as Patterns Criacionais, cujo único objetivo é a instanciação de objetos de forma que seu sistema continue independente de implementações.</p>
<p>Posso dizer que, atualmente, essas patterns criacionais estão em desuso, sendo substituídas pelos frameworks de Injeção de Dependência, que fazem exatamente isso: instanciam para você as classes das quais você é dependente. De toda forma, conhecer as patterns, a sua motivação e entender as suas consequências é um bom exercício de design de software.</p>
<p><span style="font-weight: bold;">Abstract Factory</span></p>
<p>O problema específico que a AbstractFactory tenta resolver é da instanciação na existência de uma família de produtos. O exemplo dado no livro é o seguinte: você tem elementos visuais (produtos), como Window, ScrollBar, Menu e etc. Esses elementos visuais têm diferentes implementações para cada família de implementação gráfica, como o Microsoft Windows, o MAC, e X do Linux.</p>
<p>Nesse caso, a solução consiste de duas coisas:</p>
<p>1. Crie interfaces padrões para os diferentes produtos dessa família (como Window, ScrollBar e Menu). E todo o seu sistema vai trabalhar apenas com essas interfaces que você definiu.</p>
<p>2. Defina uma AbstractFactory, que tem os métodos de instanciação para cada uma dessas interfaces padrões definidas acima, no caso, os métodos para o exemplo seriam: CreateWindow, CreateScrollBar, CreateMenu. Toda hora que o seu sistema precisa de instâncias dos produtos ele as obterá através dessa AbstractFactory. &nbsp;Algo como factory.CreateWindow()</p>
<p>Mas de onde virá essa factory? Em algum lugar, provavelmente na inicialização do seu sistema, você define qual AbstractFactory você vai fornecer ao seu sistema, e repassa essa factory a todos os objetos que precisarem dela.</p>
<p><a href="http://www.ruppel.eng.br/wp-content/uploads/2010/01/abstract_factory1.jpeg"><img class="aligncenter size-full wp-image-67" title="abstract_factory" src="http://www.ruppel.eng.br/wp-content/uploads/2010/01/abstract_factory1.jpeg" alt="" height="280" width="602"></a></p>
<p>Na figura acima, retirada do livro, o Client, que representa o “resto do seu sistema”, utiliza as classes abstratas dos produtos (AbstractProductA e AbstractProductB) e a AbstractFactory, assim como foi explicado.</p>
<p><span style="font-weight: bold;">Prós x Contras</span></p>
<p>É importante agora analisar os benefícios e malefícios dessa pattern. O ponto principal é que a pattern deixa seu sistema independente das diferentes famílias, ou seja, garante o baixo acoplamento que foi falado no começo.</p>
<p>Outro ponto positivo é que a pattern permite adicionar, remover ou modificar rapidamente qual família de produtos deseja-se usar. Isso pode até ser feito em runtime, se usado com um pouco de Reflection.</p>
<p>O ponto negativo desse pattern é que a adição ou remoção de um produto da família exige a modificação da AbstractFactory, o que causa um grande overhead, pois deve-se modificar todas as implementações da factory e o cliente que usa a AbstractFactory.</p>
<p>Na verdade, usando-se Reflection pode-se até criar um único método “Create” que recebe como parâmetro alguma indicação de qual produto ele deve criar (uma string com o nome da classe, por exemplo). Assim, você poderia criar um novo produto sem muitos problemas, basta passar o parâmetro certo para o novo produto. Mas isso funciona como uma balança: se você ganha flexibilidade na criação de novos produtos, você perde com a necessidade de uma interface única para todos esses produtos, já que eles serão retornados pelo mesmo método “Create”. &nbsp;E o seu client precisará fazer um cast para o produto certo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/01/16/design-patterns-patterns-criacionais-abstract-factory/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Design Patterns</title>
		<link>http://www.ruppel.eng.br/2010/01/12/design-patterns/</link>
		<comments>http://www.ruppel.eng.br/2010/01/12/design-patterns/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 01:26:21 +0000</pubDate>
		<dc:creator>Ruppel</dc:creator>
				<category><![CDATA[Engenheiro]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[guangue dos quatro]]></category>
		<category><![CDATA[resumo dos clássicos da computação]]></category>

		<guid isPermaLink="false">http://www.ruppel.eng.br/?p=59</guid>
		<description><![CDATA[Para estrear a série &#8220;Resumo dos clássicos da computação&#8221; começarei pelo consagrado Design Patterns, escrito por Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides. O livro Design Patterns é um dos maiores, se não o maior, dos clássicos em desenvolvimento de software. Seus autores ficaram imortalizados como &#8220;a gangue dos quatro&#8221;. O primeiro capítulo [...]]]></description>
			<content:encoded><![CDATA[<p>Para estrear a série &#8220;<a target="" title="" href="http://ruppel.eng.br/tag/resumo-dos-classicos-da-computacao">Resumo dos clássicos da computação</a>&#8221; começarei pelo consagrado Design Patterns, escrito por Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides.</p>
<p>O livro Design Patterns é um dos maiores, se não o maior, dos clássicos em desenvolvimento de software. Seus autores ficaram imortalizados como &#8220;a gangue dos quatro&#8221;.</p>
<p>O primeiro capítulo do livro serve para explicar o que são Design Patterns. Traduzindo o termo para o português teríamos &#8220;Padrão de Projeto&#8221;, uma tradução bem razoável. As design patterns são padrões desenvolvidos para sistemas orientados a objetos (conhecer OO é requisito mínimo para ler este livro).</p>
<p>As design patterns não foram inventadas pela gangue dos quatro, o trabalho deles foi identificar e catalogar esses padrões de projeto usados em diferentes sistemas em operação pelo mundo. Eles identificaram esses padrões, as situações em que eram usados e ainda vantagens e desvantagens do uso de cada padrão. Esse catálogo que fez do livro um clássico: ele virou referência para análise de qualquer outro sistema.</p>
<p>E afinal, o que é uma design pattern? Design pattern é uma forma de se estruturar os objetos do seu sistema OO para resolver um tipo de problema recorrente. Assim, a mesma design pattern pode ser usada para diversos casos distintos, desde que&nbsp; apresentem algumas características em comum, encaixando-se no &#8220;tipo de problema&#8221; para o qual a pattern foi concebida. As designs patterns são comumente encontradas nos grandes sistemas implementados com sucesso pelo mundo afora.</p>
<p>Para caracterizar uma Design Pattern, ao longo do livro, eles utilizam:</p>
<p>1. Nome &#8211; para podermos nos referenciar de forma fácil a elas</p>
<p>2. Problema (ou &#8220;tipo de problema&#8221; ou &#8220;situação&#8221;) -&nbsp; uma caracterização de quando essa pattern deve ser usada</p>
<p>3. Solução &#8211; é a estruturação dos objetos de forma a resolver o problema acima descrito (quais as interfaces, como elas se relacionam e suas funções na resolução do problema)</p>
<p>4. Consequências &#8211; são as vantagens e desvantages da pattern, ou resultados obtidos com o uso daquela pattern</p>
<p>Dois conceitos fortíssimos ficam ao longo de todo o livro:</p>
<p>- Programe para interfaces e não para implementações, deixando seu sistema com baixo acoplamento</p>
<p>- Abtraia os conceitos que variam no seu sistema em forma de objeto. Por exemplo, se você tem um objeto que possui alguma lista, e em algum&nbsp; momento esse objeto deve ordenar essa lista, mas existem vários parâmetros que alteram a forma com a qual essa lista deve ser ordenada, então, uma boa idéia seria criar objetos para as diferentes formas de se ordenar essa lista.</p>
<p>Os capítulos do livro descrevem, cada um, uma Design Pattern. Nos próximos dias criarei posts para cada uma dessas Design Patterns apresentadas no livro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ruppel.eng.br/2010/01/12/design-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
