<?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; Mario</title>
	<atom:link href="http://www.nusseagora.blog.br/tag/mario/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 – Parte 3</title>
		<link>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-3</link>
		<comments>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-3#comments</comments>
		<pubDate>Sun, 04 Oct 2009 23:01:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[máquina de estados]]></category>
		<category><![CDATA[Mario]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=768</guid>
		<description><![CDATA[Como prometido na parte 2 da série, esse é um exemplo de Diagrama de Transição de Estados do nosso código do Mario. O diagrama é simples, não há muito o que explicar: ele traz em colchetes os eventos que disparam a troca de estado, indicada pela seta. O início é o círculo preto e, o [...]]]></description>
			<content:encoded><![CDATA[<p>Como prometido na <a href="http://nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2/" target="_blank">parte 2</a> da série, esse é um exemplo de Diagrama de Transição de Estados do nosso código do Mario.</p>
<p><span id="more-768"></span>O diagrama é simples, não há muito o que explicar: ele traz em colchetes os eventos que disparam a troca de estado, indicada pela seta. O início é o círculo preto e, o fim,  o branco com o centro preto (também auto-explicativo).</p>
<p><span> </span></p>
<div id="attachment_769" class="wp-caption alignright" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/10/DiagramaDeEstados.jpg"><img class="size-thumbnail wp-image-769" title="DiagramaDeEstados" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/10/DiagramaDeEstados-150x150.jpg" alt="Diagrama de Transição de Estados" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Transição de Estados</p></div>
<p style="margin-right: 130pt; text-align: justify"><em>"E qual é a vantagem dele, Tiago?"</em> A vantagem é que, ao ver todo o funcionamento dos estados em uma única imagem, temos uma visão muito maior da sua lógica e podemos apontar erros. Identificamos, por exemplo, um "sumidouro": o estado TMarioInvencivel não muda para outro estado, sendo impossível a continuação da lógica após ele. Seguindo a lógica do jogo, deveríamos colocar um timer nele para controlasse quanto tempo podemos ficar invencíveis.Viu? Graças ao diagrama identificamos facilmente um beco sem saída na nossa lógica.</p>
<p><em>"Tá... mas e o TMarioFlorDeFogo?"</em> Então... colocá-lo no diagrama é um exercício para vocês <img src='http://www.nusseagora.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  .</p>
<p style="text-align: right;"><em>ps.: Desculpem pelo atraso na publicação do artigo, mas as coisas apertaram pro meu lado</em> _ _'</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Marios, Máquinas de Estados e o Padrão de Projetos State &#8211; Parte 2</title>
		<link>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2</link>
		<comments>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2#comments</comments>
		<pubDate>Sun, 27 Sep 2009 01:41:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[máquina de estados]]></category>
		<category><![CDATA[Mario]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=725</guid>
		<description><![CDATA[Antes de continuarem lendo, recomendo que dêem uma parada no artigo sobre o Princípio da Substituição de Liskov. Entender como podemos trocar uma classe mãe por uma filha (ou, no caso do State, uma Interface por uma Implementação) é quase todo o segredo por trás desse padrão de projetos e vai tornar muito maior o [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span>
<p style="margin-left: 70pt; text-align: justify">Antes de continuarem lendo, recomendo que dêem uma parada no artigo sobre o <a href="http://nusseagora.blog.br/principio-da-substituicao-de-liskov/">Princípio da Substituição de Liskov</a>. Entender como podemos trocar uma classe mãe por uma filha (ou, no caso do State, uma Interface por uma Implementação) é quase todo o segredo por trás desse padrão de projetos e vai tornar muito maior o entendimento do que vem pela frente. E não se esqueçam de voltar para o State quando terminarem de ler sobre Liskov!</span></p>
<p><span id="more-725"></span>Para iniciar o State, comecemos encapsulando todos os métodos que identificamos no artigo anterior como alteradores de estados e propagar esses métodos para nossos estados.</p>
<p>"<em>Não entendi nada, Tiago</em>". É simples: colocando na interface os métodos em comum aos estados, farei com que cada um desses estados tenha obrigatoriamente aqueles métodos principais da lógica da máquina de estados. Falando neles, a lista compreende:</p>
<ul>
<li> PegarCogumelo()</li>
<li> PegarEstrela()</li>
<li> PegarFlorDeFogo()</li>
<li> ReceberDano()</li>
</ul>
<p>Nossa interface fica simples assim:</p>
<pre class="brush:java">package Mario
{
	public interface IMario
	{
		function PegarCogumelo():IMario;
		function PegarEstrela():IMario;
		function PegarFlorDeFogo():IMario;
		function ReceberDano():IMario;
		function RetornarTipo():String;
	}
}</pre>
<p>Vejam que todo método vai, obrigatoriamente, retornar um objeto IMario. Para debug, coloquei também um método extra, o “RetornarTipo()”. Ele pode ser chamado pelo código para ver em qual estado o Mario está naquele momento. Após a criação da interface, precisamos agora implementá-la, criando nossos estados. Para quem não se lembra, são:</p>
<ul>
<li>Mario</li>
<li>Super Mario</li>
<li>Mario Flor de Fogo</li>
<li>Mario Invencível</li>
<li>Mario Morto</li>
</ul>
<p>Cada um desses estados é uma classe que implementa nossa interface <strong>IMario</strong>. Vamos então criar um? Prestem bastante atenção ao código:</p>
<pre class="brush:java">package Mario
{
	import Mario.IMario;

	public class TMario implements IMario
	{

		public function TMario(){}

		public function PegarCogumelo():IMario
		{
			trace("-- Mario pega um cogumelo!" +
				"Agora ele é um Super Mario --");
			return new TSuperMario();
		}

		public function PegarEstrela():IMario
		{
			trace("-- Mario pega um starman!" +
				"Agora ele é um Mario Invencível --");
			return new TMarioInvencivel();
		}

		public function PegarFlorDeFogo():IMario
		{
			trace("-- Mario pega uma fire flower!" +
				"Agora ele é um Mario Flor de Fogo --");
			return new TMarioFlorDeFogo();
		}

		public function ReceberDano():IMario
		{
			trace("-- Mario encosta em um" +
				"inimigo e morre! --");
			return new TMarioMorto();
		}

		public function RetornarTipo():String
		{
			return "normal";
		}
	}
}</pre>
<p>Notem que cada método que faz Mario mudar de Estado ou forma retorna seu novo Estado. Lembram da <strong>IMario</strong> com seus métodos que retornam objetos <strong>IMario</strong>? Então... Como os métodos nela<strong> </strong>tem que ser padrão para todos os estados mas são implementados de forma diferente nesses estados, utilizamos o tal Princípio da Substituição de Liskov (você leu, né?). Não entendeu? Bem,  quando nosso método retorna um IMario estamos dizendo para o compilador que o método vai retornar um objeto <strong>IMario</strong> ou um objeto que implemente <strong>IMario</strong>. Utilizando esse princípio, os métodos de mudança de estado poderão retornar qualquer estado que implemente IMario.</p>
<p>Interessante, não? Nosso código fica extremamente manutenível, tornando a adição de um novo estado uma coisa muito fácil. Compare agora com o funcionamento de TSuperMario:</p>
<pre class="brush:java">package Mario
{
	import Mario.IMario;

	public class TSuperMario implements IMario
	{
		public function TSuperMario(){}

		public function PegarCogumelo():IMario
		{
			trace("-- Super Mario pega um cogumelo," +
				"mas nada acontece com ele --");
			return this;
		}

		public function PegarFlorDeFogo():IMario
		{
			trace("-- Mario pega uma fire flower!" +
			        "Agora ele é um Mario Flor de Fogo --");
			return new TMarioFlorDeFogo();
		}

		public function PegarEstrela():IMario
		{
			trace("-- Super Mario pega uma estrela!" +
				"Agora ele é Mario Invencível --");
			return new TMarioInvencivel();
		}

		public function ReceberDano():IMario
		{
			trace("-- Super Mario encosta em um inimigo." +
				"Ele volta a ser Mario --");
			return new TMario();
		}

		public function RetornarTipo():String
		{
			return "super";
		}
	}
}</pre>
<p>Viram? Alguns métodos (como <strong>PegarCogumelo() </strong>e <strong>ReceberDano() </strong>), nesse estado, retornam objetos diferentes, mas que implementam a mesma interface! Temos até um <strong>return this</strong> significando que o objeto não mudou de estado naquele método, mas como <strong>this</strong> também implementa a interface <strong>IMario</strong>, não dá problema algum. Começaram a ver a tabela da 1ª parte sendo implementada, não?</p>
<p>Para poupar espaço, não colocarei o código de todos os estados. Basta ter a implementação de um para entendermos como as coisas estão acontecendo. Além disso, o projeto em Actionscript 3.0 está disponível para download no final do artigo. O importante agora é nos focarmos na nossa classe principal, a TMain.</p>
<pre class="brush:java">public class TMain extends MovieClip
	{
		public function TMain()
		{
			var mario:IMario;

			//Qual é o estado inicial do Mario? ...
			// ... troque-o e veja.que o programa...
			// ... se comportará de forma...
			// ... completamente diferente!
			mario = new TMario();

			// O Mario (ainda no estado anterior)
			// pega um cogumelo
			mario = mario.PegarCogumelo();

			// O Mario (ainda no estado anterior) ...
			//  ... recebe dano
			mario = mario.ReceberDano();

			// O Mario (ainda no estado anterior) ...
			//  ... pega outro cogumelo
			mario = mario.PegarCogumelo();

			// O Mario (ainda no estado anterior) ...
			//  ...  pega uma Fire Flower
			mario = mario.PegarFlorDeFogo();

			// O Mario (ainda no estado anterior) ...
			//  ...  pega um starman
			mario = mario.PegarEstrela();

			// O Mario (ainda no estado anterior) ...
			//  ...  encosta em um inimigo
			mario = mario.ReceberDano();

			// O Mario (ainda no estado anterior) ...
			//  ...  encosta em um inimigo
			mario = mario.ReceberDano();

			// O Mario (ainda no estado anterior) ...
			//  ...  encosta em um inimigo
			mario = mario.ReceberDano();

			trace("-- No final, o Mario é um mario "
     				 + mario.RetornarTipo() +" --");
		}
	}
}</pre>
<p>Na nossa main, basta criar um objeto do tipo inicial (no exemplo acima comecei o "jogo" como <strong>TMario</strong>) e, no decorrer do percurso, realizar as chamadas aos métodos respectivos. O código acima retorna para mim:</p>
<pre>-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Super Mario encosta em um inimigo. Ele volta a ser Mario --
-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Mario pega uma fire flower! Agora ele é um Mario Flor de Fogo --
-- Mario pega um starman! Agora ele é um Mario Invencível --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- No final, o Mario é um mario invencível --</pre>
<p><em>"Tá Tiago, esse trabalho todo prá q?"</em> Esse trabalho todo traz os seguintes benefícios:</p>
<ol>
<li>O código fica muito mais simples de entender sem ifs e cases aninhados uns dentro dos outros.</li>
<li>Simplifica a adição de um novo estado simplesmente fazendo com que ele implemente a interface base.</li>
<li>Modifica o funcionamento do sistema sem que haja a necessidade de prévia programação.</li>
</ol>
<p><em>"Não entendi a 3a coisa da lista, Tiago. Como assim 'modifica o funcionamento'?" </em>Se você trocaro estado inicial ou a chamada a um método, toda a linha de funcionamento do programa poderá ser modificada com o mínimo esforço. Olha o que acontece, por exemplo, se eu não quiser que o Mario pegue a estrela:</p>
<pre>-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Super Mario encosta em um inimigo. Ele volta a ser Mario --
-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Mario pega uma fire flower! Agora ele é um Mario Flor de Fogo --
-- Mario encosta em um inimigo! Ele vira um Mario --
-- Mario encosta em um inimigo e morre! --
-- No final, o Mario é um mario morto --</pre>
<p>Ou então, mais engraçado, caso ele comece já invencível:</p>
<pre>-- Mario Invencível pega um cogumelo! Ele continua sendo o Mario Invencível--
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível pega um cogumelo! Ele continua sendo o Mario Invencível--
-- Mario pega uma fire flower! Ele continua sendo o Mario Invencível --
-- Mario Invencível pega uma estrela, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- No final, o Mario é um mario invencível --</pre>
<p>Como podemos ver, nosso "jogo" está flexível para qualquer possível acontecimento no decorrer de uma fase: basta que o evento esteja previamente mapeado pela nossa máquina de estados. Existem outras implementações do padrão State, sendo a mais comum o encapsulamento do estado dentro da classe <strong>TMario</strong>. Essa implementação é um pouco mais complexa, mas faz com que trabalhemos o tempo todo com um objeto do tipo <strong>TMario </strong>(e não uma interface <strong>IMario</strong> que, no decorrer da execução do programa, muda seu tipo dependendo do estado atual). No fim, o resultado é o mesmo.</p>
<p>Na próxima parte, vou mostrar para vocês como fica o <a href="http://nusseagora.blog.br/raios-e-uml-parte-3/" target="_blank">Diagrama de Transição de Estados</a> disso aí. E, para fechar, não se esqueçam de pegar o código em Actionscript 3.0 aqui:</p>
<p style="text-align: right;">[download id="2"]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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>

