<?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; Padrões de Projeto</title>
	<atom:link href="http://www.nusseagora.blog.br/category/padroes-de-projeto/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 3</title>
		<link>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-3</link>
		<comments>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-3#comments</comments>
		<pubDate>Tue, 22 Dec 2009 10:55:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Observer]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=866</guid>
		<description><![CDATA[Segue abaixo a 3a parte do artigo sobre o padrão de projetos Observer. Prá começar, aí está o Diagrama de Classes: Ele é simples como a estrutura do padrão: as classes que são observadoras implementam a interface IObserver, o sujeito observado implementa a ISubect que, por sua vez, tem um conjunto de IObservers. Aqui você [...]]]></description>
			<content:encoded><![CDATA[<p>Segue abaixo a 3a parte do artigo sobre o padrão de projetos Observer.</p>
<p><span id="more-866"></span>Prá começar, aí está o Diagrama de Classes:</p>
<p><img class="aligncenter size-full wp-image-867" title="diagrama-de-classe-observer" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/12/diagrama-de-classe-observer.jpg" alt="diagrama-de-classe-observer" width="400" height="582" /></p>
<p>Ele é simples como a estrutura do padrão: as classes que são observadoras implementam a interface <em>IObserver</em>, o sujeito observado implementa a <em>ISubect</em> que, por sua vez, tem um conjunto de <em>IObservers</em>.</p>
<p>Aqui você baixa o código do projeto CS3 em Actionscript 3.0  [download id="3"]</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-3/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>Padrão de Projetos Observer: Implementando mísseis teleguiados – parte 1</title>
		<link>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1</link>
		<comments>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1#comments</comments>
		<pubDate>Sun, 15 Nov 2009 23:13:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=830</guid>
		<description><![CDATA[Imagine a cena: Você resolve passear com seu filho, prometendo a ele mostrar uma surpresa no final do trajeto. Como qualquer menino inquieto que se preze, ele passa os primeiros 15 minutos do passeio perguntando “Já chegou? Já chegou? Já chegou? Já chegou? Já chegou?”. Esperto como só você seria, resolve cortar as perguntas do [...]]]></description>
			<content:encoded><![CDATA[<p>Imagine a cena: Você resolve passear com seu filho, prometendo a ele mostrar uma surpresa no final do trajeto. Como qualquer menino inquieto que se preze, ele passa os primeiros 15 minutos do passeio perguntando <em>“Já chegou? Já chegou? Já chegou? Já chegou? Já chegou?”</em>. Esperto como só você seria, resolve cortar as perguntas do garoto com uma única resposta: <em>“Quando chegar, eu te aviso”</em>.</p>
<p>Apesar de simples, isso é tudo que você precisa saber antes de ler sobre o padrão Observer (Observador).</p>
<p><span id="more-830"></span></p>
<p>No exemplo anterior temos todas as entidades do padrão Observer bem definidas. Seu filho é o <em>Observador</em>, aquele que está ali ansioso, esperando seu aviso de quando é que a tal surpresa vai chegar. Já você é o que chamamos de <em>Sujeito Observado</em>, quem detém a informação da surpresa, a função de identificar quando ela já pode ser mostrada e avisar a seu observador que chegou a hora dele vê-la.</p>
<p>Como podemos ver, os <strong>Observadores</strong> se registram no <strong>Sujeito Observado</strong>, esperando só o momento de reagir às mudanças no <strong>Sujeito</strong>. Outro exemplo claro da lógica do padrão Observador é assinar os feeds de um site ou uma revista qualquer: todos os assinantes são avisados quando os novos artigos são publicados, bastando esperar para que isso aconteça.</p>
<p>O funcionamento do padrão é simples, mas os ganhos com ele são muito grandes. Com ele você consegue poupar o processador de inúmeras requisições frustradas (como todos os <em>“Já chegou?”</em> antes de realmente ter chegado), deixando para avisar a todos aqueles que se registraram como observadores quando o evento esperado ocorrer. Até que isso ocorra, eles ficam lá, quietinhos, sem encher o saco de ninguém...</p>
<p>O padrão é tão importante que, em muitos casos, seu uso é completamente transparente, sendo já embutido aos frameworks. No Actionscript 3.0, por exemplo, quando utilizamos um eventListerner, não estamos fazendo nada mais que utilizar o padrão. A seguinte linha...</p>
<pre class="brush:java">_botao.addEventListener(MouseEvent.CLICK, aoClicar);</pre>
<p>... na realidade, está registrando o objeto <em>_botao</em> como observador dos eventos do AS3.0. Quando o evento <em>MouseEvent.CLICK</em> ocorrer, <em>_botao</em> engatilhará o método <em>aoClicar</em>.</p>
<p><em>“Ta Tiago, mas o que os mísseis teleguiados tem a ver com isso?”</em> Como não poderia ser diferente, na próxima parte do artigo vocês terão um exemplo de como implementar o Observer, brincando com esses mísseis teleguiado. Até lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1/feed</wfw:commentRss>
		<slash:comments>2</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 Princípio da Substituição de Liskov</title>
		<link>http://www.nusseagora.blog.br/principio-da-substituicao-de-liskov</link>
		<comments>http://www.nusseagora.blog.br/principio-da-substituicao-de-liskov#comments</comments>
		<pubDate>Thu, 03 Sep 2009 13:42:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Princípio da Substituição de Liskov]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=627</guid>
		<description><![CDATA[Antes de continuarmos pelos padrões de projeto, acho importante ter aqui uma explicação sobre o Princípio da Substituição de Liskov. Ele é comum nas boas práticas de programação orientada a objetos e seus conceitos aparecem muito ao utilizar diversos padrões de projeto, principalmente no uso de Interfaces em padrões como o State (estado), o Strategy (Estratégia) [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify">Antes de continuarmos pelos padrões de projeto, acho importante ter aqui uma explicação sobre o Princípio da Substituição de Liskov. Ele é comum nas boas práticas de programação orientada a objetos e seus conceitos aparecem muito ao utilizar diversos padrões de projeto, principalmente no uso de Interfaces em padrões como o <a href="http://nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2/" target="_blank">State</a> (estado), o Strategy (Estratégia) ou os diversos tipos de Factories (Fábricas). Apesar de sua popularidade, ainda sim costuma dar um nó na cabeça de quem está começando.</p>
<p><span id="more-627"></span>Historicamente falando, O princípio foi introduzido em 1993 (muito recente, como podem ver) por <a title="Barbara Liskov" href="http://pt.wikipedia.org/wiki/Barbara_Liskov">Barbara Liskov</a> e Jeannette Wing no artigo <em>Family Values: A Behavioral Notion of Subtyping</em>. Segundo ele:</p>
<p><em> </em></p>
<blockquote><p><em>Se q(x) é uma propriedade demonstrável dos objetos x de tipo T. Então q(y) deve ser verdadeiro para objetos y de tipo S onde S é um subtipo de T.</em></p></blockquote>
<p><em> </em></p>
<p><em>“Mas hein?!?”</em> Apesar de parecer complicado, não é. Traduzindo isso para uma linguagem mais simples:</p>
<blockquote><p><em>Se você pode chamar um método q de uma classe TMae, pode também chamar o método q de uma classe TFilha com herança de TMae.</em></p></blockquote>
<p><em> </em></p>
<p><em>“Bom, melhorou bastante. Mas você não pode explicar melhor não, Tiago?”</em> Se uma classe herda de outra classe, cria-se a relação de “é um”. Explicar isso à fundo é material para um outro artigo, mas basta dizer que quando a classe <strong>TFilha</strong> herdou os métodos de <strong>TMae</strong>, ela passou a ser uma <strong>TMae</strong> estendida, melhorada (daí algumas linguagens utilizarem a palavra <strong>extends</strong> para definir herança): ela tem TUDO que uma <strong>TMae</strong> tem, além das coisas que só <strong>TFilha</strong> tem.</p>
<p>Se <strong>TFilha</strong> tem tudo que a <strong>TMae</strong> tem, as chamadas por <strong>TMae</strong> podem receber uma <strong>TFilha</strong> sem o menor problema. Entendamos o código abaixo:</p>
<p>Primeiro criamos uma classe TMae:</p>
<pre class="brush:java">package Classes
{
	public class TMae
	{
		public function TMae()
		{
		}

		public function Voce(): void
		{
			trace ("Eu sou uma TMae");
		}
	}
}</pre>
<p>Como <strong>TMae</strong> precisa de uma filha, vamos criá-la herdando de sua mãe:</p>
<pre class="brush:java">package Classes
{
	import Classes.TMae;

	public class TFilha extends TMae
	{
		public function TFilha(): void
		{
			super(); // Chama o construtor da classe TMae
  		}

		public override function Voce():void
		{
			trace ("Eu sou uma TFilha");
		}

		public function Mae():void
		{
			// chama o método Voce() da classe mãe
			super.Voce();
		}
	}
}</pre>
<p>Vale lembrar que TFilha pode ter seus extras, como fiz com o método Mae(), que exibe a mãe de filha, o método <em>Voce()</em> de <em>super</em>. Para colocar isso tudo para funcionar, precisamos da classe TMain:</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Classes.TMae;
	import Classes.TFilha;

	public class TMain extends MovieClip
	{
		public function TMain(): void
		{
			var mae: TMae = new TMae();
			var filha: TFilha = new TFilha();

			trace ("======= MAE =======");
			this.testarLiskov(mae);

			trace ("======= FILHA =======");
			this.testarLiskov(filha);

			trace ("======= MAE DA FILHA =======");
			filha.Mae();

			//trace ("======= MAE DA MAE? =======");
			//mae.Mae();
		}

		public function testarLiskov(obj:TMae)
		{
			obj.Voce();
		}
	}
}</pre>
<p>A saída disso é a seguinte:</p>
<pre>	======= MAE =======
	Eu sou uma TMae
	======= FILHA =======
	Eu sou uma TFilha
	======= MAE DA FILHA =======
	Eu sou uma TMae</pre>
<p>Para terminar, lembrem-se que o Princípio da Substituição de Liskov <strong>não é comutativo</strong>. Ou seja: <strong>podemos trocar a TMae por uma TFilha, mas não uma TFilha por uma TMae</strong>. Se <strong>TFilha</strong> pode possuir mais métodos e atributos  que <strong>TMae, não temos como chamá-los diretamente por TMae. </strong>Para confirmar, basta descomentar a linha <em>mae.Mae()</em> e ver que o compilador não consegue encontrar o método <em>Mae()</em> em TMae (claro, ele é de TFilha!).</p>
<p style="text-align: right;">Saiba mais sobre o <a href="http://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_substitui%C3%A7%C3%A3o_de_Liskov" target="_blank">Princípio na Wikipédia</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/principio-da-substituicao-de-liskov/feed</wfw:commentRss>
		<slash:comments>4</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>
	</channel>
</rss>

