<?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>Daniela Araujo &#187; OOP</title>
	<atom:link href="http://blog.nyan.com.br/pt/category/oop/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nyan.com.br/pt</link>
	<description>Flash, ActionScript e eu.</description>
	<lastBuildDate>Sun, 05 Sep 2010 16:55:58 +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>Abstração?</title>
		<link>http://blog.nyan.com.br/pt/2009/04/09/abstracao/</link>
		<comments>http://blog.nyan.com.br/pt/2009/04/09/abstracao/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 02:10:41 +0000</pubDate>
		<dc:creator>Daniela</dc:creator>
				<category><![CDATA[OOP]]></category>
		<category><![CDATA[abstração]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[objetos complexos]]></category>
		<category><![CDATA[reuso]]></category>

		<guid isPermaLink="false">http://blog.nyan.com.br/pt/?p=230</guid>
		<description><![CDATA[Vamos seguindo com o assunto OOP. Hoje vou falar um pouquinho de abstração. Para não deixar dúvidas sobre o significado da palavra de forma geral, segue a definição do dicionário para o verbo abstrair: abstrair Conjugar do Lat. abstrahere v. tr., fazer abstracção; separar mentalmente (as qualidades ou propriedades dos seres); afastar, desprezar; v. int., considerar [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos seguindo com o assunto OOP. Hoje vou falar um pouquinho de abstração.<br />
Para não deixar dúvidas sobre o significado da palavra de forma geral, segue a definição do dicionário para o verbo abstrair:</p>
<blockquote><p><strong>abstrair</strong></p>
<p>Conjugar<br />
do Lat.  abstrahere</p>
<p>v. tr.,<br />
<span style="color: #ff00ff;"> fazer abstracção;<br />
</span><span style="color: #ff00ff;"> separar mentalmente (as qualidades ou propriedades dos seres);</span><br />
afastar, desprezar;</p>
<p>v. int.,<br />
<span style="color: #ff00ff;"> considerar isoladamente;<br />
simplificar;</span></p>
<p>v. refl.,<br />
distrair-se;<br />
alhear-se;<br />
concentrar-se, absorver-se.</p></blockquote>
<p>E o substantivo abstração:</p>
<blockquote><p><strong>abstracção</strong></p>
<p>do Lat. <em> abstractione</em></p>
<p>s. f.,<br />
<span style="color: #ff00ff;">acção de abstrair;</span><br />
<span style="color: #ff00ff;">separação mental de uma das partes de um todo;</span><br />
estado da pessoa absorta em profunda meditação, contemplação, êxtase, enlevo;<br />
distracção;<br />
<span style="color: #ff00ff;">hipótese</span>.</p></blockquote>
<p>Tudo bem, mas o que é abstração quando se fala de orientação a objetos? É exatamente o que o dicionário diz. Abstração não é algo de OOP, mas é sim uma das bases deste paradigma. E pra quem não sabe o que significa paradigma:</p>
<blockquote><p>paradigma | s. m.</p>
<p>paradigma<br />
s. m.<br />
Gram. Modelo (de conjugação ou de declinação).</p></blockquote>
<p>Sempre fui da idéia de não repetir uma palavra ou um conceito só porque é usado dessa forma e aceitar isso&#8230; Me agrada saber o que eu estou falando. Dizem que OOP é um paradigma de programação (análise e/ou projeto) que se baseia em unidades chamadas objetos. Então vamos abstrair. Ignoremos o português engomadinho. OOP é um modelo ou um jeito de se programar onde a gente trata os pedacinhos do sistema como coisas do mundo real.</p>
<p>Então aproveitando o mundo real, posso dizer que nós somos instâncias da classe Pessoa. E pessoas tem características. Como cor de olhos e cabelos. Mas do que interessa num sistema de cadastro de newsletter a cor dos cabelos do usuário? Absolutamente nada! Então esqueça isso. Se a orientação a objetos diz que devemos programar as coisas como são no mundo real, a abstração, que é uma de suas bases, diz: &#8220;<em><strong>mas não exagere, o mundo real é um sistema muito mais complexo que o seu cadastro de newsletter</strong></em>&#8220;. Devemos criar objetos. Eles devem ser &#8220;vivos&#8221;, mas precisam ser coerentes com seu universo.</p>
<p><strong>Indo além da abstração</strong>, se nessa vida posso lhe dar um conselho sobre OOP é: cuidado com objetos complexos. Normalmente eles são formados por outros objetos. E essa é a parte difícil pra quem sai de uma linguagem procedural para OOP. É ai que as vezes algumas pessoas pecam. Elas misturam tanto que uma Pessoa (do mudo real), é apenas uma pessoa e não um objeto complexo formado por  objetos menores. É como se o cérebro fizesse tudo ao invés de mandar as outras partes fazerem o trabalho delas. O objetivo não é entrar em uma aula de anatomia, então do que estou falando?</p>
<p>Lembra do cadastro de newsletter? Vamos supor que nesse caso o usuário precisa interagir com um formulário. Neste formulário temos dois campos (nome e email) e um botão (enviar), precisaremos ter uma outra telinha, que  irá mostrar a mensagem de status do envio do cadastro e precisamos dar ao usuário a oportunidade de voltar para a tela anterior. Então, o cadastro de newsletter é formado por dois objetos: formulário e tela de resposta. O formulário por sua vez é formado por 3 objetos: dois campos (instâncias de uma mesma classe) e um botão. Enquanto a tela de resposta é formada por 2 objetos: um campo de mensagem e um botão de voltar. Com isso, posso concluir que, um cadastro de newsletter é um objeto complexo, formado por 2 objetos complexos, formado por n objetos&#8230; É assim que se programa em OOP, mas por que dividr tanto? Reuso. Esta é a resposta chave. Mas eu acrescento outras coisas que vem de brinde: organização, flexibilidade e independência entre as partes.</p>
<p>Vamos tentar entender mais sobre isso&#8230; Se eu tiver um objeto do tipo <code>FormResponse</code> (me desculpem a falta de documentação, mas não queria deixar o bloco muito extenso):</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: #0066CC;">MovieClip</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">MouseEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">TextField</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> FormResponse <span style="color: #0066CC;">extends</span> <span style="color: #0066CC;">MovieClip</span>
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> FormResponse<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">this</span>.<span style="color: #0066CC;">visible</span> = <span style="color: #000000; font-weight: bold;">false</span>;
			<span style="color: #0066CC;">this</span>.<span style="color: #006600;">backButton</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>MouseEvent.<span style="color: #006600;">CLICK</span>, <span style="color: #0066CC;">this</span>.<span style="color: #006600;">handleBackButtonClick</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">message</span>:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">this</span>.<span style="color: #006600;">messageText</span>.<span style="color: #0066CC;">text</span> = <span style="color: #0066CC;">message</span>;
			<span style="color: #0066CC;">this</span>.<span style="color: #0066CC;">visible</span> = <span style="color: #000000; font-weight: bold;">true</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">hide</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">this</span>.<span style="color: #0066CC;">visible</span> = <span style="color: #000000; font-weight: bold;">false</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handleBackButtonClick<span style="color: #66cc66;">&#40;</span>event:MouseEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">this</span>.<span style="color: #006600;">dispatchEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;backButtonClick&quot;</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Você concorda que seria muito mais simples lá na minha classe principal eu usar um objeto desses, através dos métodos <code>show</code> e <code>hide</code>, ao invés de fazer todas ou parte destas instruções repetidamente sempre que precisasse mostrar uma mensagem?</p>
<p>Se eu não escrevesse esta classe, la na minha instância principal eu teria (supondo que todos estes elementos estão adicionados no palco):</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">this</span>.<span style="color: #006600;">formResponse</span>.<span style="color: #0066CC;">visible</span> = <span style="color: #000000; font-weight: bold;">true</span>;
<span style="color: #0066CC;">this</span>.<span style="color: #006600;">formResponse</span>.<span style="color: #006600;">messageText</span>.<span style="color: #0066CC;">text</span> = <span style="color: #ff0000;">&quot;mensagem&quot;</span>;
&nbsp;
<span style="color: #0066CC;">this</span>.<span style="color: #006600;">formResponse</span>.<span style="color: #006600;">backButton</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>MouseEvent.<span style="color: #006600;">CLICK</span>, handleBackButtonClick<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> handleBackButtonClick<span style="color: #66cc66;">&#40;</span>event:MouseEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #808080; font-style: italic;">// seu codigo aqui</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Mas eu posso ter apenas isso:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">this</span>.<span style="color: #006600;">formResponse</span>.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mensagem&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>E o melhor é que se eu quiser fazer uma animação para a entrada/saída, por exemplo, eu preciso apenas alterar a classe FormResponse, enquanto na versão bagunçada ali em cima eu precisaria mudar o código em todos os lugares onde ele aparece.</p>
<p>Simples, não?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nyan.com.br/pt/2009/04/09/abstracao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classes Abstratas</title>
		<link>http://blog.nyan.com.br/pt/2009/04/07/classes-abstratas/</link>
		<comments>http://blog.nyan.com.br/pt/2009/04/07/classes-abstratas/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 00:43:55 +0000</pubDate>
		<dc:creator>Daniela</dc:creator>
				<category><![CDATA[OOP]]></category>
		<category><![CDATA[classes abstratas]]></category>

		<guid isPermaLink="false">http://blog.nyan.com.br/pt/?p=226</guid>
		<description><![CDATA[Embora o ActionScript ainda não tenha recursos de classes e métodos abstratos, não custa não a gente procurar entender um pouquinho mais de Orientação a Objetos. De repente na próxima versão do AS a gente consegue criar classes que não sejam concretas e daí você já vai saber as razões e os motivos de usá-las. [...]]]></description>
			<content:encoded><![CDATA[<p>Embora o ActionScript ainda não tenha recursos de classes e métodos abstratos, não custa não a gente procurar entender um pouquinho mais de Orientação a Objetos. De repente na próxima versão do AS a gente consegue criar classes que não sejam concretas e daí você já vai saber as razões e os motivos de usá-las.</p>
<p>Normalmente as pessoas comparam muito interfaces com classes abstratas, mas são coisas completamente distintas e com objetivos bem diferentes, por isso, ao contrário da maioria, não vou abordar as duas coisas juntas.</p>
<p><strong>Características das classes abstratas:</strong></p>
<ul>
<li>Pode-se dizer que é uma classe incompleta.</li>
<li>Não pode ser instanciada (perfeitamente justificada pelo item acima). </li>
<li>Pode ou não ter métodos abstratos (tem quem diga que deve ter pelo menos um, caso contrário poderia ser uma classe concreta, mas isso é uma questão de ponto de vista e de quão a risca se deve seguir a teoria).</li>
<li>Uma classe que tenha um método abstrato deve ser obrigatoriamente declarada como abastrata, ou seja, não existe método abstrato fora de uma classe abstrata.</li>
<li>Pode ou não ter métodos concretos.</li>
<li>Quando uma classe concreta herdar uma classe abstrata todos os métodos abstratos devem ser implementados.</li>
<li>Uma classe abstrata pode herdar outra classe abstratas e os métodos abstratos só serão obrigatórios na primeira classe concreta da hierarquia.</li>
</ul>
<p>Assim como com classes concretas e interfaces podemos utiizar delas também para realizar operações polimórficas. </p>
<p>As classes abstratas são bastante usadas como template, se quiser entender um pouquinho mais sobre isso, dá uma olhadinha aqui: <a href="http://blog.nyan.com.br/pt/2009/03/25/template-method/">Template Method</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nyan.com.br/pt/2009/04/07/classes-abstratas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Template Method</title>
		<link>http://blog.nyan.com.br/pt/2009/03/25/template-method/</link>
		<comments>http://blog.nyan.com.br/pt/2009/03/25/template-method/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 04:22:11 +0000</pubDate>
		<dc:creator>Daniela</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[classes abstratas]]></category>
		<category><![CDATA[template method]]></category>

		<guid isPermaLink="false">http://blog.nyan.com.br/pt/?p=211</guid>
		<description><![CDATA[O Template Method é um padrão de projeto que tem como objetivo definir uma base do código (algorítimo ou funcionalidade), deixando que as subclasses completem as tarefas, mas sem alterar a estrutura base. Se você reparar bem, quando falamos de aproveitamento de código em OOP, esse padrão é a base de quase tudo &#8211; ou [...]]]></description>
			<content:encoded><![CDATA[<p>O <em>Template Me</em><em>thod</em> é um padrão de projeto que tem como objetivo definir uma base do código (algorítimo ou funcionalidade), deixando que as subclasses completem as tarefas, mas sem alterar a estrutura base.</p>
<p>Se você reparar bem, quando falamos de aproveitamento de código em OOP, esse padrão é a base de quase tudo &#8211; ou a base de quase tudo se parece muito com ele. O problema dele em relação ao ActionScript é que ele é baseado em classes e métodos abstratos e como a linguagem ainda não disponibiliza este recurso, podemos apenas tapar um olho e simular o padrão.</p>
<p><strong>Nota</strong>: Eu particularmente gosto de usar o prefixo <code>Base</code> em todas as classes que crio em AS e que em teoria deveriam ser classes abstratas. Ao menos assim existe uma forma simples e rápida de identificá-las dentro da estrutura de um projeto ou <em>framework</em>.</p>
<p>Segue um exemplo extremamente simples (e sem funcionalidade) só para entendermos alguns conceitos. </p>
<p>Classe &#8220;abstrata&#8221;:</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;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BaseTest <span style="color: #0066CC;">extends</span> <span style="color: #0066CC;">MovieClip</span>
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> BaseTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">// definindo um método que não pode ser sobrescrito</span>
		<span style="color: #0066CC;">public</span> final <span style="color: #000000; font-weight: bold;">function</span> finalMethod<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">// chamada a método opcional (gancho)</span>
                        <span style="color: #0066CC;">this</span>.<span style="color: #006600;">hookMethod</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
                        <span style="color: #808080; font-style: italic;">// implementação padrão</span>
			<span style="color: #0066CC;">this</span>.<span style="color: #006600;">x</span> = <span style="color: #cc66cc;">200</span>;
&nbsp;
			<span style="color: #808080; font-style: italic;">// chamada ao método que será sobrescrito</span>
			<span style="color: #0066CC;">this</span>.<span style="color: #006600;">customMethod</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">// método que deveria ser abstrato</span>
		protected <span style="color: #000000; font-weight: bold;">function</span> customMethod<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">// implementação na classe concreta</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">// método gancho que pode ou não ser sobrescrito</span>
		protected override <span style="color: #000000; font-weight: bold;">function</span> hookMethod<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
		<span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Classe concreta:</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;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomTest <span style="color: #0066CC;">extends</span> BaseTest
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> CustomTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">// método que deveria ser abstrato</span>
		protected override <span style="color: #000000; font-weight: bold;">function</span> customMethod<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">// implementação personalizada obrigatória</span>
			<span style="color: #0066CC;">this</span>.<span style="color: #006600;">y</span> = <span style="color: #cc66cc;">45</span>;
                <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Neste padrão as chamadas normalmente ocorrem mem modo inverso daqueles que normalmente aplicamos. Ao invés de fazer a chamada ao código comum (ou código reutilizado) na classe filha (<code>CustomTest</code>), fazemos as chamadas pela classe pai (<code>BaseTest</code>). Assim, é possivel garantir o fluxo de execução das tarefas pelo objeto.</p>
<p>Podemos observar também que na classe &#8220;abstrata&#8221; os métodos públicos (que são implementados) são declarados com a palavra reservada <code>final</code>, isto significa (garante) que ele não poderá ser sobrescrito. Os métodos personalizáveis, ao contrário, são declarados como <code>protected</code> permitindo que sejam sobrescritos através de herança.</p>
<p>As principais chamadas que a classe &#8220;abstrata&#8221; faz são as seguintes:</p>
<p><strong>Métodos concretos </strong></p>
<p>Da classe abstrata &#8211; implementações úteis a todas as classes filhas -, da classe concreta ou de outras classes.</p>
<p><strong>Métodos abstratos</strong></p>
<p>Devem obrigatoriamente ser sobrescritos. Isto é um problema pois não conseguimos garantir a sobrescrita de um método utilizando ActionScript a não ser que seja por interfaces.</p>
<p><strong>Métodos ganchos</strong></p>
<p>Podem ou não ser sobrescritos e são uma implementação opcional. É uma maneira de utilizar herança de forma controlada. Estes métodos não possuem implementação na classe abstrata.</p>
<p> </p>
<p>É interessante que ao usar essa idéia em ActionScript seja definido um padrão para os nomes dos métodos, que facilite a identificação do métodos que são obrigatórios (teoricamente abstratos) e dos que são opcionais, ainda que não se tenha a garantia de um método abastrato.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nyan.com.br/pt/2009/03/25/template-method/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como não esquecer padrões de projeto?</title>
		<link>http://blog.nyan.com.br/pt/2009/03/21/como-nao-esquecer-padroes-de-projeto/</link>
		<comments>http://blog.nyan.com.br/pt/2009/03/21/como-nao-esquecer-padroes-de-projeto/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 04:39:31 +0000</pubDate>
		<dc:creator>Daniela</dc:creator>
				<category><![CDATA[Abacatices]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[camisetas]]></category>
		<category><![CDATA[guia]]></category>

		<guid isPermaLink="false">http://blog.nyan.com.br/pt/?p=191</guid>
		<description><![CDATA[Não que eu esteja fazendo propaganda, não é isso! Mas adorei as camisetas com diagramas UML que acabei achando através de um post do blog do Jason McDonald. Elas são ótimas! Quer coisa melhor pra fixar Design Patterns que vestir a camisa? Estou bem tentada a adquirir uma.   E pra não dizer que é só [...]]]></description>
			<content:encoded><![CDATA[<p>Não que eu esteja fazendo propaganda, não é isso! Mas adorei as camisetas com diagramas UML que acabei achando através de um <a href="http://www.mcdonaldland.info/2007/11/28/40/" target="_blank">post</a> do blog do<a href="http://www.mcdonaldland.info/" target="_self"> Jason McDonald</a>. Elas são ótimas! Quer coisa melhor pra fixar Design Patterns que vestir a camisa? Estou bem tentada a adquirir uma.</p>
<p style="text-align: center;"><a href="http://www.cafepress.com/codergear/5070993" target="_blank"><img class="aligncenter" title="Camiseta Observer" src="http://images2.cafepress.com/product/240401212v4_240x240_Back_Color-AshGrey.jpg" alt="" width="240" height="240" /></a></p>
<p style="text-align: center;"> </p>
<p>E pra não dizer que é só um surto por camisetas &#8220;<em>nerd</em>&#8220;, tem também um guia de referência rápida feito pelo próprio Jason McDonald, com um resuminho de cada Design Patterns do GoF. Para ver o PDF clique na imagem abaixo. </p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf" target="_blank"><img class="aligncenter" src="http://www.mcdonaldland.info/files/designpatterns/page1thumb.png" alt="" width="415" height="541" /></a></p>
<p style="text-align: center;"><a href="http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf" target="_blank"><img class="aligncenter" src="http://www.mcdonaldland.info/files/designpatterns/page2thumb.png" alt="" width="415" height="541" /></a></p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">O post é antigo, mas eu adorei. E você?</p>
<p style="text-align: left;"> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nyan.com.br/pt/2009/03/21/como-nao-esquecer-padroes-de-projeto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objetos: instâncias e referências</title>
		<link>http://blog.nyan.com.br/pt/2009/03/20/objetos-instancias-e-referencias/</link>
		<comments>http://blog.nyan.com.br/pt/2009/03/20/objetos-instancias-e-referencias/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 02:47:20 +0000</pubDate>
		<dc:creator>Daniela</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://blog.nyan.com.br/pt/?p=166</guid>
		<description><![CDATA[Instâncias e referências são coisas completamenete distintas. É importante entender que quando você declarar uma variável não está sendo criada nenhuma instância.  // declarando variável var content:MovieClip; Quando um objeto for criado &#8211; uma nova instância pode ser gerada através do operador new -, obtém-se uma referência, que é armazenada na variável. // cria instância [...]]]></description>
			<content:encoded><![CDATA[<p>Instâncias e referências são coisas completamenete distintas. É importante entender que quando você declarar uma variável não está sendo criada nenhuma instância. </p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// declarando variável</span>
<span style="color: #000000; font-weight: bold;">var</span> content:<span style="color: #0066CC;">MovieClip</span>;</pre></div></div>

<p style="text-align: center;"><img class="size-full wp-image-175 aligncenter" title="variavel" src="http://blog.nyan.com.br/pt/wp-content/uploads/2009/03/variavel.jpg" alt="variavel" width="280" height="64" /></p>
<p>Quando um objeto for criado &#8211; uma nova instância pode ser gerada através do operador <code>new</code> -, obtém-se uma referência, que é armazenada na variável.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// cria instância de MovieClip</span>
content = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">MovieClip</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p style="text-align: center;"><img class="size-full wp-image-176 aligncenter" title="instancia" src="http://blog.nyan.com.br/pt/wp-content/uploads/2009/03/instancia.jpg" alt="instancia" width="280" height="69" /></p>
<p>Neste exemplo, <code>content</code> é uma variável que armazena um endereço de memória, no qual existe um objeto do tipo <code>MovieClip</code>. A variável <code>content</code> mantém apenas a referência para o objeto e não o objeto em si. Assim, numa atribuição como a mostrada abaixo, não será criado outro objeto <code>MovieClip</code>, mas uma nova referência para ele.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// atribuindo referencia de content a content2</span>
<span style="color: #000000; font-weight: bold;">var</span> content2:<span style="color: #0066CC;">MovieClip</span> = content;</pre></div></div>

<p style="text-align: center;"><img class="size-full wp-image-177 aligncenter" title="referencia" src="http://blog.nyan.com.br/pt/wp-content/uploads/2009/03/referencia.jpg" alt="referencia" width="280" height="102" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nyan.com.br/pt/2009/03/20/objetos-instancias-e-referencias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Encapsulamento</title>
		<link>http://blog.nyan.com.br/pt/2009/03/13/encapsulamento/</link>
		<comments>http://blog.nyan.com.br/pt/2009/03/13/encapsulamento/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 02:31:32 +0000</pubDate>
		<dc:creator>Daniela</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://blog.nyan.com.br/?p=4</guid>
		<description><![CDATA[Encapsulamento é uma das bases da Orientação a Objetos onde a idéia principal é tornar cada objeto auto-suficiente (na medida do possível). Com isso podemos gerar código com um grande índice de reuso, além de facilitar a manutenção.]]></description>
			<content:encoded><![CDATA[<p>Encapsulamento é uma das bases da Orientação a Objetos onde a idéia principal é tornar cada objeto auto-suficiente (na medida do possível). Com isso podemos gerar código com um grande índice de reuso, além de facilitar a manutenção.</p>
<p>Vamos tomar como exemplo um ComboBox:</p>
<p>Você adiciona o componente no Stage e insere os dados no mesmo (label, data, etc), certo? O componente é responsável por exibí-los. Assim, podemos dizer que você usa um ComboBox e tem acesso às propriedades necessárias para personalizá-lo ao seu modo (Talvez o combo do flash não seja o melhor exemplo de personalização, mas essa é outra história). Já pensou se você precisasse programar um código para que depois de um numero x de elementos fosse inserida uma rolagem no combo? Felizmente, neste conceito (e no do Flash, graças a Deus!), você não precisa. O combo é responsável pelos seus <strong>estados</strong> (lembre dessa palavra! Vamos lá, repita comigo: estado, estado, estado…), e é ele quem deve cuidar da sua rolagem independente do número de itens que possua.</p>
<p>Vamos supor que o nosso combo possua uma variável estática (que consequentemente tem o mesmo valor para todos os combos &#8211; ou em se tratando de OOP propriamente dita, para todas as instâncias do objeto) chamada MIN_ELEMENTS, que é responsável por armazenar o número mínimo de elementos visíveis, cuja declaração seria a seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">var</span> MIM_ELEMENTS:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">1</span>;</pre></div></div>

<p>Então, por descuido ou qualquer outro motivo alguém resolve escrever o código:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">ComboBox.<span style="color: #006600;">MIM_ELEMENTS</span> = -<span style="color: #cc66cc;">10</span>;</pre></div></div>

<p>A variável é publica e pode ser acessada de qualquer lugar. Mas me diga, é possível renderizar -10 itens? Você acha possível que a alteração de um atributo como este poderia afetar o funcionamento do combo? É provável que sim. Não precisamos ter acesso a atributos deste gênero para utilizar o nosso objeto combo, mas é um dado importante dentro do mesmo. Assim a declaração correta seria:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">var</span> MIM_ELEMENTS:<span style="color: #0066CC;">Number</span> = <span style="color: #cc66cc;">1</span>;</pre></div></div>

<p>Agora esse atributo só é visível dentro da classe e só pode ser alterado internamente.</p>
<p>Vamos a outro exemplo. Temos uma classe Pessoa e um de seus atributos é sexo e seu conteúdo pode ser feminino ou masculino.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Pessoa
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> sexo:<span style="color: #0066CC;">String</span>;
    <span style="color: #808080; font-style: italic;">// continua o codigo</span>
    <span style="color: #808080; font-style: italic;">//  ...</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> p:Pessoa = <span style="color: #000000; font-weight: bold;">new</span> Pessoa<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
p.<span style="color: #006600;">sexo</span> = <span style="color: #ff0000;">&quot;Maria&quot;</span>;</pre></div></div>

<p>A variável sexo é pública e do tipo String portanto poderia aceitar tranquilamente a String“Maria”, entretanto, isso pode &#8211; e provavelmente irá &#8211; comprometer o funcionamento do nosso objeto, tendo em vista que o sexo “Maria” definitivamente não existe. Assim, utilizamos recursos de encapsulamento de OOP para proteger o nosso objeto. Os getters e os setters.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Pessoa
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _sexo: <span style="color: #0066CC;">String</span>;
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> sexo<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">return</span> _sexo;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ser sexo<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        value = value.<span style="color: #0066CC;">toLowerCase</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>value == <span style="color: #ff0000;">&quot;feminino&quot;</span> or value=<span style="color: #ff0000;">&quot;masculino&quot;</span><span style="color: #66cc66;">&#41;</span>
            _sexo = value;
&nbsp;
        <span style="color: #808080; font-style: italic;">// caso nao fosse atribuido poderia ser disparado um evento,</span>
        <span style="color: #808080; font-style: italic;">// ser gerada uma excessao,</span>
        <span style="color: #808080; font-style: italic;">// exibir uma mensagem de erro e por ai vai.</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>No exemplo acima, garantimos que será inserido apenas um dado válido. E o getter? Bom, se você restringe o acesso a um dado e ele precise ser visto fora do objeto, é necessário disponibilizá-lo (se e somente se ele realmente precisa ser visto de fora). Mas não confunda! O getter pode conter outras coisas além do retorno do atributo.</p>
<p>Geralmente quando se começa a aprender OOP (seja para criar o hábito, começar a identificar necessidades, ou qualquer outra coisa que se possa querer com isso) se indica utilizar atributos privados para tudo (ou quase) e a criação de getters/setters de todos eles. Isso porque quando se vem de uma linguagem procedural se pode fazer tudo com todos os &#8220;atributos&#8221;, não existe encapsulamento e literalmente &#8220;todo mundo é de todo mundo&#8221;. Então tenta-se a criar (ou modificar) uma cultura. Se isso é certo ou não… é um jeito (e a maioria dos programadores em algum momento passam por essa fase, depois passamos a fase de nos livrar do hábito do excesso).</p>
<p>A identificação das necessidade da utilização desses metodozinhos vem com a experiência. É preciso saber identificar quando o usuário pode inserir um dado diretamente, quando ele pode ver um dado, quando ele pode inserir algum dado mas com restrições, quando você precisa saber se um dado é inserido, etc… Uma forma de saber isso antes de colocar a mão na massa é a modelagem. O código abaixo por exemplo é apenas uma maneira burocrática de &#8220;gerar uma variável pública&#8221;.</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> _sexo: <span style="color: #0066CC;">String</span>;
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> sexo<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">return</span> _sexo;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> sexo<span style="color: #66cc66;">&#40;</span>sexo:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    _sexo = sexo;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Então… Vamos modelar, modelar e modelar?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nyan.com.br/pt/2009/03/13/encapsulamento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
