<?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; Análise de Sistemas</title>
	<atom:link href="http://www.nusseagora.blog.br/category/analise-de-sistemas/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>Padrão de Projetos Observer: Implementando mísseis teleguiados – parte 2</title>
		<link>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2</link>
		<comments>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2#comments</comments>
		<pubDate>Sun, 29 Nov 2009 13:00:35 +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[Actionscript 3.0]]></category>
		<category><![CDATA[Observer]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=839</guid>
		<description><![CDATA[Como prometido na 1ª parte do artigo sobre o padrão de projetos Observer, hoje vamos implementá-lo. O nosso escopo é bem simples: temos um jato que foge de mísseis teleguiados. Durante a perseguição, o jato deve poder mudar de direção e os mísseis devem responder a essa mudança adequadamente para não perderem seu alvo. Primeiramente, [...]]]></description>
			<content:encoded><![CDATA[<p>Como prometido na <a href="http://nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1/" target="_self">1ª parte do artigo sobre o padrão de projetos Observer</a>, hoje vamos implementá-lo. O nosso escopo é bem simples: <strong>temos um jato que foge de mísseis teleguiados. Durante a perseguição, o jato deve poder mudar de direção e os mísseis devem responder a essa mudança adequadamente para não perderem seu alvo.</strong></p>
<p><strong><span id="more-839"></span></strong>Primeiramente, nossa implementação do Observer terá 2 interfaces:</p>
<p>-        <em>IObserver</em>, implementada por todos os observadores que devem responder às mudanças no Sujeito</p>
<p>-        <em>ISubject.</em> Implementada pelo Sujeito Observado.</p>
<p><em> </em></p>
<p>Trabalhar com essas interfaces simplifica muito a manutenção do código graças ao <a href="http://nusseagora.blog.br/principio-da-substituicao-de-liskov/" target="_blank">princípio da substituição de Liskov</a> como veremos no final do artigo. Por enquanto, continuaremos com a implementação.</p>
<p>Nossa interface <em>IObserver </em>terá somente o método <em>Atualizar(direcao:String):void. </em>Esse é o único método que todos os outros observadores do meu sistema deverão ter. <em>"E o que ele faz, Tiago?"</em> Esse é o método que atualiza a direção do Observador baseado na direção que o Sujeito Observado tomar em um dado instante.</p>
<pre class="brush:java">package Observer

{
	public interface IObserver
	{
		function Atualizar(direcao:String):void;
	}
}</pre>
<p>Nossos Sujeitos, porém, terão outras funcionalidades: <em>ISubject</em> deverá ter um método para registrar novos observadores e um outro para notificá-los sobre as mudanças de direção.</p>
<pre class="brush:java">package Observer

{
	import Observer.IObserver;

	public interface ISubject
	{
		function RegistrarObservador(observador:IObserver):void;
		function NotificarObservador():void;
	}
}</pre>
<p>Esse é nosso jato, um sujeito observado pelos mísseis teleguiados. Notem que, por ser um sujeito, ele obrigatoriamente deve implementar a interface <em>ISubject</em> que criamos e, consequentemente, também seus métodos.</p>
<pre class="brush:java">package Observer
{

	public class TJato implements ISubject
	{
		private var _observadores:Array;
		private var _direcao:String;

		public function TJato(direcao:String)
		{
		this._observadores = new Array();
		this._direcao = direcao;
		}

/***************************************************************

Adiciona um observador à coleção de observadores do sujeito  ...

... observado, para que ele possa notificá-los quando seu    ...

... estado mudar.

Por ser passado um objeto IObservador, TODA E QUALQUER...

... CLASSE pode se tornar um observador, desde que ...

... implemente a interface IObserver.

****************************************************************/

		public function RegistrarObservador(observador:IObserver):void
		{
			// Adiciono um observador à lista...
			this._observadores.push(observador);

			// ... e aviso a todo mundo quem foi registrado
			trace ("observador registrado: "+ observador);
		}

/***************************************************************

Varre a coleção de observadores, enviando à eles o novo estado.

... Utiliza a metodologia de empurrar dados observados.

****************************************************************/

		public function NotificarObservador():void
		{
			for(var i:int=0; i&lt;this._observadores.length; i++)
			this._observadores[i].Atualizar(this._direcao);
		}

/***************************************************************

Retorna a direção para onde o Jato está voando

****************************************************************/

		public function RetornarDirecao():String
		{
			return this._direcao;
		}

/***************************************************************

Modifica a direção do Jato para uma nova direção

****************************************************************/

		public function ModificarDirecao(direcao:String):void
		{
			this._direcao=direcao;
			this.NotificarObservador();
		}
	}
}</pre>
<p>O míssil terá somente esses 2 métodos. Note que eles são passivos, fazendo com que o funcionamento da classe dependenda exclusivamente do que é passado para ela.</p>
<pre class="brush:java">package Observer
{

	public class TMissil implements IObserver
	{
		private var _direcao:String;

		public function TMissil(direcao:String)
		{
			this._direcao = direcao;
		}

/***************************************************************
Atualiza a direção para onde o Míssil está indo
****************************************************************/

		public function Atualizar(direcao:String):void
		{
			this._direcao = direcao;
		}

/***************************************************************
Retorna a direção para onde o Míssil está voando
****************************************************************/

		public function RetornarDirecao():String
		{
			return this._direcao;
		}
	}
}</pre>
<p>Por fim, nossa classe principal, a TMain. Nela vamos realizar uma sequência de testes da funcionalidade do Observer.</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Observer.IObserver;
	import Observer.ISubject;
	import Observer.TJato;
	import Observer.TMissil;
	import Observer.THelicoptero;

	public class TMain extends MovieClip
	{
		private var _jato:TJato;
		private var _missil1:TMissil;
		private var _missil2:TMissil;

		private var _helicoptero:THelicoptero;

		public function TMain()
		{
			//Inicia a direção do Jato e dos mísseis
			this._jato = new TJato("CIMA");
			this._missil1 = new TMissil("BAIXO");
			this._missil2 = new TMissil("PARADO");

			//Exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );

			//Como os mísseis devem observar o ...
			//... comportamento do jato,...
			//... eles são registrados como...
			//... observadores do jato.

			trace("---------------------------------------------------------");

			trace ("Registrando observadores");
			this._jato.RegistrarObservador(this._missil1);
			this._jato.RegistrarObservador(this._missil2);

			trace("---------------------------------------------------------");

			trace("modificando a direção do jato prá BAIXO");

			//Altera a direção do jato...
			this._jato.ModificarDirecao("BAIXO");

			//... e exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );

			/*
			Caso um desenvolvedor queira estender a ...
			... funcionalidade do programa ...
			... adicionando um novo tipo de
			... observador, ele pode fazê-lo sem   ...
			... a necessidade de mexer no código atual.
			Para isso, basta ...
			... adicionar sua nova classe ...
			... (THelicoptero, nesse caso), fazê-la ...
			... implementar a interface IObserver ...
			... e adicioná-lo à lista de ...
			... chamadas de objetos de perseguição.
			Veja no exemplo abaixo:
			*/

			trace("---------------------------------------------------------");
			trace("Registrando observadores");

			//O Helicóptero entra na perseguição ...
			this._helicoptero = new THelicoptero("LESTE");
			// ... sendo registrado também como observador
			this._jato.RegistrarObservador(this._helicoptero);

			trace("---------------------------------------------------------");

			//Altera a direção do jato...
			trace("modificando a direção do jato prá CIMA");
			this._jato.ModificarDirecao("CIMA");

			//... e exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );
			trace( "Direção do helicóptero: "
				  + this._helicoptero.RetornarDirecao() );
		}
	}
}</pre>
<p>A saída desse código é a seguinte:</p>
<pre>Direção do jato: CIMA
Direção do míssil 1: BAIXO
Direção do míssil 2: PARADO
---------------------------------------------------------
Registrando observadores
observador registrado: [object TMissil]
observador registrado: [object TMissil]
---------------------------------------------------------
modificando a direção do jato prá BAIXO
Direção do jato: BAIXO
Direção do míssil 1: BAIXO
Direção do míssil 2: BAIXO
---------------------------------------------------------
Registrando observadores
observador registrado: [object THelicoptero]
---------------------------------------------------------
modificando a direção do jato prá CIMA
Direção do jato: CIMA
Direção do míssil 1: CIMA
Direção do míssil 2: CIMA
Direção do helicóptero: CIMA</pre>
<p><em>"Mas Tiago... Que helicóptero foi aquele ali no meio do código?" </em>Ah é... enquanto estávamos fazendo o código, um outro desenvolvedor achou que helicópteros também são maneiros em perseguições e resolveu implementar um. Notaram como foi fácil adicioná-lo? Bastou que ele implementasse a <em>IObserver</em> que o princípio de Liskov tomou conta do resto. Caso eu queria mais de um Sujeito observado, minha nova classe implementará <em>ISubject</em>. Dessa forma, <strong>adicionar observadores ou sujeitos não implica em modificação alguma no código que já estava pronto.</strong></p>
<p><em>“Outra coisa: e se um observador não quiser mais ser avisado sobre as mudanças do sujeito?”</em> Para isso, a <em>IObserver</em> deverá ter um método <em>removerObservador (observador:IObserver) : void; </em>que vai varrer a lista de observadores e retirá-lo de lá. Isso fica como exercício para quem quiser continuar estudando o padrão.</p>
<p>Na próxima - e última - parte do artigo, disponibilizarei o projeto em AS3.0 e o diagrama de Classes disso tudo ae. Então, até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fazendo seu projeto Cair na Real com o Getting Real</title>
		<link>http://www.nusseagora.blog.br/fazendo-seu-projeto-cair-na-real-com-getting-real</link>
		<comments>http://www.nusseagora.blog.br/fazendo-seu-projeto-cair-na-real-com-getting-real#comments</comments>
		<pubDate>Sun, 08 Nov 2009 13:56:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Gerência de Projetos]]></category>
		<category><![CDATA[Leitura recomendada]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Caindo na Real]]></category>
		<category><![CDATA[Getting Real]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=821</guid>
		<description><![CDATA[E, de repente, me surge um eMail na empresa mandado pelo Diego Botelho. Ele tinha um link para um artigo no iMasters que, por sua vez, falava de como desenvolver aplicações para a web com o Flex. Esse artigo falava sobre um livro... um tal de Getting Real. E então, tudo mudou. Como falei com [...]]]></description>
			<content:encoded><![CDATA[<p>E, de repente, me surge um eMail na empresa mandado pelo <a href="http://www.diegobotelho.com.br/" target="_blank">Diego Botelho</a>. Ele tinha um link para <a href="http://imasters.uol.com.br/artigo/14430/flex/criando_sistemas_reais_com_flex_%E2%80%93_parte_01/" target="_blank">um artigo no iMasters</a> que, por sua vez, falava de como desenvolver aplicações para a web com o Flex. Esse artigo falava sobre um livro... um tal de <a href="https://gettingreal.37signals.com/" target="_blank">Getting Real</a>. E então, tudo mudou.</p>
<p><span id="more-821"></span>Como falei com o <a href="http://gamedesign.agilonline.info/" target="_blank">Adauto</a>, o Getting Real <em>"é a coisa mais genial que eu li sobre gerência de projetos nos últimos 8 anos. É tão genial q chega a assustar."</em> Ele vai diretamente contra tudo que a teoria nos empurra a fazer. O livro não passa de uma coletânea de práticas e estudos de caso do desenvolvimento dos produtos da <a href="http://37signals.com/" target="_blank">37signals</a>, uma empresa de chicago que está no mercado desde 1999 fazendo software web. Por mais idiota que isso possa parecer (e, à primeira vista, ISSO PARECE), a 37signals produz softwares que, intencionalmente, FAZEM MENOS QUE A CONCORRÊNCIA. Antes de você desistir de continuar lendo saiba que são eles por trás do framework <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>...</p>
<p>O próprio livro se define assim:</p>
<ul>
<blockquote>
<li>(<em>Getting Real</em>) é sobre pular todas as coisas que representam a realidade (cartas, gráficos, caixas, setas, esquemas, wireframes, etc.) e realmente construir a coisa real.</li>
<li>(<em>Getting Real</em>) é menos. Menos massa, menos software, menos funcionalidades, menos papéis, menos tudo que não é essencial (e a maioria do que você pensa ser essencial realmente não é).</li>
<li>(<em>Getting Real</em>) é permanecer pequeno e ser ágil.</li>
<li>(<em>Getting Real</em>) inicia com a construção da interface, ou seja, as telas reais que as pessoas irão utilizar. Começa com as experiências reais dos clientes, construindo a partir disso para trás. Dessa forma você obtém a interface adequada antes de obter um software errado.</li>
</blockquote>
</ul>
<p><em>"Ah Tiago. Essa parada ae é de desenvolvimento de sistemas na web. Eu só quero fazer um jogo. Prá quê você me manda ler isso?".</em> Pois o Getting Real é justamente isso: cair na real, limpar tudo aquilo com o que você NÃO precisa gastar tempo agora e deixar para pensar no futuro. É sobre não pensar agora em resolver um problema que ainda não é um problema. É sobre não perder incontáveis dias otimizando uma rotina que só vai precisar ser otimizada quando você tiver 500 usuários ao mesmo tempo. É sobre <a href="http://nusseagora.blog.br/design-inchado-voce-esta-fazendo-seu-primeiro-jogo-nao-seu-ultimo/" target="_blank">não inchar o seu design, enxugar seu escopo</a>, <a href="http://nusseagora.blog.br/talvez-normalizar-nao-seja-normal/" target="_blank">fugir da febre dos padrões e fazer SOMENTE o necessário para que seu projeto funcione com a qualidade que ele exige no momento</a>.  Essas dicas, apesar de voltadas para uma aplicação web, são absolutamente verdadeiras para diversos outros tipos de projetos. Além disso, sua idéia principal pode ser adotada em todo e qualquer tipo projeto, seja de software ou não. Vai depende somente da forma com que a empresa encara eles.</p>
<p>Falando em empresas, As desenvolvedoras de jogos online já utilizam tais conceitos há anos: lançam <a href="http://nusseagora.blog.br/atualizacao-inteligente-e-o-que-ha/" target="_blank">atualizações constantes para seus jogos</a>, aumentando gradativamente sua complexidade, começando a subir uma escada lá debaixo no primeiro degrau. Além disso, fazem correções de bugs críticos em tempo real, horas após sua descoberta. No final, o produto cresce naturalmente e não só ao trocar de pele: você se preocupa com pequenos problemas por vez, faz pequenos designs por vez, implementa pequenas novidades  por vez e tira pequenas funcionalidades por vez, tudo constantemente, em pequenos períodos por vez.</p>
<p>O Getting Real vai muito além de qualquer livro de gerência de projetos. Ele é uma coletânea de dicas que se torna seu livro de cabeceira já nos primeiros 15 minutos de leitura, daqueles que você não vai deixar de mostrar para todo mundo. E não tem essa de desculpa para não ler: ele é fácil, rápido, direto, tem <a href="http://gettingreal.37signals.com/GR_por.php" target="_blank">versão em português muito bem traduzida e, ainda por cima, gratuita para ler na net</a>. Tá esperando o quê para Cair na Real também?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/fazendo-seu-projeto-cair-na-real-com-getting-real/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<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>
		<item>
		<title>O que raios é a UML – Parte 3</title>
		<link>http://www.nusseagora.blog.br/raios-e-uml-parte-3</link>
		<comments>http://www.nusseagora.blog.br/raios-e-uml-parte-3#comments</comments>
		<pubDate>Sun, 13 Sep 2009 01:47:49 +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[Jogos]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Unified Modelling Language]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=637</guid>
		<description><![CDATA[Como pedido pelo Alexandre Ceni na 2a parte da micro-série sobre a UML, a 3a parte consiste em exemplos gráficos dos diagramas previamente citados.  Os diagramas que não fazem parte do Nuss... E agora?!? são da wikipedia. Essa página vai estar em constante modificação, pois vou substituindo os diagramas da wikipedia por aqueles que forem [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify">Como pedido pelo Alexandre Ceni na <a href="http://nusseagora.blog.br/raios-e-uml-–-parte-2/" target="_blank">2a parte da micro-série sobre a UML</a>, a 3a parte consiste em exemplos gráficos dos diagramas previamente citados.  Os diagramas que não fazem parte do Nuss... E agora?!? são da <a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language" target="_blank">wikipedia</a>. Essa página vai estar em constante modificação, pois vou substituindo os diagramas da wikipedia por aqueles que forem pintando nos artigos aqui. Não é foco do artigo  ensinar como desenvolver tais diagramas, até porque isso  é assunto para futuros artigos. Portanto, vamos a eles?</p>
<p><span id="more-637"></span></p>
<ul>
<li><strong>Diagramas Estruturais (ou de estrutura)</strong></li>
</ul>
<p><em> </em></p>
<table border="0" width="100%">
<tbody>
<tr>
<div id="attachment_64" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2008/04/padroes-de-projeto-questao-de-bom-senso2.jpg"><img class="size-thumbnail wp-image-64" title="Jogo de tabuleiro v2" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2008/04/padroes-de-projeto-questao-de-bom-senso2.thumbnail.jpg" alt="Jogo de tabuleiro v2" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Classes</p></div>
<div id="attachment_640" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/08/Pacotes.jpg"><img class="size-thumbnail wp-image-640" title="Diagrama de Pacotes" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/08/Pacotes-150x150.jpg" alt="Pacotes" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Pacotes</p></div>
<div id="attachment_692" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/EstruturaComposta.jpg"><img class="size-thumbnail wp-image-692" title="EstruturaComposta" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/EstruturaComposta-150x144.jpg" alt="Diagrama de Estrutura Composta" width="150" height="144" /></a><p class="wp-caption-text">Diagrama de Estrutura Composta</p></div></tr>
<tr>
<p><div id="attachment_689" class="wp-caption alignleft" style="width: 160px"><span style="text-decoration: underline;"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Objetos.jpg"><img class="size-thumbnail wp-image-689" title="Objetos" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Objetos-150x144.jpg" alt="Diagrama de Objetos" width="150" height="144" /></a></span><p class="wp-caption-text">Diagrama de Objetos</p></div>
<div id="attachment_691" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Componentes.jpg"><img class="size-thumbnail wp-image-691" title="Componentes" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Componentes-150x150.jpg" alt="Diagrama de Componentes" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Componentes</p></div>
<ul><span style="text-decoration: underline;"></p>
<div id="attachment_690" class="wp-caption alignleft" style="width: 160px"><span style="text-decoration: underline;"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Instalacao.jpg"><img class="size-thumbnail wp-image-690" title="Instalacao" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Instalacao-150x150.jpg" alt="Diagrama de Instalação" width="150" height="150" /></a></span><p class="wp-caption-text">Diagrama de Instalação</p></div>
<p></span></ul>
</tr>
</tbody>
</table>
<ul>
<li><strong>Diagramas Comportamentais (ou de comportamento)</strong></li>
</ul>
<table border="0" width="100%">
<tbody>
<tr>
<div id="attachment_685" class="wp-caption alignleft" style="width: 160px"><span style="text-decoration: underline;"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/CasosDeUso.jpg"><img class="size-thumbnail wp-image-685" title="CasosDeUso" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/CasosDeUso-150x139.jpg" alt="Diagrama de Casos de Uso" width="150" height="139" /></a></span><p class="wp-caption-text">Diagrama de Casos de Uso</p></div>
<div id="attachment_686" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Atividades.jpg"><img class="size-thumbnail wp-image-686" title="Atividades" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Atividades-150x150.jpg" alt="Diagrama de Atividades" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Atividades</p></div>
<div id="attachment_687" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/TransicaoDeEstados.jpg"><img class="size-thumbnail wp-image-687" title="TransicaoDeEstados" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/TransicaoDeEstados-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></tr>
</tbody>
</table>
<ul>
<li><strong>Diagramas de Interação</strong></li>
</ul>
<table border="0" width="100%">
<tbody>
<tr>
<p><div id="attachment_639" class="wp-caption alignleft" style="width: 160px"><strong><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/08/Sequencia.jpg"><img class="size-thumbnail wp-image-639" title="Sequencia" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/08/Sequencia-150x150.jpg" alt="Diagrama de Sequencia" width="150" height="150" /></a></strong><p class="wp-caption-text">Diagrama de Sequencia</p></div>
<div id="attachment_697" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Comunicacao.jpg"><img class="size-thumbnail wp-image-697" title="Comunicacao" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Comunicacao-150x150.jpg" alt="Diagrama de Comunicação" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Comunicação</p></div>
<p><div id="attachment_698" class="wp-caption alignleft" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Interacao.jpg"><img class="size-thumbnail wp-image-698" title="Interacao" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/09/Interacao-150x150.jpg" alt="Diagrama de Interação" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Interação</p></div></tr>
</tbody>
</table>
<p>Lembrem-se: saber entender os diagramas  é extremamente importante para o desenvolvimento de software: eles são uma forma de descrever exatamente o que você pretende e evitar problemas de comunicação entre os programadores e analistas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/raios-e-uml-parte-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>O que raios é a UML &#8211; Parte 1</title>
		<link>http://www.nusseagora.blog.br/o-que-raios-e-a-uml-parte-1</link>
		<comments>http://www.nusseagora.blog.br/o-que-raios-e-a-uml-parte-1#comments</comments>
		<pubDate>Thu, 13 Aug 2009 01:29:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Jogos]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[Unified Modelling Language]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=546</guid>
		<description><![CDATA[“Tiago, você fala tanto sobre a UML, já falou de Casos de Uso, já mostrou diagramas e mais diagramas, mas até agora não disse: o que raios é a UML?” UML é uma sigla para Unified Modelling Language. Em português, isso pode ser traduzido como Linguagem de Modelagem Unificada. Ou, simplificando, um conjunto de padrões [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify"><em>“Tiago, você fala tanto sobre a UML, já falou de <a href="http://nusseagora.blog.br/casos-de-uso-mas-hein/" target="_blank">Casos de Uso</a>, já <a href="http://nusseagora.blog.br/orientacao-a-objetos-q-raios-e-isso-parte-2/" target="_blank">mostrou diagramas</a> e <a href="http://nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%E2%80%93-parte-2/" target="_blank">mais diagramas</a>, mas até agora não disse: o que raios é a UML?”</em></p>
<p><em> </em></p>
<p><em><span id="more-546"></span></em>UML é uma sigla para <em>Unified Modelling Language</em>. Em português, isso pode ser traduzido como <em>Linguagem de Modelagem Unificada</em>. Ou, simplificando, um conjunto de padrões de desenho para que você possa modelar um problema orientado a objetos, mostrá-lo a uma pessoa que entenda esses desenhos e ela entender aquilo da forma exata que você estava querendo que ela entendesse. Sabe quando um arquiteto faz uma planta de uma casa? Ou quando um roteirista escreve um roteiro? A idéia é exatamente a mesma, mas com os programas orientados a objetos.</p>
<p><em>“Orientado a Objetos... você já explicou isso <a href="http://nusseagora.blog.br/orientacao-a-objetos-q-raios-e-isso-parte-1/" target="_blank">aqui no nuss</a>... Isso significa que a UML serve para o desenvolvimento de programas para computador, certo?”</em> Tenho 2 respostas para tal pergunta:</p>
<ul>
<li><strong>Sim</strong>. Como dito, a UML ajuda-nos a      desenhar nossas relações orientadas a objetos. Como <strong>um programa OO</strong> <strong>é um      problema orientado a objetos</strong>, ela serve para tal.</li>
<li><strong>Não</strong>. Como dito, a UML ajuda-nos a      desenhar nossas relações orientadas a objetos. Como <strong>qualquer problema do nosso dia-a-dia pode ser organizado segundo a      ótica da Orientação a Objetos</strong>, ela serve para muito mais que só      modelar programas. Podemos, por exemplo, modelar a hierarquia de uma      empresa, com seus departamentos, as funções dos funcionários e até mesmo a      burocracia dos processos, chegando ao extremo de mapear até mesmo quem      está trabalhando demais (ou de menos).</li>
</ul>
<p><em>“Nossa, agora estou surpreso. Nunca pensei nessa possibilidade”. </em>Sim, ela existe, porém é muito pouco usada. Eu já cheguei a explicar o problema de alguns relatórios em um departamento público com diagramas UML, mas para esses fins nunca cheguei a usar muito além disso.</p>
<p><em>“Isso significa que podemos utilizá-la para desenhar nossos problemas, independente de serem programas de computador ou não. Legal. Mas ela é usada mais no desenvolvimento de programas, como jogos de computador. Certo?” </em>Exato. Com a UML, nós desenhamos todo o funcionamento do nosso, por exemplo, jogo. É com ela que eu anoto as características de um personagem, o que ele tem de itens, como são esses itens, como ele reage com o mundo de jogo, o que acontece quando ele ataca ou é atacado, quando pega um item ou passa de fase. A UML está para o programa como uma planta está para uma casa ou o roteiro está para um filme.</p>
<p><em> </em></p>
<p><em>“Aaaaahhh. Acho que agora estou entendendo. Eu desenho com a UML o meu programa antes que os programadores programem as minhas idéias, como o roteirista escreve o roteiro do filme antes dele ser gravado” </em>Novamente, <strong>Sim</strong> e <strong>Não. </strong>A UML não dita como você realiza o seu projeto, só desenha o programa. Ou seja, ela é <strong>independente da metodologia do projeto</strong>. Essa tal “metodologia do projeto” é quem dita o que e quando fazer. Tem metodologias onde fazemos a modelagem antes, outras durante ou até depois a programação. Além disso, algumas têm ciclos repetidos e incrementais durante todo o desenvolvimento, outras fazem tudo antes e, a cada problema encontrado volta-se ao início para corrigir tudo. Não existe “a melhor metodologia”: cada uma tem seus prós e contras, sendo recomendada ou não dependendo do que você pretende fazer. Como pode-se ver, a UML é só uma ferramenta para auxiliar o desenvolvimento do programa, independente de como você pretende desenvolvê-lo.</p>
<p><em>“Nossa. Legal isso. Posso fazer meu jogo com uma metodologia que eu prefira e, mesmo assim, utilizar o que você ensina aqui no Nuss...”</em> Além de ser poderosa e flexível, eu considero esse um dos maiores pontos de sucesso da UML.</p>
<p><em>“Como assim flexível, Tiago?”</em>. Isso já é assunto para a próxima parte desse artigo, onde falarei dos diversos diagramas da UML.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/o-que-raios-e-a-uml-parte-1/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Sobre jogos, inteligência artificial e sistemas especialistas: Akinator, o gênio da internet.</title>
		<link>http://www.nusseagora.blog.br/sobre-jogos-inteligencia-artificial-e-sistemas-especialistas-akinator-o-genio-da-internet</link>
		<comments>http://www.nusseagora.blog.br/sobre-jogos-inteligencia-artificial-e-sistemas-especialistas-akinator-o-genio-da-internet#comments</comments>
		<pubDate>Fri, 31 Jul 2009 01:00:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Análises de Jogos]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Jogos]]></category>
		<category><![CDATA[Akinator]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[inteligência artificial]]></category>
		<category><![CDATA[jogo]]></category>
		<category><![CDATA[sistema especialista]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=488</guid>
		<description><![CDATA["TÁ DE BRINCADEIRA, NÉ? MAS COMO PODE?!" Ouço essa frase no trabalho, enquanto um dos colegas sai da frente do PC que mostra a foto da Vera Fischer. "Aí Tiago, tenta também!", disseram. Assim começa a minha história com Akinator, o gênio da Internet. Akinator é um gênio fictício da internet que tem a simples [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify"><em>"TÁ DE BRINCADEIRA, NÉ? MAS COMO PODE?!"</em> Ouço essa frase no trabalho, enquanto um dos colegas sai da frente do PC que mostra a foto da Vera Fischer.<em> "Aí Tiago, tenta também!", </em>disseram.<em> </em>Assim começa a minha história<em> </em>com <a href="http://pt.akinator.com/" target="_blank">Akinator, o gênio da Internet</a>.</p>
<p><em><span id="more-488"></span></em>Akinator é um gênio fictício da internet que tem a simples meta de descobrir todo e qualquer personagem ou pessoa na qual você está pensando. <em>"PENSANDO?!?</em>", você pergunta. <em>"Sim, PENSANDO!"</em> eu respondo. Ele não pergunta em quem você está pensando, você não escreve e, se não quiser, nem mesmo fala prá ninguém. Mesmo assim, as chances são de que o rapaz acerte. Para que Akinator descubra, basta que você responda a uma série de perguntas.</p>
<p>"<em>Mas como isso é possível?"</em> Para explicar o que está acontecendo, antes temos que entender o que é <em>Inteligência Artificial </em>e <em>Sistema Especialista.</em></p>
<p><em>"Inteligência Artificial não é fazer com que o computador tenha ações próprias, Tiago?</em>"<em> </em>Mais que isso: é fazer com que ele chegue o mais próximo do pensamento humano. Em um jogo de xadrez, é fazer com que o computador seja tão desafiador quanto um jogador profissional. Em um sistema de gestão de projetos, é avaliar seu progresso e identificar os pontos problemáticos, prevendo problemas e dando dicas sobre como evitá-los. Em uma geladeira inteligente é ver quais os alimentos você tem comprado e avisar da falta de cálcio, ferro ou fósforo na dieta da casa.</p>
<p><em>"Então eu entendi o que é Inteligência Artificial. E esses tais Sistemas Especialistas?</em>" Esses sistemas compreendem uma parte específica da Inteligência Artificial que, desde meados dos anos 70, se destacam no que diz respeito a seu foco: o sistema é capaz de aprender com seus erros e acertos, sendo alimentado pelos usuários para saber cada vez mais sobre determinado assunto. Quanto mais o tempo passa, maior é o banco de dados sobre o problema e mais o sistema está treinado na solução desse problema. Consequentemente, menos ele erra.</p>
<p><em>"Então o Akinator sabe cada vez mais sobre as características de cada vez mais personagens?"</em> Sim, exatamente isso.  Na minha primeira vez jogando, por exemplo, ele fez uma sequencia de perguntas que, entre várias, incluia:</p>
<ul>
<li>Seu personagem é mulher? <strong>NÃO</strong></li>
<li>Seu personagem é brasileiro? <strong>NÃO</strong></li>
<li>Seu personagem é o principal da série onde aparece? <strong>SIM</strong></li>
<li>Seu personagem luta? <strong>SIM</strong></li>
<li>Seu personagem tem poderes especiais? <strong>SIM</strong></li>
<li>Seu personagem usa capa? <strong>SIM</strong></li>
<li>Seu personagem voa? <strong>SIM</strong></li>
<li>Seu personagem é real? <strong>NÃO</strong></li>
<li>Seu personagem veste azul e vermelho? <strong>SIM</strong></li>
<li>Seu personagem já esteve no espaço? <strong>SIM</strong></li>
</ul>
<p>Alguém aí sabe qual era o personagem, não? Se você, como o Akinator, disse <em>Superman</em>, parabéns: vocês usaram a mesma lógica para chegar ao resultado. Esse resultado, porém, foi ERRADO: eu pensei no <em>Mario</em>. Aí entra a alimentação do usuário: como ele errou, me permitiu ligar essa sequencia de perguntas a um novo personagem, (nesse caso ao Mario). Eu poderia até adicionar novas perguntas para o personagem caso eu quisesse. Foi o que eu fiz, por exemplo, com o Alien (do Alien vs Predador, lembram?): "Seu personagem possui alguma característica ácida?".</p>
<p>É baseado nessas perguntas que o Akinator responde: ele vai filtrando, filtrando e filtrando as suas respostas até que ache ter encontrado o personagem que você quer. Como exemplo, simulemos a sequencia de perguntas anterior com os seguinte banco de dados: <strong>Naruto</strong>, <strong>Xuxa</strong>, <strong>Mario</strong>, <strong>Pelé</strong>, <strong>Vera Fischer</strong>, <strong>Superman</strong>, <strong>Tiririca</strong>,<strong> Snake</strong>,<strong> Alien </strong>e <strong>Sonia Abrão</strong>.</p>
<ul>
<li>Seu personagem é mulher? <strong>NÃO</strong></li>
</ul>
<p>Saem das possibilidades <strong>Xuxa</strong>, <strong>Vera Fischer </strong>e <strong>Sonia Abrão</strong>.</p>
<ul>
<li>Seu personagem é brasileiro? <strong>NÃO</strong></li>
</ul>
<p>Saem agora <strong>Pelé</strong> e <strong>Tiririca</strong>.</p>
<ul>
<li>Seu personagem é o principal da série onde aparece? <strong>SIM</strong></li>
</ul>
<p>Continuam <strong>Mario</strong>, <strong>Superman</strong>, <strong>Snake</strong> e <strong>Alien</strong>.</p>
<ul>
<li>Seu personagem luta?<strong> SIM</strong></li>
</ul>
<p>Continuam <strong>Mario</strong>, <strong>Superman</strong>, <strong>Snake</strong> e <strong>Alien</strong>.</p>
<ul>
<li>Seu personagem tem poderes especiais? <strong>SIM</strong></li>
</ul>
<p>Mario voa, pula muito alto e usa vários power ups. Alien tem velocidade e força descomunais, além de sangue ácido. Superman dispensa comentários. Daí sai <strong>Snake</strong>.</p>
<ul>
<li>Seu personagem usa capa? <strong>SIM</strong></li>
</ul>
<p>Opa, tchauzinho <strong>Alien.</strong></p>
<ul>
<li>Seu personagem voa? <strong>SIM</strong></li>
</ul>
<p>Ficam <strong>Mario</strong> e <strong>Superman</strong>.</p>
<ul>
<li>Seu personagem é real? <strong><strong>NÃO</strong></strong></li>
</ul>
<p>Ficam <strong>Mario</strong> e <strong>Superman</strong>.</p>
<ul>
<li>Seu personagem veste azul e vermelho? <strong>SIM</strong></li>
</ul>
<p>Hahaha. Quando ele  fez essa pergunta eu já estava indignado. Tinha certeza que ele ia acertar... Ficam <strong>Mario</strong> e <strong>Superman</strong>.</p>
<ul>
<li>Seu personagem já esteve no espaço? <strong>SIM</strong></li>
</ul>
<p>Ficam <strong>Mario</strong> e <strong>Superman</strong>.</p>
<p>Como foi visto, o funcionamento é baseado em uma busca por <strong>SIM</strong> ou <strong>NÃO</strong>. O Akinator ainda dá a possibilidade de você responder que aquilo <strong>provavelmente acontece</strong>, que <strong>você não sabe responder aquela pergunta</strong> ou que <strong>dificilmente aquilo é verdadeiro</strong>. Essas respostas somam ou subtraem pontos que ajudam a selecionar um personagem. Além dessas respostas especiais, outros fatores podem influenciar a resposta do Akinator, como a <strong>popularidade do personagem baseado em acertos prévios e quantidade de buscas </strong>(se você tem 2 possibilidades, escolheria a que tem maior probabilidade de ser correta, não?), <strong>perguntas com respostas erradas/incertas/inconsistentes para a situação atual</strong> (o videogame que você tem hoje pode não ser mais o videogame que você tem amanhã) e até mesmo a <strong>inexistência do resultado</strong> (lembre-se: o sistema especialista é alimentado com o tempo). Da próxima vez que ele ficar em dúvida entre o <strong>Mario</strong> e o <strong>Superman</strong> ele irá provavelmente perguntar algo para diferenciar os dois, como <strong>Seu personagem é um herói da Liga da Justiça?</strong> Aí sim ele irá acertar <img src='http://www.nusseagora.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><em>"Tiago é sinistro, ganhou do Akinator"</em>, disseram. Ganhei sim, a 1a vez... Ele pode até ter confundido o Mario com o Superman, mas soube muito bem quem é a Samus Aran <img src='http://www.nusseagora.blog.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> .</p>
<p style="text-align: right;"><em>Saiba mais sobre Sistemas Especialistas nela, a <a href="http://pt.wikipedia.org/wiki/Sistema_especialista" target="_blank">Wikipedia!</a></em></p>
<p style="text-align: right;"><em>Versão em inglês do Akinator <a href="http://en.akinator.com/">aqui</a>.<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/sobre-jogos-inteligencia-artificial-e-sistemas-especialistas-akinator-o-genio-da-internet/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Decorando um jogo com o padrão de projetos Decorator – Parte 2</title>
		<link>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2</link>
		<comments>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2#comments</comments>
		<pubDate>Sun, 26 Jul 2009 20:52:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Decorator]]></category>
		<category><![CDATA[jogo]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=461</guid>
		<description><![CDATA[Para fechar o artigo anterior, como foi prometido, segue abaixo o diagrama do padrão de projetos Decorator. Apesar da longa explicação e do funcionamento diferente, o diagrama é bem simples: A única coisa diferente nesse diagrama é o fato de TDecoratorBonus possuir, além da herança de TArma,  o atributo _arma do tipo TArma, fazendo assim [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><script src="http://rec6.via6.com/link.php?action=widget&amp;url=http://nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%25e2%2580%2593-parte-2%2F" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">Para fechar o artigo anterior, como foi prometido, segue abaixo o diagrama do padrão de projetos Decorator. Apesar da longa explicação e do funcionamento diferente, o diagrama é bem simples:</p>
<p style="margin-left: 70pt; text-align: justify"><span id="more-461"></span></p>
<div id="attachment_478" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-478" title="diagramaDecorator" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/07/diagramaDecorator.jpg" alt="diagramaDecorator" width="500" height="237" /><p class="wp-caption-text">Diagrama do padrão de projetos Decorator</p></div>
<p style="text-align: left;">A única coisa diferente nesse diagrama é o fato de <em>TDecoratorBonus</em> possuir, além da herança de TArma,  o atributo <em>_arma</em> do tipo <em>TArma</em>, fazendo assim que surjam as 2 setas. Além disso, basta não se esquecer que <em>TEfeito</em> e <em>TEncantamento</em> têm, por herança de <em>TDecoratorBonus</em>, seus próprios atributos <em>_arma</em></p>
<p style="text-align: left;">O código do padrão (Action Script 3.0 com projeto Flash CS3) pode ser encontrado aqui: [download id="1"]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Decorando um jogo com o padrão de projetos Decorator &#8211; Parte 1</title>
		<link>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1</link>
		<comments>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1#comments</comments>
		<pubDate>Mon, 20 Jul 2009 23:16:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Decorator]]></category>
		<category><![CDATA[jogo]]></category>
		<category><![CDATA[World of Warcraft]]></category>
		<category><![CDATA[WoW]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=403</guid>
		<description><![CDATA[Você e 4 amigos, uma esquadrilha de netherdrakes, helicópteros, grifos e hipogrifos, girando por Oshu’gun enquanto procuram o gigante comedor de dragões Durn the Hungerer. Apesar da ameaça, vocês estão confiantes em seu grupo. O entardecer de Nagrand mostra a silhueta do gigante no horizonte e vocês sabem que a hora chegou. A luta foi [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify"><em>Você e 4 amigos, uma esquadrilha de netherdrakes, helicópteros, grifos e hipogrifos, girando por Oshu’gun enquanto procuram o gigante comedor de dragões Durn the Hungerer. Apesar da ameaça, vocês estão confiantes em seu grupo. O entardecer de Nagrand mostra a silhueta do gigante no horizonte e vocês sabem que a hora chegou.</em></p>
<p><em>A luta foi perfeita: o gigante arrasou com o grupo nos 20s mais estilosos que qualquer monstro do World of Warcraft  já viu. Depois de 15min de brigas sobre quem tem a culpa, alguém descobre que o grupo não estava tão preparado assim. Todos então  resolvem melhorar seus equipamentos... Mas como?</em></p>
<p>Apresento-lhes a morte do grande gigante, o padrão Decorator.</p>
<p><span id="more-403"></span>Vários jogos permitem a seus jogadores um vasto leque de personalização. Eles permitem que configuremos os personagens para que eles sejam o mais parecido possível com a gente em muito mais que só altura e cor de cabelos. Tais jogos permitem que configuremos também a forma com que esse personagem reage ao mundo de jogo, definindo coisas como a velocidade, o tipo de magia que ele usa ou o quanto sustenta de dano. Alguns jogos permitem até que você configure os itens que eles usam. Assim é o <em>World of Warcraft</em>, a febre do momento no mundo dos RPGS massivos (os <em>MMORPGS</em>).</p>
<p>Para vencer os desafios no WoW, os jogadores podem utilizar encantamentos, gemas, itens e diversos efeitos diferentes para aumentar suas características. Se foi isso que faltou no grupo, é isso que daremos a ele.</p>
<p>Comecemos pegando uma das armas dos jogadores. Essa arma exemplo será a classe TArma abaixo:</p>
<pre class="brush:java">package Efeitos
{
	public class TArma
	{
		protected var _nome:String; // Damos um nome qualquer e …
		protected var _efeito:String; // … um efeito…

		public function TArma()
		{
			// ... mas setamos para os valores normais ...
			// ... afinal de contas, a arma não tem nada de especial ...
			// ... ainda
			this._nome = "Arma sem Bônus";
			this._efeito = "";
		}

		public function retornaNome():String
		{ return this._nome; }

		public function retornaEfeito():String
		{ return this._efeito; }
	}
}</pre>
<p>Essa arma é o que os personagens têm no momento e, como já sabemos, isso não é o suficiente. <em>Que tal incluirmos esses tais efeitos e </em><em>encantamentos? Assim estaríamos adicionando a força necessária que os personagens precisam, não Tiago? É só criar uns métodos retornaEncantamento() como você fez e pronto.</em></p>
<p>Não só poderíamos adicionar tais características como várias outras características à arma. O problema é o futuro: a cada vez que um ou vários novos bônus aparecessem no nosso jogo, fossem modificados ou simplesmente excluídos do jogo (o que acontece com muita frequência), teríamos que atualizar essa classe <em>Tarma</em>, bem como TODO O CÓDIGO fazendo as chamadas a esses bônus, no caso deles simplesmente não existirem mais . Isso a torna alvo de alterações cíclicas, o que é longe de ser legal. A idéia aqui é encapsular essas alterações, aplicando-as como um skin ou tema à arma.</p>
<p>Para conseguirmos tal estrutura, usaremos o padrão Decorator: iremos “enfeitar” a arma com quantos bônus especiais precisarmos, aproveitando que ela já possui algo engatilhado para isso (afinal de contas, o método <em>retornaEfeito()</em> não está lá à toa) . Para isso, precisamos inicialmente criar a classe TDecoratorBonus:</p>
<pre class="brush:java">package Efeitos
{
	//import Status.TStatus;

	public class TDecoratorBonus extends TArma
	{
		protected var _arma:TArma; // O Decorador possui uma instância de TArma.

		/***************************************************************
		Construtor da classe. Tem os atributos da TArma a ser decorada ...
		... por ser um tipo de arma.
		****************************************************************/
		public function TDecoratorBonus()
		{
			this._nome = "sem nome";
			this._efeito="";
		}
		/***************************************************************
		Esse método sobrescreve (overrides) o método retornaNome() da ...
		... classe TArma.
		****************************************************************/
		public override function retornaNome():String
		{ return this._nome; }
	}
}</pre>
<p>Essa classe é o coração do nosso decorador: ela é a responsável pela estrutura de encapsulamento dos diversos efeitos. A principal estrela dessa clase é, sem dúvidas, o atributo <em>protected var _arma:TArma</em>. Sua função é guardar a camada de efeitos no caso dessa camada ser envolvida por outra camada. <em>Não entendi nada, Tiago.Como assim camada envolvida por outra camada?</em> Bom, se você pensar bem, estou falando de camadas como aquelas bonecas russas chamadas <a href="http://pt.wikipedia.org/wiki/Matrioshka" target="_blank">matrioshka</a> que guardam outras bonecas idênticas dentro: essa instância seria uma "âncora" para que pudéssemos ir para a "boneca de dentro". Essa boneca de dentro, por sua vez, também tem sua boneca de dentro até o ponto em que não haja mais bonecas dentro.</p>
<p>Cada uma dessas bonecas é, no nosso exemplo, uma das camadas de bônus do padrão decorador, como a classe abaixo:</p>
<pre class="brush:java">package Efeitos
{
	public class TEfeito extends TDecoratorBonus
	{

		/***************************************************************
		Construtor da classe recebe um objeto TArma. Ele é jogado para ...
		... a instância this._arma, encapsulando assim mais um nível para ...
		... a recursividade do padrão.
		****************************************************************/
		public function TEfeito(arma:TArma)
		{
			//Os seguintes atributos vieram por herança de TDecoratorBonus;
			this._arma = arma;
			this._efeito = "+10";
		}

		/***************************************************************
		Método que sobrescreve o retornaEfeito da classe TDecoratorBonus, ...
		... chamando ele próprio na instância this._arma da classe. Dessa ...
		... forma, o método inicia uma cadeia de chamadas que termina ...
		... na classe mais interna, a que não possui uma instância de ...
		... _arma.
		****************************************************************/
		public override function retornaEfeito():String
		{
			// Por ser um padrão de recursividade, é obrigatório que...
			// ... chamemos this._arma.retornaEfeito(). Só assim o ...
			// ... método continuará chamando os efeitos encapsulados.
			return (this._efeito + " " + this._arma.retornaEfeito());
		}
	}
}</pre>
<p>Para fazer as camadas de bônus funcionarem, entra em ação uma coisa chamada <em>recursividade</em>: de forma simplificada (e, quem sabe, um dia eu escreva de forma completa), recursividade é a capacidade de um método ou função chamar a si mesma por várias vezes, retornando resultados para ela própria. Por enquanto, basta saber que o método <em>retornaEfeito() </em>é recursivo por chamae <em>retornaEfeito() </em>novamente, mas agora na camada de dentro (que, como já sabemos, é o atributo <em>this._arma</em>). A camada interna, por sua vez, chama <em>retornaEfeito() </em>de sua <em>this._arma</em>, que chama <em>retornaEfeito() </em>de sua <em>this._arma</em>, que chama <em>retornaEfeito() </em>de sua... Isso só acaba quando chegamos na arma inicial, a <em>TArma</em>, cujo método <em>retornaEfeito() </em>não chama outro <em>retornaEfeito() </em>e sim, exibe seu <em>this._efeito</em>.</p>
<p>Nesse momento, cada <em>retornaEfeito()</em> chamado retorna seu <em>this._efeito </em>para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna... O fim desse ciclo se dá quando não houver mais retornos a chamadas a <em>retornaEfeito()</em>, o que no nosso exemplo acontece na classe <em>TMain</em> mais à frente.</p>
<p>Essa estrutura fica assim:</p>
<div id="attachment_406" class="wp-caption aligncenter" style="width: 407px"><img class="size-full wp-image-406" title="camadasDoDecorator" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/07/camadasDoDecorator.jpg" alt="Camadas" width="397" height="482" /><p class="wp-caption-text">Camadas</p></div>
<p>Com o padrão conseguimos criar uma arma genérica que possui ao seu redor várias camadas de efeitos e que funciona do exato mesmo jeito que uma arma que não possui efeito algum. Além disso, podemos ter diferentes tipos de efeitos, cada um implementado por uma classe diferente. Vou criar agora um TEncantamento:</p>
<pre class="brush:java">package Efeitos
{
	import Efeitos.TDecoratorBonus;

	public class TEncantamento extends TDecoratorBonus
	{

		public function TEncantamento(arma:TArma)
		{
			this._arma = arma;
			this._efeito = "Mongoose";
		}

		public override function retornaEfeito():String
		{
			return (this._arma.retornaEfeito() + " " + this._efeito);
		}
	}
}</pre>
<p>Por fim, basta decorarmos a arma:</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Efeitos.TDecoratorBonus;
	import Efeitos.TEncantamento;
	import Efeitos.TEfeito;
	import Efeitos.TArma;

	public class TMain extends MovieClip
	{
		public function TMain()
		{
			// Criamos uma arma qualquer ...
			var arma = new TArma();

			trace ("Antes dos efeitos"); // ... e exibimos seus bônus iniciais.
			trace ( arma.retornaEfeito() );
			trace ();
			trace("---------------------------------------");
			trace ();

			// Agora o padrão entra em ação. Criamos um efeito TEfeito que ...
			// encapsula a arma atual e é passado para ela mesma. Agora ...
			// arma tem dentro de si um TEfeito.
			// Efeito +10
			arma = new TEfeito(arma);

			// Pegamos agora a TEfeito e jogamos dentro de TEncantamento, ...
			// ... passando novamente para a arma. Agora ela tem um ...
			// TEncantamento que tem um TEfeito.
			arma = new TEncantamento(arma);

			// ... que vai dentro de mais um TEfeito ...
			arma = new TEfeito(arma);

			// ... que termina dentro de outro TEfeito
			arma = new TEfeito(arma);

			// Ao realizarmos a chamada a arma.retornaEfeito(), o próprio ...
			// ... método se encarrega de chamar retornaEfeito() das ...
			// ... instâncias encapsuladas, de forma recursiva.

			trace ( arma.retornaEfeito() );
		}
	}
}</pre>
<p>No próximo artigo eu disponibilizo o projeto (Flash CS3) e os arquivos das classes (Action Script 3.0). Falo também do diagrama de classes dessa brincadeira toda. Até lá, caso alguém tenha qualquer dúvida, basta perguntar.</p>
<p><em>No final de uma longa batalha, O gigante finalmente tomba. Seu colossal corpo vai agora servir de alimento para as criaturas que das quais sua linhagem alimentou-se durante eras. Os heróis retornam para suas montarias e tudo volta a ser tranqüilo, graças ao padrão Decorator.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

