<?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>Felipe Ribeiro &#187; design patterns</title>
	<atom:link href="http://blog.feliperibeiro.com/tag/design-patterns/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.feliperibeiro.com</link>
	<description>My hacks, slides and random stuff</description>
	<lastBuildDate>Fri, 05 Mar 2010 19:04:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Desmistificando o Singleton no PHP</title>
		<link>http://blog.feliperibeiro.com/2007/01/desmistificando-o-singleton-no-php.html</link>
		<comments>http://blog.feliperibeiro.com/2007/01/desmistificando-o-singleton-no-php.html#comments</comments>
		<pubDate>Wed, 17 Jan 2007 04:26:00 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.feliperibeiro.com/blog/?p=10</guid>
		<description><![CDATA[Ontem eu sugeri dois livros sobre Design Patterns, e hoje eu vou entrar em alguns detalhes do padrão Singleton e como ele se comporta no PHP. Por definição, o padrão Singleton serve para garantir que exista apenas uma instância de determinada classe e mantendo um ponto global de acesso à essa instância. Por exemplo, eu [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem eu sugeri dois livros sobre Design Patterns, e hoje eu vou entrar em alguns detalhes do padrão Singleton e como ele se comporta no PHP.</p>
<p>Por definição, o padrão <a href="http://pt.wikipedia.org/wiki/Singleton">Singleton</a> serve para garantir que exista apenas uma instância de determinada classe e mantendo um ponto global de acesso à essa instância. Por exemplo, eu desejo que na minha aplicação exista uma entidade responsável por gerar logs, e ela precisa ser única pois acessos concorrentes a um arquivo podem ser desastrosos, ou eu tenho limitações de recurso e preciso de uma entidade única que gerencie uma conexão socket ou com um banco de dados. E para isso foi formalizado o padrão Singleton.</p>
<p>Para garantir que só existe uma instância daquela classe eu preciso me preocupar em tratar a criação desse objeto, ou seja, limitar essa criação fazendo com que o sistema antes de criar, cheque se já existe uma instância, caso positivo retorna essa instância, caso contrário cria uma nova. Para isso, eu preciso fazer com que meu construtor seja *privado*, sendo assim acessado só por métodos da mesma classe, e prover um método de classe (estático) que possa checar a existência prévia da instância. Em PHP a implementação seria assim:
<pre>&lt;?class XPTO {private static $instance;private $estado; //Usaremos esse campo mais na frente

public static function getInstance() { if(empty(self::$instance)) {     self::$instance = new XPTO(); } return self::$instance;}

private function __construct() { $this->setEstado("Inicial"); }

public function getEstado() { return $this->estado;}

public function setEstado($novoEstado) { $this->estado = $novoEstado;}}?&gt;</pre>
<p>Sendo assim, eu não posso, de fora da classe, instanciar um novo objeto do tipo XPTO, mas tenho que chamar o metodo getInstance para pegar a instancia única dessa classe.</p>
<p>Até aqui tudo parece muito bonito, mas aí esbarramos numa limitação do PHP nesse sentido: Em PHP não existe o conceito de Aplicação, ou seja, cada vez que alguem acessa sua página, o que acontece é apenas a execução de um script numa <a href="http://pt.wikipedia.org/wiki/Thread">thread</a> do seu webserver, e mesmo que várias pessoas acessam simultaneamente o *mesmo* script, essas execuções são independentes, não há relação nenhuma entre elas. E como não existe o conceito de aplicação, os objetos e variáveis só permanecem na memória no curto tempo da execução do script, quando o PHP processa o script e devolve ao webserver para ser enviado para o visitante, aqueles valores utilizados são limpados da memória.</p>
<p>Seguindo esse raciocínio chegamos a conclusão de que em PHP o padrão Singleton é útil para organizar as idéias do programador e deixar o código melhor organizado evitando variáveis globais, porém não provê todas as funcionalidades que se espera dele, e para demonstrar essa conclusão executarei o seguinte teste:</p>
<p>1 &#8211; Crio o arquivo teste.php.</p>
<p>2 &#8211; Nesse arquivo importo a classe XPTO criada anteriormente:
<pre>&lt;? require("Xpto.class.php"); ?></pre>
<p>3 &#8211; Pego a instância única da classe XPTO e checo qual o estado atual dele:
<pre>&lt;?$xpto = XPTO::getInstance();print("Estado atual do objeto XPTO: " . $xpto->getEstado());?&gt;</pre>
<p>4 &#8211; Pego novamente a instância, altero esse estado e checo novamente:
<pre>&lt;?$xpto = XPTO::getInstance();$xpto->setEstado("Alterado");print("&lt;br/&gt;Estado atual do objeto XPTO (depois de alterado): "  . $xpto->getEstado());?&gt;</pre>
<p>Quando esse script for executado, pela primeira vez, a saída será:
<pre>Estado atual do objeto XPTO: InicialEstado atual do objeto XPTO (depois de alterado): Alterado</pre>
<p>Se houvesse o conceito de aplicação, esse objeto persistiria na memória e na próxima execução a saída *seria*:
<pre>Estado atual do objeto XPTO: AlteradoEstado atual do objeto XPTO (depois de alterado): Alterado</pre>
<p>Mas quando o PHP terminou de processar a primeira execução, ele removeu tal objeto da memória e na segunda execução ele foi recriado do zero, voltando ao estado inicial e tendo a saída idêntica à primeira execução.
<pre>Estado atual do objeto XPTO: InicialEstado atual do objeto XPTO (depois de alterado): Alterado</pre>
<p>Existem outras maneiras de se testar isso, mas essa foi a maneira que achei mais simples.</p>
<p>E esses foram meus dois centavos para mostrar que o Singleton em PHP nem sempre funciona como pensamos. <img src='http://blog.feliperibeiro.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2007/01/desmistificando-o-singleton-no-php.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pra estar no topo da pirâmide, precisa-se de DESIGN PATTERNS!</title>
		<link>http://blog.feliperibeiro.com/2007/01/pra-estar-no-topo-da-piramide-precisa-se-de-design-patterns.html</link>
		<comments>http://blog.feliperibeiro.com/2007/01/pra-estar-no-topo-da-piramide-precisa-se-de-design-patterns.html#comments</comments>
		<pubDate>Tue, 16 Jan 2007 18:52:00 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[design patterns]]></category>
		<category><![CDATA[livros]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.feliperibeiro.com/blog/?p=8</guid>
		<description><![CDATA[Olá, hoje vou mostrar dois livros que se você quer ser um bom programador precisa ter e segui-los como um muçulmano segue o Alcorão! E esses dois livros tratam de um assunto muito legal, os Design Patterns.Design Patterns separam homens de ratos programadores de verdade e micreiros . E se o cara quer ter um [...]]]></description>
			<content:encoded><![CDATA[<p>Olá, hoje vou mostrar dois livros que se você quer ser um bom programador precisa ter e segui-los como um muçulmano segue o Alcorão! <img src='http://blog.feliperibeiro.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> <br />E esses dois livros tratam de um assunto muito legal, os Design Patterns.<br />Design Patterns separam <s>homens de ratos</s> programadores de verdade e micreiros . E se o cara quer ter um código decente, bem estruturado, reaproveitável &#8211; ou seja, coisa de profissional &#8211; precisa estar ligado neles.<br />Seguem minhas dicas:</p>
<p><a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/sr=8-1/qid=1168973884/ref=pd_bbs_sr_1/102-0551892-9798569?ie=UTF8&#038;s=books">Design Patterns: Elements of Reusable Object-Oriented Software</a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ciadoslivros.com.br/capas/612/0201633612.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.ciadoslivros.com.br/capas/612/0201633612.jpg" alt="" border="0" /></a><br />O famoso &#8220;Gang of Four&#8221; (pois foi escrito por 4 caras, dã). Esse livro foi escrito nos anos 90 (94 se não me engano) tendo como principal autor o Erich Gamma, teve como objetivo formalizar soluções para problemas recorrentes no desenvolvimento de software de forma que o código ficasse mais limpo, melhor estruturado e reaproveitável, essas soluções ficaram conhecidas como Design Patterns (Padrões de Projeto) e esse livro se tornou uma bíblia no meio dos desenvolvedores. Os exemplos são dados em C++ e Smalltalk, mas os conceitos servem para qualquer linguagem OO. É leitura obrigatória pra quem quer escrever bons códigos. (Existe uma versão traduzida, mas algo me diz que essas traduções são pobres, por isso prefiro o original)<br />(ISBN: 0201633612)</p>
<p>P.S.: Tem um <a href="http://www.amazon.com/Head-First-Design-Patterns/dp/0596007124/sr=8-2/qid=1168974958/ref=pd_bbs_sr_2/102-0551892-9798569?ie=UTF8&#038;s=books">livro novo</a> sobre Design Patterns da série Head First (em português, Use a Cabeça!) que parece ser bacana também. Os livros dessa série são bem interessantes e tratam dos assuntos técnicos de maneira bem descontraída, o livro até parece até um gibizão <img src='http://blog.feliperibeiro.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  (ISBN: 0596007124) (Existe versão em português)</p>
<p>E minha segunda dica (na realidade, a terceira)  é:</p>
<p><a href="http://www.amazon.com/PHP-5-Objects-Patterns-Practice/dp/1590593804/sr=1-1/qid=1168973539/ref=sr_1_1/102-0551892-9798569?ie=UTF8&amp;s=books">PHP 5 Objects, Patterns, and Practice</a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.livrariacultura.com.br/imagem/capas1/753/774753.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.livrariacultura.com.br/imagem/capas1/753/774753.jpg" alt="" border="0" /></a><br />Esse é um que trata de como se programar BEM em PHP, que é por muitos tida como uma linguagem de difícil manutenção (coisa que depende do programador, e PHP ficou com essa fama por ser fácil e muita gente sem boas noções de programação faz seus sisteminhas nela com códigos <s>sebosos, bugados e fedorentos</s> mal escritos <img src='http://blog.feliperibeiro.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> ).<br />Ele mostra como funciona a Orientação a Objeto no PHP5 (que foi um grande avanço em relação ao 4) , mostra também aplicações de Design Patterns em PHP e boas práticas de programação. Ótimo livro!<br />(ISBN: 1590593804) (Não existe versão em português)</p>
<p>Ah, e comprar essas coisas na Amazon muitas vezes vale a pena, as vezes sai mais barato e até chega antes do que comprar em lojas nacionais (Porque elas vão importar e têm que juntar uma quantidade X pra fazer pedido e blá blá blá).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2007/01/pra-estar-no-topo-da-piramide-precisa-se-de-design-patterns.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
