<?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; template method</title>
	<atom:link href="http://blog.nyan.com.br/pt/tag/template-method/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>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>
	</channel>
</rss>
