<?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>Nuss... E Agora?!? &#187; state</title>
	<atom:link href="http://www.nusseagora.blog.br/tag/state/feed" rel="self" type="application/rss+xml" />
	<link>http://www.nusseagora.blog.br</link>
	<description></description>
	<lastBuildDate>Fri, 04 Feb 2011 12:56:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Marios, Máquinas de Estados e o Padrão de Projetos State &#8211; Parte 1</title>
		<link>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-1</link>
		<comments>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-1#comments</comments>
		<pubDate>Sat, 19 Sep 2009 20:27:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Gerência de Projetos]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[máquina de estados]]></category>
		<category><![CDATA[Mario]]></category>
		<category><![CDATA[state]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=712</guid>
		<description><![CDATA[Pense em um jogo onde o seu personagem muda de habilidades no decorrer da aventura. Não importa se pegando itens ou ganhando poderes especiais, o importante é que saibamos o quanto de trabalho isso dá para a programação. “Ué Tiago, não é só criar as classes de cada um desses poderes especiais e ir transformando [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify">Pense em um jogo onde o seu personagem muda de habilidades no decorrer da aventura. Não importa se pegando itens ou ganhando poderes especiais, o importante é que saibamos o quanto de trabalho isso dá para a programação. <em>“Ué Tiago, não é só criar as classes de cada um desses poderes especiais e ir transformando o personagem em outro objeto?”</em></p>
<p><em><span id="more-712"></span></em>Na realidade, isso é só o início dos nossos problemas. Quer ver só: vamos pensar no Mario. Em um jogo clássico como o Super Mario Bros. ele tem as seguintes formas: Mario, Super Mario (quando pega um Super Mushroom), Mario Flor de Fogo (quando pega uma Fire Flower), Mario Invencível (quando pega um Starman) e, claro, Mario Morto, quando ele morre. Para que isso funcione, o Mario precisa de um conjunto de ações simples: <em>Pegar Cogumelo</em>, <em>Pegar Starman</em>, <em>Pegar Fire Flower,</em> e, como nem tudo é perfeito, ele também tem que poder, <em>Encostar em um inimigo.</em></p>
<p><em>“E o que isso tem a ver?”</em> Se você ainda não percebeu, cada um dessas formas do Mario tem o mesmo conjunto de ações: seja um Mario, um Mario Flor de Fogo ou qualquer outra forma de Mario, todos têm que poder encostar em um inimigo, pegar um cogumelo, um starman ou uma fire flower. O que muda é o comportamento daquela forma de Mario perante aquela ação. Não entendeu? Bom... enquanto <strong>Mario</strong> <strong>encosta em um inimigo</strong> e <strong>morre</strong>, <strong>Super Mario encosta em um inimigo</strong> e <strong>volta a ser Mario</strong>. A mesma ação (encostar em um inimigo) engatilha 2 ações diferentes (<strong>Virar Mario Morto</strong> e <strong>Virar Mario</strong>).</p>
<p>Mapeando todas essas relações entre as formas do Mario temos...</p>
<table style="height: 269px;" border="1" cellspacing="0" cellpadding="0" width="544">
<tbody>
<tr>
<td width="115" valign="top">
<p align="center">
</td>
<td width="115" valign="top">
<p align="center"><strong>Pegar<br />
Cogumelo</strong></p>
<p align="center"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/super-mushroom.png"><img class="size-full wp-image-714" title="super-mushroom" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/super-mushroom.png" alt="Super Mushroom" width="90" height="90" /></a></p>
</td>
<td width="115" valign="top">
<p align="center"><strong>Pegar<br />
Starman</strong></p>
<p style="text-align: center;" align="center"><strong><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/starman.png"><img class="size-full wp-image-715 aligncenter" title="starman" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/starman.png" alt="starman" width="90" height="90" /></a><br />
</strong></td>
<td width="115" valign="top">
<p align="center"><strong>Pegar<br />
Fire Flower</strong></p>
<p align="center"><strong><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/fire-flower.png"><img class="aligncenter size-full wp-image-716" title="fire-flower" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/fire-flower.png" alt="fire-flower" width="90" height="90" /></a><br />
</strong></td>
<td width="115" valign="top">
<p align="center"><strong>Encostar em<br />
um Inimigo</strong></p>
<p align="center"><strong><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/bob-omb.png"><img class="aligncenter size-full wp-image-717" title="bob-omb" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/bob-omb.png" alt="bob-omb" width="90" height="90" /></a><br />
</strong></td>
</tr>
<tr>
<td width="115" valign="top">
<p align="center"><strong>Mario</strong></p>
</td>
<td width="115">
<p align="center">Super Mario</p>
</td>
<td width="115">
<p align="center">Mario<br />
Invencível</td>
<td width="115">
<p align="center">Mario Flor<br />
de Fogo</td>
<td width="115">
<p align="center">Mario Morto</p>
</td>
</tr>
<tr>
<td width="115" valign="top">
<p align="center"><strong>Super<br />
Mario</strong></td>
<td width="115">
<p align="center">Super Mario</p>
</td>
<td width="115">
<p align="center">Mario<br />
Invencível</td>
<td width="115">
<p align="center">Mario Flor<br />
de Fogo</td>
<td width="115">
<p align="center">Mario</p>
</td>
</tr>
<tr>
<td width="115" valign="top">
<p align="center"><strong>Mario<br />
Flor de Fogo</strong></td>
<td width="115">
<p align="center">Mario<br />
Flor de Fogo</td>
<td width="115">
<p align="center">Mario<br />
Invencível</td>
<td width="115">
<p align="center">Mario Flor<br />
de Fogo</td>
<td width="115">
<p align="center">Mario</p>
</td>
</tr>
<tr>
<td width="115" valign="top">
<p align="center"><strong>Mario<br />
Invencível</strong></td>
<td width="115">
<p align="center">Mario<br />
Invencível</td>
<td width="115">
<p align="center">Mario<br />
Invencível</td>
<td width="115">
<p align="center">Mario<br />
Invencível</td>
<td width="115">
<p align="center">Mario<br />
Invencível</td>
</tr>
<tr>
<td width="115" valign="top">
<p align="center"><strong>Mario Morto</strong></p>
</td>
<td width="115">
<p align="center">Mario Morto</p>
</td>
<td width="115">
<p align="center">Mario Morto</p>
</td>
<td width="115">
<p align="center">Mario Morto</p>
</td>
<td width="115">
<p align="center">Mario Morto</p>
</td>
</tr>
</tbody>
</table>
<p>Na 1a coluna, temos os estados iniciais. A 1a linha tem as ações e o corpo da tabela é a forma que o Mario assume após aquele evento. Por exemplo, <strong>Mario</strong> pega um <strong>cogumel</strong>o e vira <strong>Super Mario</strong>. Esse mapeamento de troca de formas é o que chamamos de <strong>Máquina de Estados:</strong> ela indica quais formas aquele objeto tem (o que chamamos de <strong>estado</strong>), quais ações aquele estado pode realizar e qual novo estado ele vai assumir após realizar tal ação.<em> </em></p>
<p>Quem joga os jogos do Mario sabe que, na realidade, o estado Mario Invencível depende do estado onde o Mario estava anteriormente. Então teríamos além de <strong>Mario Invencível</strong>, as formas <strong>Super Mario Invencível</strong> e <strong>Mario Flor de Fogo Invencível</strong>... Olhe como adicionar essa simples característica aumenta muito nossa complexidade: no nosso exemplo, temos <strong>4 ações x 5 formas =</strong> <strong>20 métodos</strong> a serem implementados. Aumentar 3 estados significaria passar para <strong>4 ações x 7 formas = 28 métodos.</strong></p>
<p><em>“Até aí tudo bem</em>, <em>Tiago!”</em> Sim, mas o problema vem agora: também precisamos saber qual ação foi executada e em qual forma o Mario estava. Para fazer isso, precisaríamos de um conjunto imenso de testes aninhados que fariam, para cada ação:</p>
<pre>Se o jogador pegou um Cogumelo:
    está na forma Mario, troque para a forma Super Mario
    está na forma Super Mario, mantenha-se como Super Mario;
    está na forma Fire Flower Mario, mantenha-se como Fire Flower Mario;
    está na forma Mario Invencível, mantenha-se como Mario Invencível;
    está na forma Mario Morto, mantenha-se como Mario Morto;</pre>
<p>... muito trabalho, né não? Além disso, para cada uma dessas novas formas, teríamos que ir nesse conjunto de testes aninhados para adicionar as novas regras. Estruturas mais complexas seriam tão trabalhosas de gerenciar que se tornariam inviáveis. Essa complexidade crescente é das grandes vilãs quando trabalhamos com estados: a cada estado adicionado temos que mapear todas as relações entre ele e os estados já existentes programando suas relações.</p>
<p>Para resolver esse problema de manutenibilidade, utilizamos o Padrão de Projetos State (ou “Estado”). No próximo artigo implementaremos essa Máquina de Estados do Mario. Então, até lá!</p>
<p style="text-align: right;">Imagens de <em><a href="http://mario.wikia.com">http://mario.wikia.com</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-1/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

