<?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"
	>

<channel>
	<title>andré vendramini</title>
	<atom:link href="http://blog.andrevendramini.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.andrevendramini.com.br</link>
	<description>apenas um blog de actionscript</description>
	<pubDate>Sat, 24 Oct 2009 02:30:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Instanciando classe em tempo de execução</title>
		<link>http://blog.andrevendramini.com.br/2009/09/19/instanciando-classe-em-tempo-de-execucao/</link>
		<comments>http://blog.andrevendramini.com.br/2009/09/19/instanciando-classe-em-tempo-de-execucao/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 05:31:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[action script 3]]></category>

		<category><![CDATA[getdefinitionbyname]]></category>

		<category><![CDATA[instância]]></category>

		<category><![CDATA[instanciação]]></category>

		<category><![CDATA[referência de classe]]></category>

		<category><![CDATA[run-time]]></category>

		<category><![CDATA[runtime]]></category>

		<category><![CDATA[tempo de execução]]></category>

		<guid isPermaLink="false">http://blog.andrevendramini.com.br/?p=112</guid>
		<description><![CDATA[Todo mundo já passou por uma situação em que a instanciação dos objetos deveria ser dinâmica. Uma das soluções, porém nada prática e profissional, é fazer um switch() ou if-elseif-else.
Isso é comum quando temos um menu que leva para algumas áreas. Poderíamos instanciar esse objeto de uma forma dinâmica. Um loop que instancia um objeto [...]]]></description>
			<content:encoded><![CDATA[<p>Todo mundo já passou por uma situação em que a instanciação dos objetos deveria ser dinâmica. Uma das soluções, porém nada prática e profissional, é fazer um switch() ou if-elseif-else.</p>
<p>Isso é comum quando temos um menu que leva para algumas áreas. Poderíamos instanciar esse objeto de uma forma dinâmica. Um loop que instancia um objeto e armazena essas referências num Dictionary ou Array.</p>
<p>São inúmeras situações em que precisamos de instanciação em tempo de execução, e é isso que vamos ver agora.</p>
<h2>Objetivo</h2>
<p>Precisamos instanciar 5 classes, guardar sua referência num objeto e usá-lo depois.</p>
<h2>Exemplo</h2>
<ol>
<li>Crie um <em>AS3 Project</em> chamado GetDefinitionByName (FlashDevelop)</l1>
<li>Crie 5 classes: Bola1.as, Bola2.as, Bola3.as, etc</li>
</ol>
<p>Para instanciar uma classe é muito simples, basta fazermos:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> bola:Bola1 = <span style="color: #000000; font-weight: bold;">new</span> Bola1<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Ao colocarmos a <em>keyword</em> <strong>new</strong>, estamos dizendo a <em>AVM (ActionScript Virtual Machine)</em> que queremos iniciar uma nova instância da classe Bola1. Como a classe Bola1 está no mesmo pacote que a Main, não precisamos especificar seu caminho. Caso estivesse em outro pacote, ou teríamos que importar, ou colocar o nome completo na hora de instanciar, por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> bola:meu.<span style="color: #006600;">pacote</span>.<span style="color: #006600;">Bola1</span> = <span style="color: #000000; font-weight: bold;">new</span> meu.<span style="color: #006600;">pacote</span>.<span style="color: #006600;">Bola1</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Sabendo disso, vamos instanciar a Bola1 dinamicamente:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> bola:Bola1 = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Bola1&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Vai explodir um erro.</p>
<blockquote><p>
D:\pessoal\blog\GetDefinitionByName\src\Main.as(25): col: 21 Error: Implicit coercion of a value with static type Object to a possibly unrelated type Bola1.</p></blockquote>
<p>O tipo de nossa variavel está errado. Isso por que a função getDefinitionByName retorna uma referência de classe. Ou seja, sua classe, ao ser compilada, está na memória da AVM para poder ser instanciada. Como getDefinitionByName retorna uma referência a sua classe, temos que tipá-la com o que ela realmente é: uma classe.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> referenciaBola:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Bola1&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Irá explodir outro erro.</p>
<blockquote><p>
D:\pessoal\blog\GetDefinitionByName\src\Main.as(25): col: 31 Error: Implicit coercion of a value with static type Object to a possibly unrelated type Class.</p></blockquote>
<p>Isso ocorre pois precisamos avisar ao compilador que ele estará nos retornando uma classe através do método getDefinitionByName();</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> referenciaBola:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Bola1&quot;</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;</pre></div></div>

<p>Ok, compilado. Agora temos nossa referência de classe. Podemos instanciar nossa classe Bola1 através da nossa instância de referência de classe <em>referenciaBola</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> referenciaBola:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Bola1&quot;</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;
<span style="color: #000000; font-weight: bold;">var</span> bola:Bola1 = <span style="color: #000000; font-weight: bold;">new</span> referenciaBola<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> as Bola1;
addChild<span style="color: #66cc66;">&#40;</span>bola<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Pronto, instanciamos a classe Bola1 dinamicamente. Podemos compilar.</p>
<h2>Fazendo o loop</h2>
<p>Vamos colocar nosso código dentro de um loop, guardar a referência das bolas dentro de um array e fazer qualquer coisa com elas.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:uint = <span style="color: #cc66cc;">1</span>; i <span style="color: #66cc66;">&lt;</span>= <span style="color: #cc66cc;">5</span>; i++<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> referenciaBola:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Bola&quot;</span> + i.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;
	<span style="color: #000000; font-weight: bold;">var</span> bola:Bola1 = <span style="color: #000000; font-weight: bold;">new</span> referenciaBola<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> as Bola1;
	bolas.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span>bola<span style="color: #66cc66;">&#41;</span>;
	addChild<span style="color: #66cc66;">&#40;</span>bola<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Concatemos nossa variável <em>i</em> do loop com a string &#8220;Bola&#8221;, formando de Bola1 a Bola5. Porém, temos que observar que o tipo da variável bola continua <em>Bola1</em>, o que é errado, pois essa variável assumirá o papel da Bola2, Bola3, etc. Para resolvermos isso, podemos simplesmente trocar de Bola1 para Sprite em ambas situações (do tipo e do cast da função), pois todas nossas bolas têm em comum a superclasse Sprite. Você poderia usar uma interface ou uma classe abstrata nesse caso.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:uint = <span style="color: #cc66cc;">1</span>; i <span style="color: #66cc66;">&lt;</span>= <span style="color: #cc66cc;">5</span>; i++<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> referenciaBola:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Bola&quot;</span> + i.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;
	<span style="color: #000000; font-weight: bold;">var</span> bola:Sprite = <span style="color: #000000; font-weight: bold;">new</span> referenciaBola<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> as Sprite;
	bola.<span style="color: #006600;">x</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #0066CC;">stage</span>.<span style="color: #006600;">stageWidth</span>;
	bola.<span style="color: #006600;">y</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #0066CC;">stage</span>.<span style="color: #006600;">stageHeight</span>;
	bolas.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span>bola<span style="color: #66cc66;">&#41;</span>;
	addChild<span style="color: #66cc66;">&#40;</span>bola<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Compile e observe que a AVM diz que a variável Bola1 não foi encontrada. Como tiramos todas referências estáticas de nossas classes, o compilador não está compilando-as. Com isso, temos que criar 5 variáveis na nossa classe tipando-as, apenas para fins de compilação:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> b1:Bola1;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> b2:Bola2;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> b3:Bola3;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> b4:Bola4;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> b5:Bola5;</pre></div></div>

<p>Podemos compilar agora.</p>
<h2>Informações relevantes</h2>
<p>Ao criar a instância, podemos passar parâmetros no construtor, dessa forma:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> referenciaBola:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Bola&quot;</span> + i.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;
<span style="color: #000000; font-weight: bold;">var</span> bola:Sprite = <span style="color: #000000; font-weight: bold;">new</span> referenciaBola<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;parametro1&quot;</span>, <span style="color: #ff0000;">&quot;parametro2&quot;</span>, <span style="color: #cc66cc;">2009</span>, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> as Sprite;</pre></div></div>

<p>E nas classes, tratar esses parâmetros.</p>
<p>No exemplo, todas as classes estavam no mesmo pacote que nossa Main.as compilada. Caso suas classes estejam em outros pacotes, é necessário informar no método getDefinitionByName();</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> referenciaBola:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;meu.pacote.Bola&quot;</span> + i.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;
<span style="color: #000000; font-weight: bold;">var</span> bola:Sprite = <span style="color: #000000; font-weight: bold;">new</span> referenciaBola<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> as Sprite;</pre></div></div>

<p>Isso por que sua classe se chama <strong>meu.pacote.Bola</strong> e não apenas Bola.</p>
<p><span class="dots">Baixe os arquivos <a href="http://blog.andrevendramini.com.br/wp-content/uploads/files/GetDefinitionByName.zip">aqui</a>.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.andrevendramini.com.br/2009/09/19/instanciando-classe-em-tempo-de-execucao/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Singleton</title>
		<link>http://blog.andrevendramini.com.br/2009/07/12/singleton/</link>
		<comments>http://blog.andrevendramini.com.br/2009/07/12/singleton/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 23:54:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[criacionais]]></category>

		<category><![CDATA[design patterns]]></category>

		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://blog.andrevendramini.com.br/?p=38</guid>
		<description><![CDATA[Analogia
Você está no mercado fazendo compras. Passa por uma prateleira e coloca os produtos no carrinho. Anda, anda, olha a sua volta, vê outros produtos, coloca-os em seu carrinho e continua fazendo suas compras. Depois de muito &#8220;passear&#8221;, chega ao caixa, retira os produtos do carrinho, paga e vai embora. Do momento em que entrou [...]]]></description>
			<content:encoded><![CDATA[<h2>Analogia</h2>
<p>Você está no mercado fazendo compras. Passa por uma prateleira e coloca os produtos no <strong>carrinho</strong>. Anda, anda, olha a sua volta, vê outros produtos, coloca-os em seu <strong>carrinho</strong> e continua fazendo suas compras. Depois de muito &#8220;passear&#8221;, chega ao caixa, retira os produtos do <strong>carrinho</strong>, paga e vai embora. Do momento em que entrou no mercado até o momento que saiu, quantos carrinhos você utilizou? Um. Tão somente um.</p>
<h2>Conceito</h2>
<p>O singleton consiste em retornar à sua aplicação apenas e tão somente UMA INSTÂNCIA DO OBJETO, que será compartilhada e terá ponto de acesso global. Por ser tão simples, talvez seja um pouco confuso de entender no começo. Este é um design pattern <a href="http://blog.andrevendramini.com.br/category/design-patterns/criacionais/"><strong>criacional</strong></a>.</p>
<h2>Diagrama de Classe: Singleton Design Pattern</h2>
<div id="attachment_58" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-58" title="singleton" src="http://blog.andrevendramini.com.br/wp-content/uploads/2009/07/singleton-300x110.jpg" alt="Diagrama de Classes: Singleton Pattern" width="300" height="110" /><p class="wp-caption-text">Diagrama de Classes: Singleton Pattern</p></div>
<h2>Exemplo</h2>
<p>Vamos fazer o Singleton de nosso carrinho de compras.</p>
<ol>
<li>Crie um novo arquivo Singleton1.fla</li>
<li>Crie uma classe para ser compilada ao nosso .fla. Singleton1.as ou Main.as</li>
<li>Crie uma classe representando o carrinho. Segue o diagrama de classe:</li>
</ol>
<div id="attachment_62" class="wp-caption alignnone" style="width: 446px"><img class="size-full wp-image-62" title="classdiagram1" src="http://blog.andrevendramini.com.br/wp-content/uploads/2009/07/classdiagram1.jpg" alt="Diagrama de Classe: Carrinho Singleton" width="436" height="147" /><p class="wp-caption-text">Diagrama de Classe: Carrinho Singleton</p></div>
<p>Veja que existe uma dependência da classe <em>Carrinho</em> com <em>CarrinhoEnforcer</em>. Isso por que não temos construtores privados no ActionScript 3.0, então temos que &#8220;contornar&#8221;, criando uma classe interna em Carrinho, onde somente esta terá visibilidade, forçando então a dependência (validando nosso Singleton).</p>
<h2>Código</h2>
<h4>Carrinho.as</h4>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	 * ...
	 * @author André Vendramini
	 */</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Carrinho
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _items:<span style="color: #0066CC;">Array</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">var</span> instance:Carrinho;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Carrinho<span style="color: #66cc66;">&#40;</span>enforcer:CarrinhoEnforcer=<span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>enforcer == <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #0066CC;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Apenas uma instância deve ser criada.&quot;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			_items = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> getInstance<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:Carrinho
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>instance == <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #808080; font-style: italic;">//Preste atenção nesta linha:</span>
				instance = <span style="color: #000000; font-weight: bold;">new</span> Carrinho<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> CarrinhoEnforcer<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
				<span style="color: #808080; font-style: italic;">/*
				 * Neste momento, estamos instanciando nosso carrinho,
				 * passando como parâmetro apenas uma referência da classe
				 * CarrinhoEnforcer. Como essa classe é interna, apenas
				 * a classe Carrinho tem visibilidade, com isso, esta é a única
				 * maneira de instanciarmos nossa classe Carrinho.
				 */</span>
			<span style="color: #66cc66;">&#125;</span>
			<span style="color: #b1b100;">return</span> instance;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> addItem<span style="color: #66cc66;">&#40;</span>item:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			_items.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span>item<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">/* GETTERS AND SETTERS */</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> items<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Array</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">return</span> _items; <span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Classe interna, apenas a classe Carrinho tem visibilidade desta.
 * Com isso, temos a certeza de que apenas a classe Carrinho irá passá-la como parâmetro no construtor.
 * Essa é uma das formas de &quot;burlar&quot; o ActionScript, já que não temos construtores privados.
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> CarrinhoEnforcer
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> CarrinhoEnforcer<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Singleton da classe <em>Carrinho</em> criado. Agora vamos usá-lo. Na classe a ser compilada, entre com o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	 * ...
	 * @author André Vendramini
	 */</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Singleton1 <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		Carrinho.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addItem</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;item 1&quot;</span><span style="color: #66cc66;">&#41;</span>;
		Carrinho.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addItem</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;item 2&quot;</span><span style="color: #66cc66;">&#41;</span>;
		Carrinho.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addItem</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;item 3&quot;</span><span style="color: #66cc66;">&#41;</span>;
		Carrinho.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addItem</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;item 4&quot;</span><span style="color: #66cc66;">&#41;</span>;
		Carrinho.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addItem</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;item 5&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>Carrinho.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">items</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>O output deverá ser: <strong>item 1,item 2,item 3,item 4,item 5</strong>. Como nossa função <em>getInstance()</em> é publica e estática, temos ponto de acesso global a instância da classe <em>Carrinho</em> de qualquer escopo. Agora, vamos forçar um erro. Tente instanciar a classe <em>Carrinho</em> normalmente. Ainda na classe a ser compilada:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	 * ...
	 * @author André Vendramini
	 */</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Singleton1 <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">var</span> carrinho:Carrinho = <span style="color: #000000; font-weight: bold;">new</span> Carrinho<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>O output:</p>
<blockquote><p>Error: Apenas uma instância deve ser criada.<br />
at Carrinho()<br />
at Singleton1()</p></blockquote>
<p>Perceba que a única forma da instância da classe <em>Carrinho</em> ser criada é passando um parâmetro: uma instância da classe <em>CarrinhoEnforcer</em>. Vamos tentar passar essa instância como parâmetro e burlar nosso Singleton? Simples, não?</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	 * ...
	 * @author André Vendramini
	 */</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Singleton1 <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">var</span> carrinho:Carrinho = <span style="color: #000000; font-weight: bold;">new</span> Carrinho<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> CarrinhoEnforcer<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Output: <strong>1180: Call to a possibly undefined method CarrinhoEnforcer.</strong> A classe foi definida DENTRO da própria classe <em>Carrinho.as</em>, tendo apenas esta a visibilidade da mesma. <em>Voilà</em>, nosso Singleton está apto a ser posto em serviço.</p>
<p><span class="dots">Baixe os arquivos <a href="http://blog.andrevendramini.com.br/wp-content/uploads/files/singleton.zip">aqui</a>.</span></p>
<h2>Aplicabilidade</h2>
<p>Este é um pattern extremamente útil se aplicado de forma correta. Por exemplo, em jogos. Para contar pontuação de um jogo, não importa em qual fase esteja, quantos pontos ganhe nem quantas vezes tente. O Singleton se encarrega de cuidar direitinho de tudo isso. Com a certeza de existir apenas 1 ponto de acesso a instância.</p>
<h2>Cuidados</h2>
<p>Este é um pattern que pode ludibriar no início por sua simplicidade e poder. Não o use abusivamente para corrigir problemas nem contornar situações de orientação a objetos. Por trabalhar com uma função estática e de acesso global, você pode ficar &#8220;preguiçoso&#8221; de fazer da forma correta e começar a usá-lo de forma errada, apenas para poupar tempo. Os princípios da orientação a objetos não devem ser substituídos, jamais.</p>
<p>Ele quebra uma das leis da orientação a objetos, que diz para cada objeto ter uma responsabilidade. O Singleton possui 2: da acesso global a variável <em>e</em> têm a certeza de única instância.</p>
<p>Farei um post sobre o assunto mais pra frente. Leiam esses materiais:</p>
<ul>
<li><a href="http://www.as3dp.com/2008/11/26/we-don%E2%80%99t-need-no-stinkin%E2%80%99-singletons-why-to-avoid-the-singleton-pattern-in-actionscript-30-programming/" target="_blank">http://www.as3dp.com/2008/11/26/we-don%E2%80%99t-need-no-stinkin%E2%80%99-singletons-why-to-avoid-the-singleton-pattern-in-actionscript-30-programming/</a></li>
<li><a href="http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/" target="_blank">http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/</a></li>
</ul>
<h2>Curiosidades</h2>
<p>Singleton é uma alusão a jogo de cartas. Nos EUA, quando o jogador fica apenas com uma carta na mão, esta é chamada &#8220;singleton&#8221;.</p>
<p>Este é um padrão <em><a href="http://en.wikipedia.org/wiki/Design_Patterns_(book)" target="_blank">GoF</a></em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.andrevendramini.com.br/2009/07/12/singleton/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Design Patterns</title>
		<link>http://blog.andrevendramini.com.br/2009/07/09/design-patterns/</link>
		<comments>http://blog.andrevendramini.com.br/2009/07/09/design-patterns/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 04:36:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[design patterns]]></category>

		<guid isPermaLink="false">http://blog.andrevendramini.com.br/?p=20</guid>
		<description><![CDATA[Observando o que existe em nossa volta captamos algumas situações, estados e comportamentos que, se pararmos para analisar de uma forma exata e calculista, é exatamente o que precisamos.
Observe a estrutura de uma árvore: tronco, galhos, folhas. Uns &#8220;conectados&#8221; com os outros. O comportamento: das folhas, como uma reage só ao fato de encostar numa [...]]]></description>
			<content:encoded><![CDATA[<p>Observando o que existe em nossa volta captamos algumas <strong>situações, estados e comportamentos</strong> que, se pararmos para analisar de uma forma exata e calculista, é exatamente o que precisamos.</p>
<p>Observe a estrutura de uma árvore: tronco, galhos, folhas. Uns &#8220;conectados&#8221; com os outros. O comportamento: das folhas, como uma reage só ao fato de encostar numa outra que está ao lado; dos galhos, você balança um e todas as folhas sofrem a reação.</p>
<p>Agora pense numa fábrica. Você, como cliente, espera o produto pronto da fábrica. Não quer saber como é feito e por quais processos passa. Apenas o quer perfeito, na hora que precisar, pronto para ser usado.</p>
<p>O que isso tem a ver com design patterns? Aí está toda arte. O &#8220;segredo&#8221; por detrás de conceitos, códigos, padrões, nomenclatura, comportamento, eventos. Não são tão puro e simplesmente &#8220;padrões a serem seguidos&#8221;. Vamos ter um olhar mais artístico, pois <strong>código é arte</strong>.</p>
<p><strong>Design Patterns (padrões de projetos), de uma forma bem resumida, são padrões, pensamentos e conceitos que são aplicados a determinadas situações. Uma solução simples, robusta, inteligente e eficaz.</strong><br />
Ao estudá-los e começar a ter essa visão de abstrair e comparar com situações do mundo real, sejam criadas pelo homem ou sejam naturais, começamos a perceber o poder que temos em nossas mãos como programadores. A beleza dos design patterns deve-se ao fato de muitas vezes serem apenas representações em código de algo já existente. Poderosa arma, não?</p>
<p>Com isso fica de fácil compreensão seu código. Fica algo enxuto, bonito, leve, maduro, podendo ser admirado por outro programador durante muito tempo. Quando um artista faz um quadro, com certeza outros irão vê-lo e julgá-lo.</p>
<p>Esta foi uma pequena introdução à área de design patterns do blog. Breve, irei escrever sobre os principais padrões, sempre com uma analogia de facil entendimento, exemplos na prática e como aplicar em projetos.</p>
<p>Referências:</p>
<ul>
<li><a href="http://pt.wikipedia.org/wiki/Design_patterns" target="_blank">http://pt.wikipedia.org/wiki/Design_patterns</a></li>
<li><a href="http://www.as3dp.com/" target="_blank">http://www.as3dp.com/</a></li>
</ul>
<p><em>&#8220;A arte de transformar situações, estados e comportamento em código&#8221;</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.andrevendramini.com.br/2009/07/09/design-patterns/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
