<?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; exemplo</title>
	<atom:link href="http://gustavodutra.com/tag/exemplo/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>Como consultar a documentação do PHP direto do Vim</title>
		<link>http://gustavodutra.com/post/365/como-consultar-a-documentacao-do-php-direto-do-vim/</link>
		<comments>http://gustavodutra.com/post/365/como-consultar-a-documentacao-do-php-direto-do-vim/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 20:51:54 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[man]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimrc]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=365</guid>
		<description><![CDATA[Olá! Descobri recentemente que é possível baixar a documentação do PHP no formato do man do UNIX. Isso é muito bom, já que assim, podemos consultar funções com parâmetros, variáveis e exemplos. Melhor, podemos fazer isso direto do Vim.
Eu já tinha lido sobre uma opção do Vim chamada keywordprg, mas nunca havia encontrado uma serventia. [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Descobri recentemente que é possível baixar a documentação do PHP no formato do man do <strong>UNIX</strong>. Isso é muito bom, já que assim, podemos consultar funções com parâmetros, variáveis e exemplos. Melhor, podemos fazer isso direto do Vim.</p>
<p>Eu já tinha lido sobre uma opção do Vim chamada <a rel="nofollow" href="http://vimdoc.sourceforge.net/htmldoc/options.html#%27keywordprg%27">keywordprg</a>, mas nunca havia encontrado uma serventia. Quando eu li no <a rel="nofollow" href="http://bjori.blogspot.com/2010/01/unix-manual-pages-for-php-functions.html">blog do bjori</a>, realmente me veio à mente como eu poderia utilizá-la.</p>
<p><span id="more-365"></span></p>
<p>Eu instalei a última versão do <strong>pear</strong> aqui, e executei os comandos que ele cita no blog:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pear <span style="color: #c20cb9; font-weight: bold;">install</span> doc.php.net<span style="color: #000000; font-weight: bold;">/</span>pman</pre></div></div>

<p>Eu precisei aumentar a memória do <strong>php.ini</strong> (<em>memory_limit</em>), 32M não foi o suficiente.</p>
<p>O manual será instalado no diretório especificado em &#8220;<em>doc_dir</em>&#8221; da configuração da <strong>pear</strong> e o executável no &#8220;<em>bin_dir</em>&#8220;. Para verificar as configurações atuais:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pear config-show <span style="color: #666666; font-style: italic;"># Mostra todas as configurações atuais</span>
pear config-get bin_dir <span style="color: #666666; font-style: italic;"># Mostra configuração atual da opção bin_dir</span>
pear config-get doc_dir <span style="color: #666666; font-style: italic;"># Mostra configuração atual da opção doc_dir</span>
<span style="color: #666666; font-style: italic;"># Para modificar:</span>
pear config-set bin_dir <span style="color: #000000; font-weight: bold;">/</span>outro<span style="color: #000000; font-weight: bold;">/</span>bin
pear config-set doc_dir <span style="color: #000000; font-weight: bold;">/</span>outro<span style="color: #000000; font-weight: bold;">/</span>docs</pre></div></div>

<p>Depois de instalado, você pode utilizar ele tanto no Vim quanto fora do Vim:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pman array_merge</pre></div></div>

<p>Bom, se lembra que eu havia falado sobre o <em>keywordprg</em> ? Assim como o <em>makeprg</em> é o programa executado ao se executa :<em>make</em> no Vim e o <em>grepprg</em> o comando executado ao se executar :<em>[grep|vimgrep]</em>, o <em>keywordprg</em> é executado quando se preciona <strong>K</strong> (k maiúsculo) sobre alguma palavra chave &#8211; que no nosso caso será uma função php.</p>
<p>O artigo citado ali em cima, indica para colocarmos no <strong>.vimrc</strong>, mas eu acho mais interessante por no <strong>.ftplugin/php.vim</strong> (se o arquivo não existir, crie). Assim, só será carregado caso o tipo do arquivo for php, possibilitando utilizar outros programas para outras linguagens</p>

<div class="wp_syntax"><div class="code"><pre class="vimrc" style="font-family:monospace;">&quot; Programa executado quando pressionado K
set keywordprg=pman</pre></div></div>

<p>Agora faça o teste: abra um arquivo php, coloque o cursor sobre alguma função e pressione <em>K</em>. Para fechar o manual aberto, basta precionar <em>q</em>. Pode-se utilizar a busca com <em>/termo</em> e também navegar nos resultados com <em>n/N</em>. <em>j/k/UP/DOWN</em> movem o arquivo para cima e para baixo, normalmente, como se fosse um manpage.</p>
<p>Eai, este post ajudou em algo?</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/365/como-consultar-a-documentacao-do-php-direto-do-vim/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Buscas eficientes no Vim com vimgrep</title>
		<link>http://gustavodutra.com/post/296/buscas-eficientes-no-vim-com-vimgrep/</link>
		<comments>http://gustavodutra.com/post/296/buscas-eficientes-no-vim-com-vimgrep/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 20:23:37 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[busca]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimgrep]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=296</guid>
		<description><![CDATA[A busca efetiva pode ajudar muito, caso bem usada, tanto no ganho de tempo como na efeciência de substituições ou refactories. Seguem alguns outros exemplos de finalidades para a busca utilizando o Vim:

Certeza de encontrar todas as incidências
Ficam visualmente destacadas (com :set hlsearch)
Testar substituições
Verificar a ortografia atrás de erros de digitação
Encontrar variáveis ou funções não [...]]]></description>
			<content:encoded><![CDATA[<p>A busca efetiva pode ajudar muito, caso bem usada, tanto no ganho de tempo como na efeciência de substituições ou refactories. Seguem alguns outros exemplos de finalidades para a busca utilizando o Vim:</p>
<ul>
<li>Certeza de encontrar todas as incidências</li>
<li>Ficam visualmente destacadas (com :set hlsearch)</li>
<li>Testar substituições</li>
<li>Verificar a ortografia atrás de erros de digitação</li>
<li>Encontrar variáveis ou funções não utilizadas, só declaradas</li>
<li>Encontrar rapidamente algum termo</li>
<li>Verificar a existência de algum termo</li>
</ul>
<p>Além da conhecida / (barra) para buscar, existe o :vimgrep. É dele que quero falar.</p>
<p><span id="more-296"></span></p>
<h2>Vimgrep</h2>
<h3>Comando</h3>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>vim<span style="color: #000000;">&#91;</span>grep<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">!</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">/</span><span style="color: #000000;">&#123;</span>pattern<span style="color: #000000;">&#125;</span><span style="color: #000000;">/</span><span style="color: #000000;">&#91;</span>g<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span>files<span style="color: #000000;">&#125;</span></pre></div></div>

<ul>
<li>Busca inscidências de <em>pattern</em> nos <em>files</em> listados.</li>
<li><em>pattern</em> pode ser uma expressão regular ou não</li>
<li>A exclamação (<em>!</em>) ignora as alterações já feita no arquivo atual</li>
<li><em>g</em> procura por todas as inscidências, não só a primeira, em cada arquivo</li>
<li><em>j</em> pula para o primeiro resultado ao executar o comando</li>
<li><em>files</em> podem conter <em>wildcards</em>, como *, ? e **</li>
<li>Os resultados são abertos na <strong>quickfix list</strong></li>
</ul>
<h3>Exemplos</h3>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>vimgrep<span style="color: #000000;">!</span> <span style="color: #000000;">/$</span>var<span style="color: #000000;">/</span> arquivo<span style="color: #000000;">.</span>pl</pre></div></div>

<p>Pesquisa pela primeira inscidência de $var no arquivo.pl</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>vimgrep <span style="color: #000000;">/</span>texto<span style="color: #000000;">/</span> <span style="color: #000000;">*.</span>rb</pre></div></div>

<p>Busca por <em>texto</em> em todos os arquivos com a extensão .rb do diretório atual (para descobrir qual o diretório atual, use :pwd. Para mudar :cd <em>dir</em>)</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>vimgrep <span style="color: #000000;">/</span>TeXtO<span style="color: #000000;">/</span> <span style="color: #000000;">*.</span>py dir<span style="color: #000000;">/*.</span>py</pre></div></div>

<p>Busca com case-sensitive em todos os arquivos .py do diretório atual e dos dentro do diretório dir/.</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>vimgrep <span style="color: #000000;">/</span>minhaFuncao<span style="color: #000000;">/</span>g <span style="color: #000000;">**/*.</span>c</pre></div></div>

<p>Busca recursiva dentro da árvore de diretórios do diretório atual cuja extensão seja .c</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>vimgrep <span style="color: #000000;">/&lt;</span> \<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">^</span> <span style="color: #000000;">&#93;</span>\<span style="color: #000000;">+</span>\<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">^&gt;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">*&gt;.</span>\<span style="color: #000000;">+&lt;</span> \<span style="color: #000000;">/</span>\<span style="color: #000000; font-weight:bold;">1</span><span style="color: #000000;">&gt;/</span> <span style="color: #25BB4D;">index</span><span style="color: #000000;">.</span>html</pre></div></div>

<p>Busca usando expressões regulares também são permitidas!</p>
<h2>Navegando na QuickFix List</h2>
<ul>
<li>:copen</li>
<li>:cfirst</li>
<li>:cprevious</li>
<li>:cnext</li>
<li>:clast</li>
<li>:cclose</li>
</ul>
<p>Como nosso foco é a eficiência, podemos criar mapeamentos para andar pela quickfix list!</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #25BB4D;">map</span> <span style="color: #000000;">&lt;</span>F9<span style="color: #000000;">&gt;</span> <span style="color: #000000;">:</span>copen<span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;</span>
<span style="color: #25BB4D;">map</span> <span style="color: #000000;">&lt;</span>F10<span style="color: #000000;">&gt;</span> <span style="color: #000000;">:</span>cclose<span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;</span>
<span style="color: #25BB4D;">map</span> <span style="color: #000000;">&lt;</span>A<span style="color: #000000;">-</span>j<span style="color: #000000;">&gt;</span> <span style="color: #000000;">:</span>cnext<span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;</span>
<span style="color: #25BB4D;">map</span> <span style="color: #000000;">&lt;</span>A<span style="color: #000000;">-</span>k<span style="color: #000000;">&gt;</span> <span style="color: #000000;">:</span>cprevious<span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;</span></pre></div></div>

<div id="attachment_305" class="wp-caption aligncenter" style="width: 546px"><a href="http://gustavodutra.com/wp-content/uploads/2009/11/vimgrep1.jpg"><img src="http://gustavodutra.com/wp-content/uploads/2009/11/vimgrep1.jpg" alt="Exemplo de uso do vimgrep" title="Exemplo de uso do vimgrep" width="536" height="875" class="size-full wp-image-305" /></a><p class="wp-caption-text">Exemplo de uso do vimgrep</p></div>
<h2>Conclusão</h2>
<p>Esse recurso não parece ser muito abordado por ai, mas é extremamente importante. Seja criativo e descubra onde melhor usar o :vimgrep! Tenho certeza de que vai lhe ajudar! E quando encontrar, comente ai!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/296/buscas-eficientes-no-vim-com-vimgrep/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Facade Pattern com perl orientado a objetos</title>
		<link>http://gustavodutra.com/post/288/facade-pattern-com-perl-orientado-a-objetos/</link>
		<comments>http://gustavodutra.com/post/288/facade-pattern-com-perl-orientado-a-objetos/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 19:07:07 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[facade pattern]]></category>
		<category><![CDATA[felixibilidade]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[orientacao a objeto]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=288</guid>
		<description><![CDATA[Olá! Faz um tempo que não mexo com perl. Encontrei perdido um arquivo com esse exemplo que fiz em 2008, segundo a data de última modificação. Então, decidi dar continuidade aos posts de design patterns. Esse padrão é bem interessante, poderia ser traduzido para Fachada.
Eu gosto dessa tradução, porque traduz bem direitinho o que ele [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Faz um tempo que não mexo com <em>perl</em>. Encontrei perdido um arquivo com esse exemplo que fiz em 2008, segundo a data de última modificação. Então, decidi dar continuidade aos posts de <strong>design patterns</strong>. Esse padrão é bem interessante, poderia ser traduzido para <strong>Fachada</strong>.</p>
<p>Eu gosto dessa tradução, porque traduz bem direitinho o que ele representa, é uma fachada para &#8220;esconder&#8221; chamadas de vários métodos de objetos diferentes atrás de um mesmo método. Pense assim:</p>
<p>Toda vez que eu aperto o botão de uma máquina de café e pedir um mocacchino, acontece a mesma coisa:</p>
<ul>
<li>Moe-se o café</li>
<li>Pega-se um copo</li>
<li>Esquenta-se a água</li>
<li>Passa-se o café</li>
<li>Coloca-se o café passado no copo</li>
<li>Coloca-se o chocolate</li>
<li>Coloca-se o leite</li>
<li>Apita pra dizer que está pronto</li>
</ul>
<p>Se olharmos isso com a visão de um <em>pojetista</em>, vemos que temos várias responsabilidades e que não podemos deixar tudo numa mesma classe, como por exemplo:</p>
<ul>
<li>Responsável por moer o café</li>
<li>Responsável por colocar algo no copo</li>
<li>Responsável por pegar 1 copo novo</li>
<li>Responsabilidade de saber quanto de cada ingrediente por no copo</li>
<li>Responsabilidade de apitar e escrever nos leds</li>
</ul>
<p>Enfim, para que o código seja organizado, precisamos distribuir as responsabilidades de acordo com as necessidades e obrigações de cada classe. Porém, cada vez que o botão for pressionado, seria muito cruel ter que chamar várias classes e executar esses métodos que selecionam o copo, moem o grão, etc.</p>
<p>Para esses casos foi pensando o <strong>Facade Pattern,</strong> ou seja, a <strong>Fachada</strong>. Todo aquele algoritmo descrito na primeira lista acima, é encapsulado dentro de uma classe específica para a máquina de café, dentro do método <em>pressionaBotao</em>, por exemplo. Chamando o método, ele se encarrega de interagir com os objetos de seleção do copo, do cálculo da quantidade de ingredientes, etc.<br />
<span id="more-288"></span><br />
Fiz um exemplo em <em>perl</em>, pensando num cinema. Acredito que fique fácil entender a partir dele. Seguem as classes utilizadas:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl -w</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Classe representando o amplificador</span>
	<span style="color: #000066;">package</span> Amplifier<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga o amplificador</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Amplifier [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga o amplificador</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Amplifier [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># Muda o volume</span>
	<span style="color: #000000; font-weight: bold;">sub</span> setVolume <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$volume</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #000066;">printf</span> <span style="color: #ff0000;">&quot;Turning the Amplifiers volume to %d%%<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$volume</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># coloca no mudo</span>
	<span style="color: #000000; font-weight: bold;">sub</span> mute <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">setVolume</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</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: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Classe representado o aparelho de DVD</span>
	<span style="color: #000066;">package</span> Dvd<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'stop'</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga o dvd</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the DVD Player [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga o dvd</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the DVD Player [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># da play no filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> play <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$movie</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'play'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>stop<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>play<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$movie</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$movie</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'play'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #000066;">printf</span> <span style="color: #ff0000;">&quot;Playing the movie %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$movie</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># da stop no filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> stop <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'play'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'stop'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #000066;">printf</span> <span style="color: #ff0000;">&quot;Stoping the movie %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># ejeta a bandeja pra por no dvd</span>
	<span style="color: #000000; font-weight: bold;">sub</span> eject <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'play'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>stop<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Ejecting the DVD<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># classe representando o projetor</span>
	<span style="color: #000066;">package</span> Projector<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># ajusta o canal de vídeo</span>
	<span style="color: #000000; font-weight: bold;">sub</span> videoChannel <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Setting Video Channel<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga o projetor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Project [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga o projetor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Project [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Classe representando as luzes do cinema</span>
	<span style="color: #000066;">package</span> Lights<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga as lâmpadas</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'off'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Lights [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'on'</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga as lâmpadas</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'on'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Lights [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># classe representando uma máquina de pipoca</span>
	<span style="color: #000066;">package</span> PopcornMachine<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga a máquina</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'off'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'on'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Popcorn Machine [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># estoura as pipocas</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000066;">pop</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'on'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Poping the corns ;P<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga a máquina</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'on'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Popcorn Machine [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A <strong>orientação a objetos</strong> no <em>perl</em> é meio sinistra. Existem diversas formas de se programar orientado a objetos no perl, eu escolhi esta pois parece mais simples e fácil. Bom, essas são as classes utilizadas:</p>
<ul>
<li>Amplifier</li>
<li>DVD</li>
<li>Projector</li>
<li>Lights</li>
<li>PopcornMachine</li>
</ul>
<p>Bom, cada vez que um filme inicia ou termina no cinema, várias operações são repetidas sempre. Alguém já viu cinema com as luzes acesas? Bem, sempre se desliga as luzes. Então observe a classe abaixo que representa o <strong>Facade</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># classe representando o cinema</span>
	<span style="color: #000066;">package</span> CineFacade<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>lights<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># começa a ver o filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> watchMovie <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$movie</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Popcorn machine</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">pop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Home lights</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>lights<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Projector</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">videoChannel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Amplifier</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">setVolume</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># DVD</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">play</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$movie</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># termina de ver o filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> endMovie <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>lights<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">eject</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Observem o método <em>watchMovie</em> e <em>endMovie</em>. Eles chamam operações comum a todas as seções do cinema.<br />
Aqui vai  o exemplo de uso do facade no meio da aplicação:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Exemplo de uso</span>
	<span style="color: #0000ff;">$cine</span> <span style="color: #339933;">=</span> CineFacade<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>
			Amplifier<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			Dvd<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			Projector<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			Lights<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			PopcornMachine<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Movie Session started: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$cine</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">watchMovie</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'Titanic'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Movie Session ended: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$cine</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">endMovie</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O <em>output</em> é mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Movie Session started: 
&nbsp;
Turning the Popcorn Machine [ON]
Poping the corns ;P
Turning the Project [ON]
Setting Video Channel
Turning the Amplifier [ON]
Turning the Amplifiers volume to 100%
Turning the DVD Player [ON]
Playing the movie Titanic
&nbsp;
Movie Session ended: 
&nbsp;
Turning the Popcorn Machine [OFF]
Turning the Lights [ON]
Turning the Project [OFF]
Turning the Amplifier [OFF]
Stoping the movie Titanic
Ejecting the DVD</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/288/facade-pattern-com-perl-orientado-a-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como usar mod_rewrite de verdade</title>
		<link>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/</link>
		<comments>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:38:31 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[clean url]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[flexibilidade]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=120</guid>
		<description><![CDATA[Rá! Hoje quero falar sobre mod_rewrite. Um módulo para o apache que permite reescrever URL&#8217;s. Ele é muito útil em vários sentidos: aumenta a o page rank em buscadores, torna URL&#8217;s limpas e inteligíveis, fazendo com que o usuário consiga lembrá-las muito mais rápida e facilmente.
Porém, como todos os outros artefatos que estão por aí, [...]]]></description>
			<content:encoded><![CDATA[<p>Rá! Hoje quero falar sobre mod_rewrite. Um módulo para o apache que permite reescrever URL&#8217;s. Ele é muito útil em vários sentidos: aumenta a o page rank em buscadores, torna URL&#8217;s limpas e inteligíveis, fazendo com que o usuário consiga lembrá-las muito mais rápida e facilmente.</p>
<p>Porém, como todos os outros artefatos que estão por aí, pode complicar ainda mais a vida de um programador, caso não seja usado adequadamente.</p>
<p><span id="more-120"></span></p>
<h2>Introdução</h2>
<p>Como visto no post anterior, onde está descrito algumas vantagens e desvantages de se usar o mod_rewrite, neste post vamos concluir o assunto. Assumindo que você esteja usando Apache com o mod_rewrite habilitado. Também é necessário o uso de arquivos .htaccess: Arquivos ocultos que contém diretivas interpretadas pelo Apache. Para que seu .htaccess funcione, deve se certificar de que a diretiva <em>AllowOverride All</em> esteja nos arquivos de configuração do apache. Ela deve ficar dentro de &lt;Directory /&gt;, mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">	AllowOverride All</pre></div></div>

<p>Basta adicionar ao seus arquivos de configuração do apache ou requisitar seu servidor que o faça.</p>
<h2>Conhecendo as diretivas</h2>
<p>Antes de mais nada, vamos entender o que o mod_rewrite faz e é capaz de fazer, conhecendo seus parâmetros de configurações.</p>
<h4>RewriteEngine on|off</h4>
<p>Habilita(on) ou desabilita(off) o uso do módulo mod_rewrite.</p>
<h4>RewriteOptions [inherit] [MaxRedirects=X]</h4>
<p>   Adiciona uma ou as duas opções.</p>
<h5>inherit</h5>
<p>            Herda os parâmetros dos diretórios pai.</p>
<h5>MaxRedirects=X</h5>
<p>            Ao invés de permitir o &#8216;loop infinito&#8217; de redirecionamento, limita para X vezes. Caso, X seja alcançado, é disparado erro 500 (Internal Error).</p>
<h4>RewriteLog /caminho/para/arquivo.log</h4>
<p>Escreve o log dos eventos ocorridos no arquivo especificado.</p>
<h4>RewriteLogLevel Level</h4>
<p>Level inicia em 0 (desabilitado) e vai até 9 (números superiores podem ser utilizados, mas terão o mesmo efeito: irão logar quase tudo! Use somente para debug, pois vai diminuir a performance do apache. Bom para testes/debug, não para produção.)</p>
<h4>RewriteBase /dir</h4>
<p>Especifica /dir como a base para a procura do arquivo pelo Apache. (Mais explicações adiante)</p>
<h4>RewriteCond </h4>
<p>Responsável pela condições (a.k.a. IF&#8217;s). Pode-se utilizar inúmeros testes antes de especificar uma regra, sendo que a mesma só será executada ao passar por todos os testes com sucesso. Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># Se o host for 123.45.67.89
RewriteCond %{REMOTE_ADDR} ^123.45.67.89$ [OR]
# ou for 98.76.54.32
RewriteCond %{REMOTE_ADDR} ^98.76.54.32
# A regra será a seguinte...</pre></div></div>

<p>Podem ser usadas uma série de variáveis, entre elas:</p>
<ul>
<li>%{HTTP_USER_AGENT}</li>
<li>%{HTTP_REFERER}</li>
<li>%{REMOTE_ADDR}</li>
<li>%{SCRIPT_FILENAME}</li>
<li>%{QUERY_STRING}</li>
<li>%{HTTP_HOST}</li>
<li>mais informações <a rel="nofollow" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond">aqui</a></li>
</ul>
<h4>RewriteRule </h4>
<p>É aqui que realmente acontece a reestruturação da URL. Aqui é onde é dito o que deve ser entrepretado como o quê. Se o Padrão casar, o apache interpreta como se fosse o Caminho.</p>
<p>Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">RewriteRule ^/(about|aboutme|sobre|sobremim|eu|minhavida)$ eu.html [L,NC]</pre></div></div>

<h3>Referências interessantes:</h3>
<ul>
<li><a rel="nofollow" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html" alt="Documentação do Apache">Documentação do Apache</a></li>
<li><a rel="nofollow" href="http://www.addedbytes.com/cheat-sheets/download/mod_rewrite-cheat-sheet-v2.png" alt="ModRewrite CheatSheet">ModRewrite CheatSheet</a></li>
</ul>
<h2>Exemplos de uso</h2>
<p>Agora, com alguma noção sobre o mod_rewrite, vamos utilizá-los. Com alguns exemplos do que é possível. A idéia é que você descubra um jeito próprio e que funcione PARA VOCÊ. Esta é o tipo da coisa que não adianta fazer porque alguém disse que funciona, deve seguir os seus padrões e cobrir suas necessidades.</p>
<h3>Exemplo 1: Organizando seu site no .htaccess</h3>
<p>Convenhamos: uma notícia sobre um acidente não irá mudar. Depois de submetida para um site de notícias, dificilmente ela irá ser modificada. Ao menos que tenha passado desapercebido um erro de português ou uma estatística imprecisa, uma notícia não será modificada. Portando, é possível manter um cache da notícia em um arquivo .html, evitando consultas desnecessárias a bancos de dados ou outras fontes. Mas só porque ela está em cache, não significa que ela deva aparecer com o .html no fim ou .htm ou seja lá o que for.</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteEngine On
RewriteBase /
# Se não foi requerido um arquivo vazio (-s)
RewriteCond %{REQUEST_FILENAME} !-s [OR]
# Se não foi requerido um link simbólico (-l)
RewriteCond %{REQUEST_FILENAME} !-l [OR]
# ou um arquivo (-f)
RewriteCond %{REQUEST_FILENAME} !-f [OR]
# ou um diretório (-d)
RewriteCond %{REQUEST_FILENAME} !-d
# Aplique a seguinte regra:
# Se for notícia cacheada, chama o cache
RewriteRule ^ler/([A-Za-z0-9_-]+)$ /noticias/cache/$1.html [L]
# Se for para buscar por noticias
RewriteRule ^buscar/([A-Za-z0-9_-]+) /noticias/busca.php?termo=$1&amp;area=noticias [L]
# Feeds
RewriteRule ^feeds$ feeds.php?area=noticias
# Feeds para a categoria X
RewriteRule ^feeds/(.*)$ feeds.php?area=noticias&amp;categoria=$1</pre></div></div>

<p>e assim por diante. Podemos estabelecer regras, inclusive, para subdomínios.</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteCond %{HTTP_HOST} ^en\.example\.com$
RewriteRule ^(.*)$ /news/english/index.php?q=$1 [L]
&nbsp;
RewriteCond %{HTTP_HOST} ^br\.example\.com$
RewriteRule ^(.*)$ /news/brazilian/index.php?q=$1 [L]</pre></div></div>

<p>uma outra sugestão:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteCond %{HTTP_HOST} ^en\.example\.com$
RewriteRule ^(.*)$ /news/index.php?lang=en&amp;q=$1 [L]
&nbsp;
RewriteCond %{HTTP_HOST} ^br\.example\.com$
RewriteRule ^(.*)$ /news/index.php?lang=pt-br&amp;q=$1 [L]</pre></div></div>

<h3>Exemplo 2: Listas de traduções</h3>
<p>A questão de usar uma única variável que receberá o valor da url, funciona melhor para este segundo caso:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-s [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,NC]</pre></div></div>

<p>Imagine que seu cliente queira criar páginas novas, de &#8216;política de privacidade&#8217;, &#8217;sobre a empresa&#8217;, seja lá qual for o assunto da página. Ele vai querer acessá-la de forma rápida e acessível. Para tanto, <em>index.php?area=view_page&#038;page=4354</em> não parece agradar muita gente. Não seria interessante deixar que o próprio cliente crie seu padrão de URL? Talvez /politicas ou /empresa.</p>
<p>Existe uma forma interessante de se fazer isso: usando uma lista de expressões regulares e seus arquivos originais, os quais serão usados caso as expressões regulares casarem. Por exemplo, nos casos acima, apenas com o código abaixo no .htaccess, já poderíamos fazer algo:</p>
<p>A idéia é usar a <strong>REQUEST_URI</strong> (no php <strong>$_SERVER['REQUEST_URI']</strong>). Ela retornará, por exemplo, <em>/ler/minha_noticia_bombastica</em> que casará com <em>^/ler/([a-z0-9_-])$</em> e por consequência, irá chamar a <em>noticias.php</em>. Agora, como pegar o &#8216;minha_noticia_bombastica&#8217; ? Fácil! Basta apenas utilizarmos os grupos das expressões regulares de forma apropriada. Usando o exemplo do php, com <em>preg_match</em> podemos resolver isso!</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$urlPatterns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'/^ler\/([a-z0-9_-]+)$/i'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'noticias.php'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlPatterns</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$pattern</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pattern</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$_GET</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$vars</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">include</span> <span style="color: #000088;">$fileName</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pronto! Alguns usuários podem ter notado, mas <em>$vars</em> irá ser uma sequência numérica dos grupos casados:</p>
<p>   <strong>0 => /ler/minha_noticia_bombastica, 1 => &#8216;minha_noticia_bombastica&#8217;</strong></p>
<p> Para resolver isso, podemos dar nomes aos grupos, o que seria extremamente normal para o programador (que utilizaria a variável $_GET normalmente) e bonito aos olhos do cliente. Para tanto, modificamos a nossa $urlPatterns:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$urlPatterns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'/ler\/(?&lt;news -slug&gt;[a-z0-9_-]+)$/i'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'noticias.php'</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;/</span>news<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Assim, poderemos acessar <em>$_GET['news-slug']</em>. Como fica mais difícil do usuário modificar nomes de variáveis vindos da URL, se torna uma solução segura. Podemos ter certeza de que <em>$_GET['news-slug']</em> <strong>não conterá aspas, caracateres hexadecimais ou qualquer outro tipo de código malicioso</strong>. Pois se tivesse, não passaria no teste da expressão regular. E também nos certificamos de que aquele arquivo (noticias.php) só esteja sendo acessado, caso nossa index.php o esteja incluindo. Porque o usuário não conseguirá acessar de fora.</p>
<p>Neste caso, nós estipulamos os valores na <em>$urlPatterns</em>, mas ainda se pode pegar esses <strong>valores do banco de dados</strong>, por exemplo. Uma lista de &#8216;tradução&#8217; para a url. Funciona muito bem, principalmente com páginas estáticas ou fixas. Ao invés do cidadão digitar <em>index.php?area=pages&#038;page_id=4232</em>, ele estará acessando <em>/sobre-a-empresa</em>. Para usuários provenientes de sites de busca, isto é muito importante. Lhe dá muito mais <strong>segurança</strong> e você garante o seu clique. Ele vai direto ao ponto.</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Por que usar Clean URL&#8217;s?</title>
		<link>http://gustavodutra.com/post/115/por-que-usar-clean-urls/</link>
		<comments>http://gustavodutra.com/post/115/por-que-usar-clean-urls/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 16:02:56 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[clean url]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[hierarquia]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[pagerank]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[porque]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=115</guid>
		<description><![CDATA[Olá! Este post é na verdade uma introdução para o próximo. Que trará formas de se trabalhar com Clean URL&#8217;s. Este, por sua vez, é mais teórico. Portanto, se você estiver em dúvida se usar ou não, qual os ganhos dela e etc, sinta-se a vontade de ler, comentar e criticar o post abaixo.

Patterns de [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Este post é na verdade uma introdução para o próximo. Que trará formas de se trabalhar com Clean URL&#8217;s. Este, por sua vez, é mais teórico. Portanto, se você estiver em dúvida se usar ou não, qual os ganhos dela e etc, sinta-se a vontade de ler, comentar e criticar o post abaixo.</p>
<p><span id="more-115"></span></p>
<h2>Patterns de URLS</h2>
<p>A primeira coisa a se pensar ao usar Clean URL&#8217;s é a modularização, estruturação ou hierarquisação dos conteúdos do site, para que se possa fazer algo interessante. Precisamos de algo único e que seja facilmente localizável. Afinal, um dos motivos do uso de Clean URL é este: que o conteúdo daquela página seja facilmente localizável (isso inclui memória do usuário, assimilação e, por que não, associação com outros assuntos. Além é claro de convenções, tais como: /about, /contact, etc).</p>
<p>Para blog, é muito interessante que o título de um post vire parte da URL. Ao ver o link, o usuário já sabe sobre o que se trata e o que vai encontrar neste post. Logo, se o vizinho da sua tia puser um link de um post seu no blog dele, torna-se muito mais fácil alguém clicá-lo. Nem sempre o link para o post conterá o título, talvez o link seja um mero &#8216;clique aqui&#8217;. Mas, passando o mouse sobre o link, o usuário vai ler o título do post. Para por o título na URL, existe um termo técnico chamado SLUG, que contém apenas letras, números, hífens e underlines. Por exemplo: &#8216;/artigo/como-usar-mod_rewrite&#8217; é muito mais prático e óbvio do que um &#8216;?categoria=article&#038;article_id=5433&#8242;.</p>
<p>Para buscadores isso é muito importante também. Note a diferença entre as URL&#8217;s do exemplo anterior: para usuários que não tem uma intimidade com Web, ver descrito o nome do título lhe dá muito mais segurança de clicar. Pessoas menos íntimas costumam julgar a periculosidade de uma URL pelo que consta nela. Constando &#8220;coisas do diabo&#8221; como &#8216;?id=343&#038;vid=3fdd&#038;hash=54dfsg===v3rgf&#8217; devem ser exorcizadas!</p>
<h2>Hierarquisando</h2>
<p>Hierarquisar o site, fazer a topologia, mapa do site. Vários termos! Mas para mim, são a mesma coisa. No momento em que refletimos aquelas velhas questões clássicas antes de montar um site:</p>
<ul>
<li>Qual o público alvo ?</li>
<li>Qual o objetivo ?</li>
<li>O que é preciso ?</li>
</ul>
<p>Já estamos montando mentalmente uma organização. Vamos pensar no blog deste que vos escreve e responder às perguntas.</p>
<blockquote><p>
Preciso de um blog. Onde eu escrevo posts sobre assuntos que me venham à cabeça para compartilhar um pouco da experiência que tenho e obtive lendo outros blogs, de pessoas que liam outros blogs. Ou seja, quero retribuir o que recebi (está aí o objetivo). Meu público alvo? Justamente aqueles que procuram por informações. Que programam, aprendem e crescem porque são apaixonados por tecnologias.
</p></blockquote>
<p>Agora vamos organizar essas informações:</p>
<p>No blog, além de posts (o que é totalmente indispensável), também deverá haver categorias, tags, etc. Pois o público alvo é um público sedento por informação. O público quer o máximo de informação possível e de forma rápida e simples. Não há tempo para se perder. Por isso se utiliza a categorização e as tags: fazem com que conteúdos relacionados cheguem muito mais rápido àqueles que as procuram.</p>
<p>Portanto é necessário que se consiga uma URL fácil para pesquisas no blog. Por exemplo: http://gustavodutra.com/categoria/GVim já lista todos os posts da categoria GVim. O que possibilita o &#8216;Joãozinho&#8217; favoritar a dada URL e, sempre que entrar, irá se deparar com posts da dita categoria.</p>
<p>À partir do momento que você junta informações sobre o site, você consegue estruturá-lo de forma com que fique claro e simples para o usuário onde ele está. E mais importante! Sempre coloca nomes em URL&#8217;s que tenham algum sentido lógico com o contéudo. Fazendo o contrário, faz com que o site perca credibilidade, tanto para buscadores como para usuários finais. A palavra chave é &#8216;contextualização&#8217;. Uma URL uma vez contextualizada junto ao seu conteúdo, fica mais visível na internet!</p>
<h2>Quais são os ganhos reais</h2>
<p>Muitos dos ganhos podem parecer bobos. Mas não são. Com URL&#8217;s bem definidas:</p>
<ul>
<li>Aumenta-se a segurança do site</li>
<li>Facilita a manutenção do site</li>
<li>Despreocupaçao com diretórios e nomes de arquivos</li>
<li>Facilita a navegação</li>
<li>Aumenta o pagerank em buscadores</li>
<li>Pode aumentar o número de visitas/page views</li>
</ul>
<p>Se você se perguntou &#8216;Como?&#8217;, aguarde o próximo post! Obrigado pela atenção, até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/115/por-que-usar-clean-urls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>15 dicas para maior produtividade usando o GVim</title>
		<link>http://gustavodutra.com/post/48/15-dicas-para-maior-produtividade-usando-o-gvim/</link>
		<comments>http://gustavodutra.com/post/48/15-dicas-para-maior-produtividade-usando-o-gvim/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 21:33:14 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[gvimrc]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[vimrc]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=48</guid>
		<description><![CDATA[Olá! \o/
Hoje vou falar sobre dicas (algumas bem simples, mas que fazem diferença) para aumentar a produtividade no GVim/Vim. Algumas delas são plugins, outras vão direto para o ~/.gvimrc!

Color Picker
Saindo sem estresse
Colocando Headers nos arquivos
Abrindo arquivos escritos no arquivo
Trabalhando com buffers
Aprimorando a busca
Mudando a fonte
Documentando o código
Autocomplete de código
Rodando comandos do Shell
Solução para arquivos chatos [...]]]></description>
			<content:encoded><![CDATA[<h2>Olá! \o/</h2>
<p>Hoje vou falar sobre dicas (algumas bem simples, mas que fazem diferença) para aumentar a produtividade no GVim/Vim. Algumas delas são plugins, outras vão direto para o ~/.gvimrc!</p>
<ol>
<li>Color Picker</li>
<li>Saindo sem estresse</li>
<li>Colocando Headers nos arquivos</li>
<li>Abrindo arquivos escritos no arquivo</li>
<li>Trabalhando com buffers</li>
<li>Aprimorando a busca</li>
<li>Mudando a fonte</li>
<li>Documentando o código</li>
<li>Autocomplete de código</li>
<li>Rodando comandos do Shell</li>
<li>Solução para arquivos chatos de backup</li>
<li>Removendo Linhas em Branco</li>
<li>Compilando arquivos e analizando erros</li>
<li>Mostrando a identação</li>
<li>Autorrecarregando nosso .gvimrc</li>
</ol>
<ol>
<span id="more-48"></span></p>
<h2>1. Color Picker</h2>
<p>Quem trabalha com web, geralmente precisa rapidamente selecionar uma cor em hexadecimal. Geralmente recorremos à sites para isso. Existe um plugin que resolve nossos problemas, você pode baixar ele aqui: http://www.vim.org/scripts/script.php?script_id=927</p>
<p>Para instalar é muito fácil. Baixe o arquivo colorsel.vim do site mencionado acima, jogue para dentro do diretórios de plugins, no meu caso /usr/share/vim/vim71/plugins. Ao reiniciar o gvim, basta digitar</p>
<pre>:colorSel</pre>
<p>Ele deve aparecer algo como:</p>
<p><img class="aligncenter size-full wp-image-50" title="colorsel" src="http://blog.gustavodutra.com/wp-content/uploads/2009/01/colorsel.png" alt="colorsel" width="364" height="260" /></p>
<p>Notem, que caso o vim seja aberto pelo terminar, ele dispara um erro, dizendo que o plugin instalado é para uso com interface gráfica. Para resolver isso, na linha 24 do colorsel.vim, que começa com &#8217;stderr&#8217;&#8230;</p>
<p>Apenas apague esta linha e o erro não é mais mostrado para você!</p>
<h2>2. Saindo sem estresse</h2>
<p>Muitos devem ficar brabos ao tentar sair do vim e digitar o Q maiúsculo</p>
<pre>:Q</pre>
<p>Para isso, vamos por no nosso ~/.gvimrc</p>
<pre>cab W w
cab Q q
cab Wq wq
cab wQ wq
cab WQ wq</pre>
<p>Isso vai fazer com que ao digitar algum comando da segunda coluna, ele deve interpretar como o da terceira, logo se for digitado :Q, ele vai entender :q. Isso nos livras de muitas dores de cabeça!</p>
<h2>3. Colocando Headers nos arquivos</h2>
<p>Muita gente gosta de identificar o arquivo que está escrevendo ou até mesmo ao documentar arquivos. Às vezes precisa por uma licensa, o autor do arquivo, a hora em que foi escrito. Algumas IDE&#8217;s oferecem isso normalmente, o GVim, apesar de não ser uma IDE, também oferece algo parecido. Basta acrescentar estas linhas no .gvimrc, mapeando a tecla F8 (você pode modificar à sua preferência).</p>
<pre>map &lt;F8&gt; O/**&lt;CR&gt;
\* Descrição do arquivo&lt;CR&gt;
\* @author Gustavo Dutra &lt;mechamo@gustavodutra.com&gt;&lt;cr&gt;
\* @created &lt;esc&gt;:r!date '+\%d/\%m/\%y'&lt;cr&gt;kJA&lt;cr&gt;
\*/</pre>
<p>Ao abrir um novo arquivo, basta pressionar F8, ele acrescentará nosso header (que você pode modificar para o que você desejar!).</p>
<h2>4. Abrindo arquivos escritos no arquivo</h2>
<p>Algumas linguagens não usam &#8216;import&#8217;, porém incluem arquivos dentro de arquivos, o que salva muito a vida do programador. Mas supondo que estamos editando o arquivo X, que inclui o arquivo Y, e precisamos, por alguma eventualidade, editar algo no arquivo Y. Precisamos abrir o arquivo passando todo o caminho até ele. Para isso, facilitar isso, façamos um atalho:</p>
<pre>nmap gf :new %:p:h/&lt;cfile&gt;&lt;CR&gt;</pre>
<p>Basta posicionar o cursor sobre o nome do arquivo, e digitar &#8216;gf&#8217;. Nomeei gf para significar Go to File. Você pode colocar o atalho que desejar! Basta mudar o gf para o que quiseres.</p>
<h2>5. Trabalhando com buffers</h2>
<p>Eu particularmente não gosto de um monte de instâncias do GVim aberta ao mesmo tempo, muito menos gosto de tabs. Eu gosto mesmo é de buffers. Para isso criei alguns atalhos para navegar entre eles</p>
<pre>map &lt;A-1&gt; :b1&lt;cr&gt;
map &lt;A-2&gt; :b2&lt;cr&gt;
map &lt;A-3&gt; :b3&lt;cr&gt;
map &lt;A-4&gt; :b4&lt;cr&gt;
map &lt;A-5&gt; :b5&lt;cr&gt;
map &lt;A-6&gt; :b6&lt;cr&gt;
map &lt;A-7&gt; :b7&lt;cr&gt;
map &lt;A-8&gt; :b8&lt;cr&gt;
map &lt;A-9&gt; :b9&lt;cr&gt;
map &lt;A-0&gt; :b10&lt;cr&gt;
map &lt;S-F1&gt; :b11&lt;cr&gt;
map &lt;S-F2&gt; :b12&lt;cr&gt;
map &lt;S-F3&gt; :b13&lt;cr&gt;
map &lt;S-F4&gt; :b14&lt;cr&gt;
map &lt;S-F5&gt; :b15&lt;cr&gt;
map &lt;S-F6&gt; :b16&lt;cr&gt;
map &lt;S-F7&gt; :b17&lt;cr&gt;
map &lt;S-F8&gt; :b18&lt;cr&gt;
map &lt;S-F9&gt; :b19&lt;cr&gt;
map &lt;S-F10&gt; :b20&lt;cr&gt;
map &lt;S-F11&gt; :b21&lt;cr&gt;
map &lt;S-F12&gt; :b22&lt;cr&gt;
map &lt;C-Q&gt; :bwipeout&lt;cr&gt;
map &lt;F6&gt; :buffers&lt;cr&gt;</pre>
<p>Para quem não sabe, para iniciar um buffer, utilizamos :e. Logo, para abrir nosso .gvimrc num buffer diferente, digitamos</p>
<pre>:e ~/.gvimrc</pre>
<p>À cada buffer aberto, o GVim da um número sequencial começando em 1. Nos mapa descrito ali em cima, ALT+1 até ALT+0 navegam nos 10 primeiros buffers. SHIFT+F1 até SHIFT+F12, navegam do buffer 11 até o 22. CTRL+Q, fecha o buffer (remove da lista) e F6 lista todos os buffers disponíveis com os nomes dos arquivos e seus respectivos números.</p>
<h2>6. Aprimorando a busca</h2>
<p>Para buscar por algum trecho de texto no gvim, é utilizado a barra (/).</p>
<pre>/texto da busca</pre>
<p>Adicionando no nosso .gvimrc o seguinte:</p>
<pre>set incsearch
set hlsearch</pre>
<p>É possível fazer com que à medida em que é digitado, o GVim saliente o texto (highlight), caso encontrado. Para navegar entre os resultados, utilizamos n (próxima ocorrência) ou N (ocorrência anterior). Mas, uma das coisas interessantes é sobreescrever estes comandos desta forma:</p>
<pre>nmap n nzz
nmap N Nzz</pre>
<p>zz é responsável por por a linha atual no centro da tela. Logo, isto permite que ao encontrar uma próxima ocorrência do texto, o texto ficará no meio da tela.</p>
<h2>7. Mudando a fonte</h2>
<p>No Vim a fonte utilizada é a do Terminal no qual ele foi executado. No GVim, por ser gráfico, possibilita com que seja modificada a fonte atual.</p>
<pre>set guifont=Fonte\ Desejada\ 8</pre>
<p>Lembre-se de escapar os espaços. Logo depois do nome da fonte, é colocado o tamanho dela. Se por alguma acaso você ficar em dúvida em qual fonte utilizar, você pode digitar o seguinte no GVim</p>
<pre>:set guifont=*</pre>
<p>Com isso, ele abrirá o seletor de fontes do seu OS. Basta selecionar o dar OK. Quando feito e fonte for modificada, você pode digitar somente</p>
<pre>:set guifont</pre>
<p>Ele retornará a sintaxe correta de como usar a fonte e o tamnho da mesma. Então, basta copiar e colar no .gvimrc!</p>
<h2>8. Documentando o código</h2>
<p>Todos sabem da importância que é documentar os códigos, assim como sabem a chatisse que é! Para nos ajudar com isso, seguem alguns plugins:</p>
<ul>
<li><a rel="nofollow" href="http://www.vim.org/scripts/script.php?script_id=1355" target="_blank">PHPdoc</a></li>
<li><a rel="nofollow" href="http://github.com/hotchpotch/perldoc-vim/tree/master" target="_blank">Perl<br />
</a></li>
<li><a rel="nofollow" href="http://www.vim.org/scripts/script.php?script_id=20" target="_blank">Javadoc</a></li>
</ul>
<h2>9. Autocomplete de código</h2>
<p>Maneira simples de autocompletar o código é usando CTRL+X + CTRL+O, mas isso é difícil de assimilar, logo podemos criar uma funçãozinha para ajudar:</p>
<pre>function! CleverTab()
if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
return "\&lt;Tab&gt;"
else
return "\&lt;C-X&gt;\&lt;C-O&gt;"
endfunction
inoremap &lt;Tab&gt; &lt;C-R&gt;=CleverTab()&lt;CR&gt;
set completeopt=menu,preview
</pre>
<p>Ao digitar &#8216;tex&lt;TAB&gt;&#8217; ele vai tentar utilizar o omnicompletition para completar a palavra, que pode ser uma função/variável criada dentro do arquivo ou nativa da linguagem.</p>
<h2>10. Rodando comandos do Shell</h2>
<p>Quantas vezes você já precisou ordenar algo em ordem alfabética? copiar um arquivo inteiro para o arquivo que está digitando? Para quem domina o shell, isso vai ser muito útil. No nosso .gvimrc vamos por o seguinte:</p>
<pre>set shell=/bin/bash</pre>
<p>Feito isso, vamos fazer alguns testes. Abra algum no gvim e cole o seguinte:</p>
<pre>Banana
Maçã
Amora
Pêra
Batata
Melancia</pre>
<p>Agora, vamos à mágica:</p>
<p>Digite o seguinte:</p>
<pre>:%!sort</pre>
<p>Tcharam! O % diz que é o arquivo inteiro; o ! exige que seja executado no shell. sort é comando do shell. O GVim automaticamente pega o conteúdo do arquivo, executa o comando no shell e substitui pelo resultado! Então, para copiar um arquivo no fim do nosso aberto, podemos utilizar o &#8216;cat&#8217;</p>
<pre>:$!cat /meu/arquivo</pre>
<p>Observem que eu utilizei $, ele vai começar a colar na última linha do arquivo. É legal, então, sempre ter certeza que esta linha está em branco, para que não haja perda de dados. Você também pode por numa linha específica.</p>
<pre>:6!cat /meu/arquivo</pre>
<p>Ele vai substituir o texto da linha 6 com o que contiver no arquivo, conservando da linha 1 até a linha 5, e da linha 7 até o fim do arquivo.</p>
<h2>11. Solução para arquivos chatos de backup</h2>
<p>Sabe aqueles arquivos de backup do vim? Que ficam .ext~ ? Você edita algo no projeto e o vim polui o projeto inteiro, quando você vê, já perdeu as contas de quantos arquivos novos foram criados. Ou até mesmo já commitou aqueles arquivos de swap (.swp) do vim sem querer.</p>
<p>Para resolver isso, podemos mudar o diretório onde eles são criados ou até mesmo desabilitá-los, basta acrescentar no .gvimrc:</p>
<pre>set backup
set backupdir=/tmp
set dir=/tmp</pre>
<p>Se você deseja desabilitar, utilize &#8217;set nobackup&#8217;, caso contrário os arquivos de backup irão para o /tmp, e não mais para o diretório do seu projeto! O mesmo acontece com os .swp, especificado pelo &#8217;set dir&#8217;.</p>
<h2>12. Removendo Linhas em Branco</h2>
<p>Para remover todas as linhas em branco do arquivo (vazias ou que contenham somente espaços) podemos utilizar:</p>
<pre>:g/^\s*$/d</pre>
<h2>13. Compilando arquivos e analizando erros</h2>
<p>Para compilar um arquivo, basta especificarmos o compilador. Vamos usar o exemplo do javac.</p>
<pre>:compiler javac</pre>
<p>Para compilar arquivos em java, abra ele no gvim, execute o comando acima e digite:</p>
<pre>:make %</pre>
<p>Ele irá compilar com o javac o arquivo atual e mostrar os erros em tempo de compilação. Por mais louco que pareça, há também como fazer isso com o php, por exemplo. Mas ao invés de compilar o código, ele checa a sintaxe.</p>
<pre>:compiler php
:make %</pre>
<p>Ele irá executar `php -l arquivo.php`, retornando os erros de sintaxes! É bom para testes antes de rodá-lo, evitando erros bobos como o esquecimento de 1 ponto e vírgula, um ponto ao concatenar, etc.</p>
<p>Ah! Caso você desejar, pode modificar o comando do make! Se quiser adicionar mais parâmetros, por exemplo, jogar todos os erros que já teve para um determinado lugar (é legal saber o quanto de erro produzimos, para que, ao programar, tentamos cometer cada vez menos e nunca os mesmos (né? ^__^)):</p>
<pre>au FileType php set makeprg=php\ -l\ %\ &gt;&gt;\ /tmp/errors.log</pre>
<p>assim, ele modificará somente se o arquivo for interpretado como php. Basta dar um :make que ele joga para o arquivo. No final do dia podemos avaliar nossos erros e ver (olha, preciso melhor em tal aspecto).</p>
<h2>14. Mostrando a identação</h2>
<p>Quem nunca se perguntou (o que este } está fechando? é este ou aquele if?). Pois é, bater o olho e de cara descobrir é complicado, ainda mais quando o início (if () {) não está na mesma página, digo, não é visível, é preciso rolar pra vê-lo.</p>
<pre>set list listchars=tab:»·,trail:·,eol:$</pre>
<p>Assim, primeiro habilitamos a exibição deles. Depois substituimos com os valores. Isso fará com que o nossa identação fique visível, e possamos ver (hmm&#8230; esse if tem 3 tabs antes, então vai fechar na } que tiver 3 tabs antes também!). O arquivo ficará mais ou menos assim:</p>
<pre>»····»····»····if (condicao) {$
»····»····»····»····//codigo$
»····»····»····}$</pre>
<p>Assim, o código fica claro. Você se acha no tab e consegue enxergar se há espaços desnecessários no final da linha, pois $ representa o nosso amigo \n.</p>
<h2>15. Autorrecarregando nosso .gvimrc</h2>
<p>Bom, apresento para vocês o autocmd bufwritepost. Ele é executado depois do arquivo ser salvo. Então ao salvar o arquivo ele executa o(s) comando(s) que seguem ali. Acrescentamos, então, ao nosso gvimrc os seguintes comandos:</p>
<pre>autocmd! bufwritepost .gvimrc source %
autocmd! bufwritepost .vimrc source %</pre>
<p>Assim, ao salvar .gvimrc ou .vimrc, ele recarregará as configurações automaticamente! Voltando ali na dica 13, podemos fazer isso:</p>
<pre>autocmd! bufwritepost *.php make %</pre>
<p>Rá! Agora, ao salvar um arquivo .php, ele executa no :make % que manda para /tmp/errors.log! Não é feitiçaria, é tecnologia.</p>
<p>Espero que alguma coisa seja útil para vocês! Fui!</ol>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/48/15-dicas-para-maior-produtividade-usando-o-gvim/feed/</wfw:commentRss>
		<slash:comments>8</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>
