<?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>Gustavo Dutra &#187; reuso</title>
	<atom:link href="http://gustavodutra.com/tag/reuso/feed/" rel="self" type="application/rss+xml" />
	<link>http://gustavodutra.com</link>
	<description>Um pouco de tudo, nada de pouco</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:57:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dicas de como aumentar a produtividade usando autocmd no vim</title>
		<link>http://gustavodutra.com/post/153/dicas-de-como-aumentar-a-produtividade-usando-autocmd-no-vim/</link>
		<comments>http://gustavodutra.com/post/153/dicas-de-como-aumentar-a-produtividade-usando-autocmd-no-vim/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 02:06:11 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[abreviaturas]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[autocmd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[gvimrc]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[porque]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reuso]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimrc]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=153</guid>
		<description><![CDATA[Quantas vezes você faz um arquivo que é exatamente igual à um outro arquivo por dia? Quantas vezes você abre um arquivo só para copiar um trecho de código que é utilizado em vários arquivos? Quantas vezes você se vê fazendo a mesma coisa que fez em outro lugar?
E aquela palavra que você sempre escreve [...]]]></description>
			<content:encoded><![CDATA[<p>Quantas vezes você faz um arquivo que é exatamente igual à um outro arquivo por dia? Quantas vezes você abre um arquivo só para copiar um trecho de código que é utilizado em vários arquivos? Quantas vezes você se vê fazendo a mesma coisa que fez em outro lugar?</p>
<p>E aquela palavra que você sempre escreve errada? Aquela função que você sempre esquece o nome?</p>
<p>Conheça algumas dicas para aumentar a produtividade e diminuir o trabalho dessas coisas rotineiras.</p>
<p><span id="more-153"></span></p>
<h2>Lista de Abreviaturas</h2>
<p>Sabe aquelas palavras que a gente insiste em escrever errado? Principalmente quem trabalha com e-mails, códigos e comentários em outras línguas tem dificuldades com certas palavras. Por exemplo,</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">vc -&gt; você
q -&gt; que
pq -&gt; porque
nao -&gt; não</pre></div></div>

<p>Agora a pergunta que não quer calar: Porque não usarmos algo para evitar esse tipo de coisa? Às vezes nem notamos os erros, mas eles estão lá. Mantenha uma lista de abreviaturas no Vim. Cuide dela, adicione novas abreviaturas assim que vierem à sua cabeça. A sintaxe é simples, basta adicionar no seu .vimrc:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">&quot;&quot; abbr ERRADO CORRETO, por exemplo:
abbr pq porque
abbr vc você</pre></div></div>

<p>O Vim ainda possibilita que você crie sintaxes diferentes para arquivos diferentes. Então, seus arquivos <strong>.txt</strong> podem ter abreviaturas diferentes das de <strong>.py</strong>. Ou seja, se o nome daquela função python é muito <strong>longa</strong> ou você insiste em escrevê-la errada, ela merece uma abreviatura, no formato descrito acima (abbr ERRADO CORRETO).</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">$ mkdir -p ~/.vim/abreviaturas/
$ vim ~/.vim/abreviaturas/txt.vim</pre></div></div>

<p>Adicione ao txt.vim as abreviaturas utilizadas para arquivos texto. Mesmo que poucas, coloque algumas. Um pouco de disciplina fará com que sua produtividade aumente. Tenha certeza.</p>
<p>Ao seu .vimrc, basta acrescentar:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #668080;">autocmd</span> BufNewFile,BufRead <span style="color: #000000;">*</span> source <span style="color: #000000;">$</span>HOME<span style="color: #000000;">/.</span>vim<span style="color: #000000;">/</span>abreviaturas<span style="color: #000000;">/</span>para_qualquer_linguagem<span style="color: #000000;">.</span>vim
<span style="color: #668080;">autocmd</span> BufNewFile,BufRead <span style="color: #000000;">*.</span>txt source <span style="color: #000000;">$</span>HOME<span style="color: #000000;">/.</span>vim<span style="color: #000000;">/</span>abreviaturas<span style="color: #000000;">/</span>txt<span style="color: #000000;">.</span>vim
<span style="color: #668080;">autocmd</span> BufNewFile,BufRead <span style="color: #000000;">*.</span>py source <span style="color: #000000;">$</span>HOME<span style="color: #000000;">/.</span>vim<span style="color: #000000;">/</span>abreviaturas<span style="color: #000000;">/</span>python<span style="color: #000000;">.</span>vim</pre></div></div>

<p>O <em>autocmd</em> funciona mais ou menos igual a uma <em>trigger</em>. É um sistema de eventos, basicamente. Ou seja, ao abrir um arquivo novo (BufNewFile) ou um arquivo já existente (BufRead), se o nome do arquivo casar com a expressão (no caso, *, *.txt ou *.py) irá executar o código a seguir.</p>
<p>Vou falar mais sobre o autocmd em outro post, tem muitoooo pano pra manga, hehehe.</p>
<h2>Templates de Arquivos</h2>
<p>Quando se fala em programação é meio que como na arte. Não só porque programar é uma arte, mas porque nada se cria, tudo se copia. Tudo bem que, hoje em dia, com técnicas de encapsulamento, oop, etc, fica mais difícil. Mas sempre há coisas em comum entre os arquivos. Vamos começar com algo simples.</p>
<p>Template básico para javascript, onde será utilizado jquery.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">// code here</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Simples, mas não é um saco ter que escrever isso sempre que abre um arquivo novo? Tome isso como regra: Faça uma, porém apenas uma vez. Não seria mais fácil abrir o arquivo e tcha-ram! Lá está o código que, em 90% dos casos, você irá utilizar?</p>
<p>Esse foi pequeninho, mas imagine um arquivo html. A trabalheira que é copiar todo o caçalho. E se você segue um padrão, pode usar inclusive o css junto. Observe:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;pt&quot; lang=&quot;pt-br&quot; dir=&quot;ltr&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
		&lt;meta http-equiv=&quot;Content-Style-Type&quot; content=&quot;text/css&quot; /&gt;
		&lt;meta name=&quot;keywords&quot; content=&quot;aqui,vai,as,keywords&quot; /&gt;
		&lt;link rel=&quot;stylesheet&quot; href=&quot;/style.css&quot; /&gt;
		&lt;link rel=&quot;shortcut icon&quot; href=&quot;/favicon.ico&quot; /&gt;
        &lt;/head&gt;
        &lt;body&gt;
        &lt;div id=&quot;wrapper&quot;&gt;
                &lt;div id=&quot;head&quot;&gt;&lt;/div&gt;
                &lt;div id=&quot;content&quot;&gt;&lt;/div&gt;
                &lt;div id=&quot;footer&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;
&lt;/body&gt;&lt;/html&gt;</pre></td></tr></table></div>

<p>E o css:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="css" style="font-family:monospace;">html <span style="color: #00AA00;">*</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #00AA00;">&#125;</span>
body <span style="color: #00AA00;">&#123;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#wrapper</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#wrapper</span> <span style="color: #cc00cc;">#head</span> <span style="color: #00AA00;">&#123;</span>
        <span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#wrapper</span> <span style="color: #cc00cc;">#content</span> <span style="color: #00AA00;">&#123;</span>
        <span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#wrapper</span> <span style="color: #cc00cc;">#footer</span> <span style="color: #00AA00;">&#123;</span>
        <span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Imagine um designers, aqueles que fazem o psd e depois passam pra xhtml, tendo que copiar isso vezes e vezes para todos os arquivos que ele faz. Faça apenas uma vez e siga o padrão!</p>
<p>Usuários de django, ao criar um model, precisam escrever sempre os imports ? Se são utilizados sempre, porque não criar um template?</p>
<p>Agora você me pergunta, como carregar o template automagicamente no Vim ? Fácil! Utilizando nosso autocmd =). Do mesmo modo que fizemos com as abreviaturas, vamos criar os diretórios:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">$ mkdir -p ~/.vim/templates/</pre></div></div>

<p>Criei lá os arquivos com os templates que você acha útil.</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #668080;">autocmd</span> BufNewFile <span style="color: #000000;">*.</span>html 0r <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>templates<span style="color: #000000;">/</span>html<span style="color: #000000;">.</span>tpl
<span style="color: #668080;">autocmd</span> BufNewFile style<span style="color: #000000;">.</span>css 0r <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>templates<span style="color: #000000;">/</span>cssstyle<span style="color: #000000;">.</span>tpl
<span style="color: #668080;">autocmd</span> BufNewFile jquery<span style="color: #000000;">.*.</span>js 0r <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>templates<span style="color: #000000;">/</span>jqueryjs<span style="color: #000000;">.</span>tpl</pre></div></div>

<p>Agora, abra seu Vim e sinta a magia:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">vim index.html style.css jquery.initscript.js</pre></div></div>

<h2>Executando comandos externos</h2>
<h3>g(un)zip</h3>
<p>O manual do Vim tem um exemplo bem interessante, para abrir arquivos <strong>gzipados</strong>, editá-los, como se nada tivesse acontecido e salvá-lo no formato <strong>gzip</strong> de novo. Apesar de que aqui, não precisou acrescentar os códigos abaixo, ele já fez automático. Basta adicionar o .vimrc</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;">augroup gzip
  <span style="color: #668080;">autocmd</span><span style="color: #000000;">!</span>
  <span style="color: #668080;">autocmd</span> BufReadPre,FileReadPre	<span style="color: #000000;">*.</span>gz set bin
  <span style="color: #668080;">autocmd</span> BufReadPost,FileReadPost	<span style="color: #000000;">*.</span>gz <span style="color: #C5A22D;">'[,'</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">!</span>gunzip
  <span style="color: #668080;">autocmd</span> BufReadPost,FileReadPost	<span style="color: #000000;">*.</span>gz set nobin
  <span style="color: #668080;">autocmd</span> BufReadPost,FileReadPost	<span style="color: #000000;">*.</span>gz <span style="color: #804040;">execute</span> <span style="color: #C5A22D;">&quot;:doautocmd BufReadPost &quot;</span> <span style="color: #000000;">.</span> <span style="color: #25BB4D;">expand</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;%:r&quot;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #668080;">autocmd</span> BufWritePost,FileWritePost	<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>mv <span style="color: #000000;">&lt;</span>afile<span style="color: #000000;">&gt;</span> <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
  <span style="color: #668080;">autocmd</span> BufWritePost,FileWritePost	<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>gzip <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
&nbsp;
  <span style="color: #668080;">autocmd</span> FileAppendPre		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>gunzip <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;</span>
  <span style="color: #668080;">autocmd</span> FileAppendPre		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>mv <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;</span>
  <span style="color: #668080;">autocmd</span> FileAppendPost		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>mv <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;</span> <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
  <span style="color: #668080;">autocmd</span> FileAppendPost		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>gzip <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
augroup END
<span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;</span></pre></div></div>

<h3>Verificação por erro</h3>
<p>Já deve ter acontecido com você: você salva o arquivo e quando vai testar, faltou um ponto e vírgula, ou escrever o nome de uma função errada, ou algo similar&#8230; um erro bobo, mas que não deixou seu código ser executado e exige reparo.</p>
<p>Para ajudar contra esse trabalho desnecessário (teste + correção + teste), que pode se repetir inúmeras vezes, você pode usar o autocmd para alertá-lo, utilizando ferramentas externas. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #668080;">autocmd</span> BufWritePost <span style="color: #000000;">*.</span>pl <span style="color: #000000;">!</span>perl <span style="color: #000000;">-</span>c <span style="color: #000000;">%</span>
<span style="color: #668080;">autocmd</span> BufWritePost <span style="color: #000000;">*.</span>php <span style="color: #000000;">!</span>php <span style="color: #000000;">-</span>l <span style="color: #000000;">%</span>
<span style="color: #668080;">autocmd</span> BufWritePost <span style="color: #000000;">*.</span>java <span style="color: #000000;">!</span>javac <span style="color: #000000;">-</span>Xlint <span style="color: #000000;">%</span></pre></div></div>

<h2>Use a criativdade</h2>
<p>Utilize sua criatividade e seja mais produtivo na SUA rotina. Deixe as coisas serem automatizadas. Para mais eventos do autocmd, :help autocmd. Tem uma lista bem extensa. Leia a documentação e seja feliz =). Crítias, sugestões e CASES são bem vindos nos comentários =)</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/153/dicas-de-como-aumentar-a-produtividade-usando-autocmd-no-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como usar Adapter Pattern com python</title>
		<link>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/</link>
		<comments>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 00:45:44 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[oque]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reuso]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=40</guid>
		<description><![CDATA[Olá! Dando continuidade ao post anterior, sobre Decorator Pattern. Mostrarei neste post aqui um exemplo de como e porquê usar o Adapter Pattern. Qualquer dúvida, comente!

O que é Adapter Pattern?
Bom, imaginemos aqueles cartões de memória de máquina fotográfica. Existem de várias tamanhos, micro, pequenos, grandes, gigantes. Seria realmente uma merda se uma máquina fotográfica suportasse [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Dando continuidade ao post anterior, sobre Decorator Pattern. Mostrarei neste post aqui um exemplo de como e porquê usar o Adapter Pattern. Qualquer dúvida, comente!<br />
<span id="more-40"></span></p>
<h2>O que é Adapter Pattern?</h2>
<p>Bom, imaginemos aqueles cartões de memória de máquina fotográfica. Existem de várias tamanhos, micro, pequenos, grandes, gigantes. Seria realmente uma merda se uma máquina fotográfica suportasse somente 1 tamanho, por isso foi inventada aqueles&#8230; adivinhem&#8230; adaptadores que permitem que micros e pequenos caibam em grande, por exemplo. Todos tem a mesma finalidade, porém, têm tamanhos diferentes.Para isso serve o Adapter Pattern, para resolver justamente esse tipo de problema.</p>
<p>Quando se fala em abstração, geralmente se fala em Adapter Pattern, justamente por isso, porque ele te permite, com um mesmo objeto, fazer ações diferentes com uma finalidade em comum.</p>
<p>Para entendermos melhor, pensemos no caso de abstração de banco de dados. A sintaxe de cada um é <strong>diferente</strong>, porém têm as <strong>mesmas claúsulas</strong>. Alguns permitem transações, outros não. Pois esta é uma situação perfeita para o Adapter Pattern. Mas seria muito complexo explicar utilizando ela como exemplo, logo, fiz um exemplo em python que vai ajudar.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ShapeAbstract<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> countCorner<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">corners</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">name</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: abstract
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SquareShape<span style="color: black;">&#40;</span>ShapeAbstract<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">corners</span> = <span style="color: #ff4500;">4</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Square'</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>x <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">l</span> = x
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">l</span><span style="color: #66cc66;">*</span><span style="color: #008000;">self</span>.<span style="color: black;">l</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TriangleShape<span style="color: black;">&#40;</span>ShapeAbstract<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">corners</span> = <span style="color: #ff4500;">3</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Triangle'</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">x</span> = x
		<span style="color: #008000;">self</span>.<span style="color: black;">y</span> = y
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">x</span><span style="color: #66cc66;">*</span><span style="color: #008000;">self</span>.<span style="color: black;">y</span><span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Bom, Tudo começa na nossa classe abstrata ShapeAbstract. Ela é a classe que vai servir de base para todos as formas que vamos calcular a área. Temos a classe <em>SquareShape</em> que representa um quadrado (jura? :/). O construtor da classe, __init__, recebe 2 valores: altura e a largura. Visto que é um quadrado, todos os lados são iguais, não é necessário passar a altura, ficamos somente com a largura. O que difere do triângulo, cujas medidas são base e altura. A nomenclatura não importa, no caso, vamos utilizar no máximo 2 medidas.</p>
<p>Nosso adapter é simplório, caso houvesse a necessidade de calcular a área de um trapésio, seria necessário mais um parâmetro, afinal, a fórmula é: ((base maior + base menor) / 2 * altura). Isso é facilmente implantado utilizando apenas mais um parâmetro no __init__, porque o que realmente queremos é fazer com que o método area() nos retorne a área.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> Shapes
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Shape<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> setAdapter<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, Adapter<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span> = Adapter
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> countCorner<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> newShape<span style="color: black;">&#40;</span>ShapeAdapter<span style="color: black;">&#41;</span>:
		shape = Shape<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		shape.<span style="color: black;">setAdapter</span><span style="color: black;">&#40;</span>ShapeAdapter<span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> shape
&nbsp;
	newShape = <span style="color: #008000;">staticmethod</span><span style="color: black;">&#40;</span>newShape<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
	shape = Shape.<span style="color: black;">newShape</span><span style="color: black;">&#40;</span>Shapes.<span style="color: black;">SquareShape</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#Imprime:</span>
        <span style="color: #808080; font-style: italic;">#Square</span>
        <span style="color: #808080; font-style: italic;">#4</span>
        <span style="color: #808080; font-style: italic;">#25</span>
&nbsp;
	shape = Shape.<span style="color: black;">newShape</span><span style="color: black;">&#40;</span>Shapes.<span style="color: black;">TriangleShape</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span>,<span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#Imprime:</span>
        <span style="color: #808080; font-style: italic;">#Triangle</span>
        <span style="color: #808080; font-style: italic;">#3</span>
        <span style="color: #808080; font-style: italic;">#15</span></pre></div></div>

<p>Nesta &#8220;aplicação principal&#8221; vemos a real <strong>classe adaptativa</strong>: Shape. Ela recebe a instância da classe e executa os métodos dela. Parece bobo ter uma classe que executa o método de outra classe, mas é fundamental para o <strong>reuso</strong> e a famosa <strong>abstração</strong>.</p>
<p>Vejam que elas se comportam diferentes. Claro, são formas diferentes! Áreas diferentes! Número de cantos diferentes! E nomes direfentes!</p>
<p>Agora fica fácil ver esse exemplo abstraindo, por exemplo, um banco de dados? Pense que a classe Shape seja Database, TriangleShape seja MySQLDatabase e SquareShape seja MSSQLDatabase, o método area() seja o método setLimit().</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">shape = Database<span style="color: black;">&#40;</span>MySQLDatabase<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">setLimit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#Imprimi: LIMIT 5</span>
shape = Database<span style="color: black;">&#40;</span>MSSQLDatabase<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">setLimit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#Imprimi: TOP 5</span></pre></div></div>

<h2>Usando Adapter para 3rd part</h2>
<p>Uma das minhas sugestões de uso do Adapter Pattern é com integração de código de terceiros. Vamos supor que você tenha 3 bibliotecas que geram gráficos: X, Y e Z. A bilioteca X é muito boa, mas não tem gráficos em pizza, que na Y tem. Mas a Z, por sua vez, tem gráficos em pizza em 3d. Vamos analizar a situação:</p>
<ul>
<li>A responsabilidade é a mesma: gerar um gráfico.</li>
<li>Independente do tipo de gráfico (com barras, pizza, etc), todas elas vão receber os mesmos tipos de dados.</li>
<li>Cada biblioteca tem seus próprios métodos, com nomes diferentes, mas para as mesma finalidade</li>
</ul>
<p>Não parece um lugar perfeito para se utilizar o Adapter Pattern? Ora, vamos fazer um pequeno esboço:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">graph = GraphAdapter<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">setData</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">20</span>,<span style="color: #ff4500;">30</span>,<span style="color: #ff4500;">10</span><span style="color: black;">&#93;</span>,<span style="color: black;">&#91;</span><span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">25</span>,<span style="color: #ff4500;">35</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">BARRA</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">PIZZA</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">PIZZA3D</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Observem que não utilizei a instância de uma classe como adapter, utilizei constantes que vão determinar, na hora de desenhar o gráfico, o tipo dele. Se for BARRA, faz justamente como a biblioteca X exige, usando a API dela. O mesmo para PIZZA (Y) e PIZZA3D (Z). Pronto! Você, utilizando patterns, terá seu próprio modo de gerar gráficos, mesmo que com bibliotecas diferentes! Comentem e até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O que é? Como e Por quê usar? &#8211; Decorator Pattern</title>
		<link>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/</link>
		<comments>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 01:46:18 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[decorator]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[flexibilidade]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[oque]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[porque]]></category>
		<category><![CDATA[reuso]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=24</guid>
		<description><![CDATA[Rá! Acá estou eu para explicar um pouco mais sobre o Decorator pattern, um deles que eu acho pouco usado, mas pode salvar vidas. Tem poder na mão. Alguns podem já ter noção do que seja, mas outros devem estar se perguntando: &#8216;WTF??&#8217;. Então vamos lá:
Decorator Pattern
É um pattern desenvolvido para modificar um determinado objeto [...]]]></description>
			<content:encoded><![CDATA[<p>Rá! Acá estou eu para explicar um pouco mais sobre o <strong>Decorator pattern</strong>, um deles que eu acho pouco usado, mas pode salvar vidas. Tem poder na mão. Alguns podem já ter noção do que seja, mas outros devem estar se perguntando: &#8216;WTF??&#8217;. Então vamos lá:<span id="more-24"></span></p>
<h2>Decorator Pattern</h2>
<p>É um pattern desenvolvido para modificar um determinado objeto (seja modificar alguma coisa já existente ou delegar uma nova responsabilidade) sem a necessidade de extendê-lo. O que é muito bom, assim, o reaproveitamento de código é maior ainda! Enfim, vou tentar dar uma explicada no pattern:</p>
<div id="attachment_25" class="wp-caption aligncenter" style="width: 573px"><img class="size-full wp-image-25" title="Diagrama de Classes" src="http://blog.gustavodutra.com/wp-content/uploads/2008/12/class-diagram.png" alt="Diagrama de Classes do Decorator Pattern" width="530" height="291" /><p class="wp-caption-text">Diagrama de Classes do Decorator Pattern</p></div>
<p>Abaixo segue o código usado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	protected <span style="color: #000088;">$msg</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getMsg<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">msg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setMsg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$msg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Success_Message <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DivClass_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000088;">$this</span>
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'success-msg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Error_Message <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$newmsg</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DivClass_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000088;">$this</span>
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'error-msg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$newmsg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
abstract <span style="color: #000000; font-weight: bold;">class</span> Msg_Decorator_Abstract <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Li_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;ul&gt;&lt;li&gt;'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$msg</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/li&gt;&lt;/ul&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Div_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;div&gt;'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> DivClass_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$class</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$msg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$class</span><span style="color: #339933;">;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;div class=&quot;'</span><span style="color: #339933;">.</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span>?<span style="color: #0000ff;">'default-class'</span><span style="color: #339933;">:</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>OK! Com o código em mãos, vamos pensar um pouquinho. Tenho uma cacetada de classes, todas fazendo praticamente a mesma coisa. E agora? Calma, Juvenal. Vamos analizar:</p>
<ol>
<li>Temos a classe Mensagem. Sabemos que ele representa uma mensagem. Métodos básicos para manipularmos a mensagem e um <em>__toString()</em> que irá retornar o valor em string pra classe quando for feito o cast.</li>
<li>Classe Msg_Decorator_Abstract que extende da classe Mensagem. Todos os nossos decoradores, por assim dizer, irão ser filhos desta classe. O exemplo é tão simples que a classe abstrata nem tem métodos abstratos. Mas a idéia é que tenha, caso necessário.</li>
<li>Msg_Decorator_Interface, essa interface obriga os programadores que quiserem criar decorators a escrever o método render(). Que é chamado pela nossa classe Abstract no construtor.</li>
<li><em>Li_Decorator, Div_Decorator e DivClass_Decorator</em> são exemplos de decorators.</li>
</ol>
<p>Vamos ver o negócio funcionando? Vamos escrever o seguinte código:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">   	<span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Div_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000000; font-weight: bold;">new</span> Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Mensagem de teste!&quot;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Irá imprimir</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="xhtml" style="font-family:monospace;">&lt;div&gt;
&lt;ul&gt;
	&lt;li&gt;Mensagem de teste!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<p>Viram? Simples e prático! Claro que o exemplo é bem simples e talvez nem seja tão útil. Mas é só pensar um pouquinho mais que logo surgem exemplos onde se usar o Decorator.</p>
<p>Entender agora fica mais fácil. Apenas comece olhando do meio para a esquerda. Primeiro nós instanciamos a classe Message com o mensagem &#8220;Mensagem de teste!&#8221;. O método <em>getMsg()</em> retornará exatamente isso: &#8220;Mensagem de teste!&#8221;. Porém, no momento em que é instanciado o <em>Li_Decorator</em>, ele vai mudar a mensagem usando o método <em>render()</em>, que deve ser implementado na <em>Msg_Decorator_Interface</em> e chamado na <em>Msg_Decorator_Abstract</em> pelo construtor. E assim acontece com o <em>Div_Decorator</em>.</p>
<p>Notem que eu decidi mudar o valor da mensagem usando o <em>setMsg</em>. Eu já li em alguns lugares onde fica armazenada a instância da classe anterior e então o método <em>getMsg</em> seria chamado em forma de cascata, fazendo com que a mensagem original nunca fosse alterada de verdade, e no fim ela é, igual a um método recursivo, retornada decorada e maquiada.</p>
<h2>Reutilizando o código</h2>
<p>Bom, como eu havia dito no começo, o Observer Pattern nos possibilita o <strong>reuso</strong>. O exemplo são aquelas duas classes das quais eu não cheguei a falar: <strong>Error_Message e Success_Message</strong>.</p>
<p>Observem que são simples e, utilizando os Decorators já existentes, mostram uma mensagem personalizada de Erro e de Sucesso! Para utilizá-las, basta usar:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Error_Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro! Você fez algo errado!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Success_Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sucesso! Parabéns!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>O que imprimirá:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="xhtml" style="font-family:monospace;">&lt;div class=&quot;error-msg&quot;&gt;
&lt;ul&gt;
	&lt;li&gt;Error!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;success-msg&quot;&gt;
&lt;ul&gt;
	&lt;li&gt;Sucesso! Parabéns!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<h3>Prós</h3>
<ul>
<li>Adiciona <strong>flexibilidade</strong> ao código.</li>
<li>Facilmente <strong>reutilizada</strong>.</li>
<li>Ótimo para sistemas que possibilitam o uso de <strong>plugins</strong>.</li>
</ul>
<h3>Contras</h3>
<ul>
<li>Gera um grande número de arquivos (se for pensar que cada arquivo é uma classe ou vice-versa).</li>
<li>Dependendo da quantidade de classes aloca muita memória.</li>
<li>Ruim para sistemas mais fechados e bitolados ou muito padronizados.</li>
</ul>
<p>Acho que é isto pessoal. O que acharam? Não é um bixo de sete cabeças, né?</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
