<?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; UML</title>
	<atom:link href="http://www.nusseagora.blog.br/category/uml/feed" rel="self" type="application/rss+xml" />
	<link>http://www.nusseagora.blog.br</link>
	<description></description>
	<lastBuildDate>Fri, 04 Feb 2011 12:56:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Marios, Máquinas de Estados e o Padrão de Projetos State – Parte 3</title>
		<link>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-3</link>
		<comments>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-3#comments</comments>
		<pubDate>Sun, 04 Oct 2009 23:01:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[máquina de estados]]></category>
		<category><![CDATA[Mario]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=768</guid>
		<description><![CDATA[Como prometido na parte 2 da série, esse é um exemplo de Diagrama de Transição de Estados do nosso código do Mario. O diagrama é simples, não há muito o que explicar: ele traz em colchetes os eventos que disparam a troca de estado, indicada pela seta. O início é o círculo preto e, o [...]]]></description>
			<content:encoded><![CDATA[<p>Como prometido na <a href="http://nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2/" target="_blank">parte 2</a> da série, esse é um exemplo de Diagrama de Transição de Estados do nosso código do Mario.</p>
<p><span id="more-768"></span>O diagrama é simples, não há muito o que explicar: ele traz em colchetes os eventos que disparam a troca de estado, indicada pela seta. O início é o círculo preto e, o fim,  o branco com o centro preto (também auto-explicativo).</p>
<p><span> </span></p>
<div id="attachment_769" class="wp-caption alignright" style="width: 160px"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/10/DiagramaDeEstados.jpg"><img class="size-thumbnail wp-image-769" title="DiagramaDeEstados" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/10/DiagramaDeEstados-150x150.jpg" alt="Diagrama de Transição de Estados" width="150" height="150" /></a><p class="wp-caption-text">Diagrama de Transição de Estados</p></div>
<p style="margin-right: 130pt; text-align: justify"><em>"E qual é a vantagem dele, Tiago?"</em> A vantagem é que, ao ver todo o funcionamento dos estados em uma única imagem, temos uma visão muito maior da sua lógica e podemos apontar erros. Identificamos, por exemplo, um "sumidouro": o estado TMarioInvencivel não muda para outro estado, sendo impossível a continuação da lógica após ele. Seguindo a lógica do jogo, deveríamos colocar um timer nele para controlasse quanto tempo podemos ficar invencíveis.Viu? Graças ao diagrama identificamos facilmente um beco sem saída na nossa lógica.</p>
<p><em>"Tá... mas e o TMarioFlorDeFogo?"</em> Então... colocá-lo no diagrama é um exercício para vocês <img src='http://www.nusseagora.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  .</p>
<p style="text-align: right;"><em>ps.: Desculpem pelo atraso na publicação do artigo, mas as coisas apertaram pro meu lado</em> _ _'</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>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 – Parte 2</title>
		<link>http://www.nusseagora.blog.br/raios-e-uml-%e2%80%93-parte-2</link>
		<comments>http://www.nusseagora.blog.br/raios-e-uml-%e2%80%93-parte-2#comments</comments>
		<pubDate>Sun, 23 Aug 2009 19:26:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[UML]]></category>
		<category><![CDATA[Análise de Sistemas]]></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=581</guid>
		<description><![CDATA[Continuando a micro-série sobre a UML, é hora de falarmos sobre como utilizá-la. A UML nos disponibiliza diversas ferramentas ou artefatos para que possamos modelar as diversas partes do nosso projeto. Tais ferramentas são chamadas de “diagramas” e não passam de uma forma padronizada de desenhar determinado tipo de problema de forma a simplificar a [...]]]></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/raios-e-uml-%25e2%2580%2593-parte-2%2F" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">Continuando a micro-série sobre a UML, é hora de falarmos sobre como utilizá-la. A UML nos disponibiliza diversas ferramentas ou artefatos para que possamos modelar as diversas partes do nosso projeto. Tais ferramentas são chamadas de “diagramas” e não passam de uma forma padronizada de desenhar determinado tipo de problema de forma a simplificar a forma de ver o que eles querem mostrar.</p>
<p><em>“Mas e a flexibilidade que você mencionou no <a href="http://nusseagora.blog.br/o-que-raios-e-a-uml-parte-1/" target="_blank">artigo anterior</a>?” </em>Então... ela tem a ver com a possibilidade de não utilizarmos todos os diagramas e sim aqueles que são relevantes ao nosso problema. Isso diminui muito a quantidade de trabalho e permite que nos foquemos somente no que nos é importante (lembram-se do <a href="http://nusseagora.blog.br/principio-de-pareto-como-solucionar-80-dos-problemas-mexendo-somente-em-20-das-causas/" target="_blank">princípio de pareto</a>, né?).</p>
<p><span id="more-581"></span>Esses diagramas se dividem em 3 grupos:</p>
<ul>
<li><strong>Diagramas Estruturais (ou de estrutura)</strong></li>
</ul>
<p>Mostram que coisas existem e como elas devem estar relacionadas entre si. Em um jogo, os diagramas estruturais mostrariam, por exemplo, quantos itens cabem na mochila do seu personagem, se um item pode ter ou não alguma habilidade especial ou até mesmo como é a estrutura de salvar ou carregar o progresso do jogo. Os Diagramas Estruturais se dividem em:</p>
<ul> <span style="text-decoration: underline;">Diagrama de Classes</span></ul>
<p>Com o Diagrama de Classes você define as dependências das entidades que fazem parte do seu programa. Quantos personagens estão ao mesmo tempo em uma arena ou como organiza-se o seu ranking são exemplos do uso do Diagrama de Classes.</p>
<ul> <span style="text-decoration: underline;">Diagrama de Estrutura Composta</span></ul>
<p>Lembra quando falamos aqui em classes que contem outras classes, como um carro que tem rodas e lataria personalizáveis, ou um personagem que tem um animal de estimação? O diagrama de Estrutura Composta mostra quais relações entre essas “partes” a classe tem, como o personagem mandando seu animal atacar ou o carro ordenando as rodas que parem de girar.<em> “Ué Tiago, é igual a um Diagrama de Classes?”</em> Na realidade, é. Mas, dependendo do que se modela, pode ser visualmente mais simples.</p>
<ul> <span style="text-decoration: underline;">Diagrama de Objetos</span></ul>
<p>Esse diagrama parece-se muito com o Diagrama de Classes, mas define quais objetos foram instanciados em um dado momento do seu programa. Pegando o exemplo anterior, um diagrama de objetos poderia, por exemplo, mostrar quais personagens estão em qual arena, com quais itens e usando quais magias.</p>
<ul> <span style="text-decoration: underline;">Diagrama de Componentes</span></ul>
<p>Define como as coisas físicas estão organizadas no seu projeto. Por exemplo, onde e como estão guardadas os arquivos do seu código-fonte e a dependência entre eles.</p>
<ul> <span style="text-decoration: underline;">Diagrama de Pacotes</span></ul>
<p>Um dos meus preferidos: ilustra as dependências das partes lógicas do seu programa entre si. Essas partes lógicas, em um jogo, poderiam ser “Fase 1”, “Tela de Login” ou “Tela Inicial”. É utilizado também para definir a arquitetura do seu projeto, como as <a href="http://nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-1/" target="_blank">camadas e o MVC</a>.</p>
<ul> <span style="text-decoration: underline;">Diagrama de Instalação</span></ul>
<p>Sabe quando você deve instalar um DirectX qualquer para rodar um jogo? Então, esse tipo de dependência é o que os diagramas de instalação modelam. Podem ser utilizados para definir a rede onde um MMORPG roda, mostrando os servidores de jogo, de login, sites, bancos de dados e clientes de jogo.</p>
<ul>
<li><strong>Diagramas Comportamentais (ou de comportamento)</strong></li>
</ul>
<p>Diagramas Comportamentais definem o comportamento das coisas que seu projeto tem, incluindo aí a forma com que ele reage aos estímulos externos.</p>
<ul><span style="text-decoration: underline;">Diagrama de Casos de Uso</span></ul>
<p>Define a forma de interação do usuário com o seu sistema (os tais estímulos externos falados acima). Com ele você diz tudo que seu usuário pode fazer e começa a definir quais são as partes principais do seu sistema. Ele poderá salvar? Então você terá um módulo de savegame com seus próprios casos de Uso (<em>Salvar jogo</em>, <em>Escolher</em> Savegame, <em>Cancelar</em>, <em>Carregar Savegame</em>, por exemplo). Ele utilizará veículos? Então um módulo para controle de veículos será necessário.</p>
<p>Como dica, Casos de Uso iniciam com interação com periféricos. Botões, barras de rolagem, escolha de menus, utilização de teclado... isso tudo dá vida a um caso de uso.</p>
<ul><span style="text-decoration: underline;">Diagrama de Atividades</span></ul>
<p>O Diagrama de Atividades não é muito mais que o antigo “Diagrama de Blocos”. Ele indica a lógica das coisas sem entrar em detalhes de programação. Um diagrama torna muito mais visível uma lógica como a seguinte: <em>“Jogo exibe menu de modos de jogo. Jogador coloca o cursor sobre o modo desejado. Jogador clica no modo escolhido. O jogo carrega a tela inicial daquele modo escolhido, com a opção de confirmar escolha ou cancelar escolha. Se o jogador cancela a escolha do modo, ele volta ao menu principal; se confirma, o jogo carrega aquele modo.”</em></p>
<ul><span style="text-decoration: underline;">Diagrama de Transição de Estados</span></ul>
<p>Como o Mario muda de estado no decorrer de um jogo? Ele pega um cogumelo e vira <strong>Super Mario</strong>, que encosta em um inimigo e vira de novo o <strong>Mario</strong>. Só que o <strong>Mario</strong>, se encostar em um inimigo, <strong>morre</strong>. Cada um desses “tipos de Mario” é um estado. O conjunto da relação entre eles é o que chamamos de <em>Máquina de Estados</em>. O diagrama serve para desenhar o conjunto formado por essas relações.</p>
<ul>
<li><strong>Diagramas de Interação</strong></li>
</ul>
<p>Enquanto os Diagramas Estruturais dizem como as coisas são, os de interação dizem como elas se relacionam. Com eles você modela como um tiro afeta o seu alvo, como é construída uma pista de corrida ou como acessar o conteúdo de um baú de tesouro.</p>
<ul><span style="text-decoration: underline;">Diagrama de Sequencia</span></ul>
<p>O Diagrama de Sequencia mostra a interação entre as diversas classes do sistema em um eixo temporal. Com ele você diz, no exemplo da batalha, que a classe de batalha cria uma arena, cria as árvores da arena, cria o rio da arena, cria dois personagems, cria itens e passa-os para os personagens e, finalmente, coloca-os na arena, exibindo em seguida a mensagem “BATALHEM” na tela.</p>
<ul> <span style="text-decoration: underline;">Diagrama de Comunicação</span></ul>
<p>Diagramas de comunicação mostram a interação das classes do sistema como os Diagramas de Sequencia. Porém, ao invés de uma estrutura cronológica, os Diagramas de Comunicação baseiam-se em uma estrutura analítica, como índices de um livro. Antes que pergunte, sim, é praticamente a mesma coisa que o Diagrama de Sequencia, mas a organização (utilizando o exemplo anterior) ficaria algo assim:</p>
<pre>1 A classe de batalha cria uma arena
    1.1 Cria as árvores da arena
    1.2 Cria o rio da arena
2 Cria dois personagems
    2.1 Cria itens
    2.2 Passa-os para os personagens e
3 Coloca os personagens na arena
4 Exibe a mensagem “BATALHEM” na tela.</pre>
<ul><span style="text-decoration: underline;">Diagrama de Interação</span></ul>
<p>Modelamos com o Diagrama de Interação a interação entre os múltiplos Diagramas de Sequencia e de Comunicação que temos em nosso sistema.</p>
<p>Por enquanto é só. Caso alguém tenha alguma dúvida, pode comentar sobre ela. Isso pode até render uma futura parte para a série!</p>
<p style="text-align: right;"><em>Saiba mais! <a href="http://pt.wikipedia.org/wiki/UML" target="_blank">Wikipedia</a> e <a href="http://advanceduml.wordpress.com/" target="_blank">Advanced Unified Modeling Language</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/raios-e-uml-%e2%80%93-parte-2/feed</wfw:commentRss>
		<slash:comments>5</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>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>
		<item>
		<title>Padrões de Projeto: questão de bom senso</title>
		<link>http://www.nusseagora.blog.br/padroes-de-projeto-questao-de-bom-senso</link>
		<comments>http://www.nusseagora.blog.br/padroes-de-projeto-questao-de-bom-senso#comments</comments>
		<pubDate>Tue, 22 Apr 2008 11:52:34 +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[Problemas]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/padroes-de-projeto-questao-de-bom-senso/</guid>
		<description><![CDATA[Tá, eu já falei várias vezes sobre as maravilhas de se usar padrões de projeto, como eles resolvem problemas e coisas do gênero. Porém, fica sempre uma dúvida no ar: quando usar Padrões de Projeto? Os Padrões são receitas prontas e já muito testadas para resolver problemas recorrentes: aqueles que milhares programadores tinham. Logicamente falando, [...]]]></description>
			<content:encoded><![CDATA[<p>Tá, eu já falei várias vezes sobre as maravilhas de se usar padrões de projeto, como eles resolvem problemas e coisas do gênero. Porém, fica sempre uma dúvida no ar: <strong>quando usar Padrões de Projeto?</strong></p>
<p><span id="more-62"></span>Os Padrões são receitas prontas e já muito testadas para resolver problemas recorrentes: aqueles que milhares programadores tinham. Logicamente falando, eles são para <strong>simplificar</strong> a nossa vida. Se você pode dizer <em>"Ih. Já vi isso antes. A gente resolve isso com o State"</em>, não tenha dúvidas em aplicar o padrão. Ele vai fazer maravilhas pelo cronograma e tirar da cabeça dos programadores mais um problema.</p>
<p>Agora... uma coisa ninguém pode negar: padrões, sejam os de projeto quanto arquiteturais, <strong>sempre</strong> complicam programas simples. Se você tem um jogo simples de tabuleiro assim...</p>
<p align="center"><!--[if gte vml 1]> <![endif]--><img src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2008/04/padroes-de-projeto-questao-de-bom-senso1.jpg" alt="Jogo de tabuleiro v1" align="middle" /></p>
<p>... sabe como ele poderá ficará depois de aplicado o MVC?</p>
<p align="center"><!--[if gte vml 1]> <![endif]--><img src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2008/04/padroes-de-projeto-questao-de-bom-senso2.jpg" alt="Jogo de tabuleiro v2" align="middle" /></p>
<p>Não preciso nem perguntar se alguém notou como a complexidade aumentou, né? E olha que o MVC é só um padrão de arquitetura, hein? Imagina ainda adicionar estados para as <em>TPeca</em> e <em>TTabuleiro</em>, um <em>Singleton</em> para a <em>TJogo</em>...</p>
<p>Os padrões de projeto tornam as coisas mais coesas, porém aumentam o acoplamento geral de seu programa, pois as classes de um padrão são extremamente dependentes entre si. Eles aumentam muito a complexidade do código, coisa que muitas vezes não é necessário. Voltando ao exemplo acima, alguém acha necessário aplicar o MVC à um projeto que só tem 3 classes?</p>
<p>Usar Padrões de Projeto é uma questão de <strong>bom senso</strong>: utilize-os só quando eles simplificarem o problema, nunca para jogar mais gasolina no fogo que você tenta apagar, ok?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padroes-de-projeto-questao-de-bom-senso/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Já que o Ano Novo tá ae,…</title>
		<link>http://www.nusseagora.blog.br/ja-que-o-ano-novo-ta-ae</link>
		<comments>http://www.nusseagora.blog.br/ja-que-o-ano-novo-ta-ae#comments</comments>
		<pubDate>Sun, 23 Dec 2007 10:33:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Sobre o Nuss...]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=38</guid>
		<description><![CDATA[... eu tô cheio de recessos no trabalho e ainda se bateu um desespero programístico sobre mim, resolvi implementar uma série de padrões de projeto com uma visão bem voltada para os jogos. Não vou colocar nada aqui ainda, pois estou trabalhando em outras pequenas surpresas que podem vir a aparecer ainda em Janeiro. O [...]]]></description>
			<content:encoded><![CDATA[<p>... eu tô cheio de recessos no trabalho e ainda se bateu um desespero programístico sobre mim, resolvi implementar uma série de padrões de projeto com uma visão bem voltada para os jogos. Não vou colocar nada aqui ainda, pois estou trabalhando em outras pequenas surpresas que podem vir a aparecer ainda em Janeiro.</p>
<p>O ano vai começar com artigos no ritmo do artigo sobre o <a href="http://nusseagora.blogspot.com/2007/09/singleton-limitando-e-distribuindo.html"><span style="font-style:italic;">Singleton</span></a> e o <a href="http://nusseagora.blogspot.com/2007/10/mvc-e-o-linkage-o-que-se-deve-ou-no.html"><span style="font-style:italic;">MVC</span></a>: <span style="font-weight:bold;">explicação do conceito </span>+<span style="font-weight:bold;"> Diagramação UML + Código + comentários</span>. Deixa só passar o ressacão do Reveillon prá gente sacudir isso aqui.</p>
<p>"Boas festas"; "se forem dirigir, não bebam", "Feliz Natal" e todos os outros clichês que estão nos dizendo. Aguardem<a href="void(0)"><span></span></a> o novo ano que vamos ter coisas boas por aqui! Até lá!</p>
<div style="text-align:right;"><span style="font-style:italic;font-size:85%;">P.S.: Esqueci de dizer: caso alguém queira um padrão específico, pode pedir aí. Não garanto que eu consiga trazê-lo pro blog, mas vou fazer de tudo para dissecar o menino!</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/ja-que-o-ano-novo-ta-ae/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Casos de Uso? Mas hein?</title>
		<link>http://www.nusseagora.blog.br/casos-de-uso-mas-hein</link>
		<comments>http://www.nusseagora.blog.br/casos-de-uso-mas-hein#comments</comments>
		<pubDate>Tue, 11 Dec 2007 11:27:00 +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[UML]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=37</guid>
		<description><![CDATA[Tá, tá, foi vacilo meu, mas é que eu nem me toquei que o termo Casos de Uso pudesse significar interrogações pra vários de vocês. Pra resolver isso, ta aí: uma explicação sobre os Casos de Uso!Esses tais Casos de Uso (CdUs daqui pra frente) não são nada mais que cada uma das diversas interações [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Tá, tá, foi vacilo meu, mas é que eu nem me toquei que o termo Casos de Uso pudesse significar interrogações pra vários de vocês. Pra resolver isso, ta aí: uma explicação sobre os Casos de Uso!Esses tais Casos de Uso (CdUs daqui pra frente) não são nada mais que cada uma das diversas interações que o usuário vai ter com o seu programa. Na maioria das vezes, cada tela ou janela diferente significa um CdU diferente, mas como jogos são muito mais complexos, várias vezes tempos diversos CdUs na mesma janela. “Andar com o personagem”, “utilizar magia”, “selecionar alvo”, “pegar item” e “conversar” são diversos CdU que você realiza na mesma tela: a tela de jogo.<span id="more-37"></span></p>
<p>Mas como sempre passo um estudo de caso de exemplo, eu vou escolher o Star Fox 64? O QUÊ?!? VOCÊ NÃO CONHECE O STAR FOX 64?!?!?! Ele é um jogaço de 1997 pro Nintendo 64. Sozinho o jogo já era absurdamente maneiro, mas ficava muito melhor quando você jogava com o Rumble Pack, que tremia o joystick quando você batia ou atravessava uma explosão. Foi um dos melhores na sua época e por isso vou usá-lo, além de ter lembrado dele por qualquer aleatoriedade universal.</p>
<ul>
<li>Descobrindo o jogo:</li>
</ul>
<p>Sempre antes de encontrarmos os CdUs de um programa, precisamos identificar o uso desse programa. Um documento de design do jogo não é muito válido, mas o pessoal do PMBOK pode (E DEVE!) usar a Especificação de Requisitos. Ela é um texto beeeeem parecido com o que eu escrevi aí embaixo pro Star Fox 64</p>
<p>Logo no início do jogo pede-se que você aperte o START para escolher o modo de jogo. Você escolhe um dos diversos modos e confirma novamente. Vamos escolher o modo Main Game, ok? Escolhido seu modo, aparece na tela um Arwing girando e a história do jogo, nada fora do comum. Confirmando de novo, você é jogado na tela do Sistema Solar Lylat, (se não me engano... faz tempo que joguei isso) onde deve-se escolher qual área será seu próximo destino. Caso você tenha mais de um possível destino, pode escolher um deles tranqüilamente. Caso queria refazer a fase anterior, você perderá uma vida.</p>
<p>As fases se dividem em 4 tipos: No Blue-Marine, o submarino, no tanque Landmaster e nas Arwings, as naves, tanto no típico “vai direto pra frente” quanto no “gire por esse lugar até completar a fase”, que eles chamam de all-range mode. O conjunto de ações que você pode realizar depende do tipo de fase, mas normalmente você atira, carrega o tiro teleguiado, lança a bomba, se move, acelera, breca, dá um barrel roll (giro em parafuso) e um loop.</p>
<p>Quando a fase termina, você vê uma tela onde os pilotos conversam e, logo em seguida, o dano das naves de suporte é recuperado baseado na contagem de inimigos que você destruiu na fase. Caso alguma nave tenha sido abatida na fase anterior, ela será recuperada para a próxima.</p>
<p>Com esse basicão aí nós podemos começar a definir alguns dos casos de uso que o Star Fox 64 tem.</p>
<ul>
<li>Descobrindo os CdUs:</li>
</ul>
<p>Já que cada interação é um CdU, vem a hora de definir quais são os nossos CdUs. Lendo o texto, marcamos cada coisa que o usuário pode fazer. Nesse exemplo aí a gente pode tirar:</p>
<p>1. Sair da tela principal<br />
2. Escolher modo de Jogo<br />
3. Cortar introdução<br />
4. Selecionar fase<br />
5. Escolher fase<br />
6. Voltar à fase anterior<br />
7. Atirar<br />
8. Carregar tiro teleguiado<br />
9. Lançar tiro teleguiado<br />
10. Lançar bomba<br />
11. Mover veículo<br />
12. Acelerar<br />
13. Brecar<br />
14. Realizar Barrel Roll<br />
15. Realizar Loop</p>
<p>Nesse curto texto conseguimos identificar 15 interações diferentes, ou seja 15 Casos de Uso diferentes. É importantíssimo deixar claro que, mesmo coisas simples como “acelerar” ou “atirar” não devem ficar por fora da lista: CdU podem ser extremamente simples ou incrivelmente complexos, depende de sua aplicação.</p>
<p>Algumas pessoas trabalham com CdUs extensos, mas eu não gosto de fazer isso. Fica como dica tentar dividir aqueles extremamente complexos em diversos pequenos, como eu fiz na lista. Não há um jogar. Ao invés disso, eu desmembrei ele nas diversas ações que constituem jogar, como Acelerar, Brecar, Atirar e Realizar Loop.</p>
<p>Já com a lista em mãos, precisamos guardar isso tudo de uma forma clara de se entender. É claro que já há uma ferramenta na UML para tal e é dela que vou falar agora. Vamos desenhar isso tudo num Diagrama de Casos de Uso.</p>
<ul>
<li>Desenhando o Diagrama de CdUs (DCU):</li>
</ul>
<p>Um DCU é extremamente simples, porém poderoso. Ele é uma forma infalível de definir o grau de interação com o usuário, o que gera uma maior complexidade na interface. Vale lembrar que a quantidade de CdUs não indica a complexidade lógica de um programa: jogos normalmente possuem uma quantidade de CdU inferior ao número de CdUs, mas de complexidade unitária muito maior.</p>
<p>Para desenhar um DCU, nós jogamos um bonequinho ali que chamamos de ator. É esse ator quem realiza as ações do CdU. Se iniciar sistema é feito só por administrador, temos que ter um ator administrador lá no dagrama. Ah, importante: cada CdU está relacionado com pelo menos um ator, mesmo que indiretamente.</p>
<p>Os CdU são as elipses, cada uma com seu respectivo nome. Todas elas estão dentro do grande retângulo que identifica o escopo do seu sistema: o conjunto de coisas que define tudo aquilo que ele faz e exclui tudo aquilo que ele não irá fazer. No final, nosso DCU fica assim:</p>
<p style="text-align: center"><img src="http://www.brasilvision.com.br/home/tsfrossard/nuss/ArtigoCdU/DCU.jpg" alt="" /></p>
<p>Esse exemplo é bem simples. Podemos ter herança de Casos de Uso, bem como extensão (extends) e inclusão (includes) de casos de uso em outros Casos de Uso (onde a relação fica de CdU para CdU, ao invés de CdU para ator), mas isso já é assunto para um próximo artigo. Até lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/casos-de-uso-mas-hein/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Singleton: Limitando e Distribuindo</title>
		<link>http://www.nusseagora.blog.br/singleton-limitando-e-distribuindo</link>
		<comments>http://www.nusseagora.blog.br/singleton-limitando-e-distribuindo#comments</comments>
		<pubDate>Mon, 24 Sep 2007 11:26:00 +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[Problemas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=26</guid>
		<description><![CDATA[O nosso Jogo tem uma característica muito especial: ele é traduzido dinamicamente, sem a necessidade de recompilação. Para isso, estamos colocando todo o texto em uma classe especial, a TIdioma. O problema é que, se nós estivéssemos utilizando um objeto simples, a cada “new” que déssemos, teríamos uma cópia inútil do objeto ocupando espaço inutilmente. [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><script src="http://rec6.via6.com/link.php?action=widget&amp;url=http://nusseagora.blogspot.com/2007/09/singleton-limitando-e-distribuindo.html" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">O nosso Jogo tem uma característica muito especial: ele é traduzido dinamicamente, sem a necessidade de recompilação. Para isso, estamos colocando todo o texto em uma classe especial, a TIdioma. O problema é que, se nós estivéssemos utilizando um objeto simples, a cada “new” que déssemos, teríamos uma cópia inútil do objeto ocupando espaço inutilmente. Dessa forma, se tivéssemos 500k de texto, poderíamos estar ocupando vários megas da memória.</p>
<p style="text-align: justify">Isso, quando temos um projeto pequeno, não faz tanta diferença: acaba-se sabendo tudo que está ou não na memória, principalmente quando somente um programador fez aquilo tudo. Porém, há uma grande falha de programação: quando agregássemos um novo programador, ele teria que saber TUDO que já foi feito, da forma que foi feita, entendendo a lógica de tudo que já tá pronto para, aí sim, programar sem erros.Para resolver esse problema, o primeiro padrão de projeto que usamos para resolver um problema no Jogo foi o Singleton. Esse padrão GoF garante que a classe possui somente uma instância, criando um ponto de acesso global à ela. Isso é feito da seguinte forma: o programador NÃO cria um objeto daquela classe. Ao invés disso, a própria classe testa se ela possui uma instância dela mesma. Em caso negativo, a classe cria e retorna essa instância para o programador; em caso positivo, ela simplesmente retorna essa instância já criada.</p>
<p>Utilizamos esse tal de Singleton para garantir que, durante toda a execução do nosso programa, tivéssemos somente uma ÚNICA classe de tradução jogada na memória. Ela é criada no início do programa e, então, todo acesso à TIdioma é realizado via um ponteiro para ela.</p>
<p>O singleton pode ser aplicado à qualquer classe que você queira limitar. Abaixo vai o código genérico que deve ser aplicado:</p>
<pre class="brush:java">package
{
	public class TSingleton
	{
		// Atributo de instância
		private static var _instancia:TSingleton = new TSingleton();</pre>
<p>Esse atributo _instancia é a chave toda do Singleton e será explicado mais abaixo. O interessante é ver que, com o = new TSingleton(); a instância é inicializada na hora da criação do objeto.</p>
<pre class="brush:java">		 // Atributo de teste
		private var _valor:int;</pre>
<p>_valor é um atributo qualquer. Vamos usar aqui só para testar o funcionamento do padrão Singleton.</p>
<p>O construtor de uma classe Singleton deveria, por definição, ser protegido, para que, ao tentar usá-lo, o compilador desse um erro. Porém, o Action Script 3.0 NÃO PERMITE construtores privados. Como resolver isso?</p>
<pre class="brush:java">		 //-----------------------------------------------------------
		public function TSingleton()
		{
			if (_instancia)
				throw new Error("Uso: TSingleton.Instancia.Metodo()");
		}</pre>
<p>Quando _instancia é iniciada lá em cima, na criação da classe, o construtor é chamado a 1ª e única vez. Todas as outras vezes que alguém tentar construir na mão a classe, o teste é vai garantir que não seja possível criar uma segunda instância.</p>
<p><span style="font-style: italic">“Mas Tiago, se eu num posso chamar o construtor, como que eu vou criar um objeto da TSingleton???</span>”. Isso é fácil. Você <span style="font-weight: bold">NÃO CRIA!</span> “<span style="font-style: italic">Mas hein?!?</span>”</p>
<pre class="brush:java">		//-----------------------------------------------------------
		// Esse método é o que iremos chamar daqui pra frente
		 // ao invés do construtor da classe
		public static function get Instancia():TSingleton
		{
			return TSingleton._instancia;
		}</pre>
<p>Toda vez que você precisar acessar um método de uma classe com o Singleton (no nosso caso, a própria TSingleton), você vai usar pela linha TSingleton.Instancia.Metodo() (onde Metodo() é qualquer método da classe), garantindo que em <span style="font-weight: bold">TODAS AS VEZES</span> você está acessando a mesma instância. Abaixo, mais 2 outros métodos de teste.</p>
<pre class="brush:java">		//-----------------------------------------------------------
		// Método simples para retornar um atributo qualquer,
		// nesse caso, ‘valor’
		public function Valor():int
		{
			return this._valor;
		}

		//-----------------------------------------------------------
		// Como o método anterior, mas agora setando o valor do
		// atributo
		public function SetarValor( valor:int )
		{
			 this._valor = valor;
		 }
		//-----------------------------------------------------------
	}
}</pre>
<p>Agora vai uma classe extra mostrando como usar uma classe com o padrão Singleton. A lógica de uso, nesse caso específico, está imbutida no construtor da classe, mas poderia estar em qualquer local.</p>
<p>Explicando passo a passo:</p>
<pre class="brush:java">import TSingleton;</pre>
<p>TODA classe que terá visibilidade de Singleton DEVE incluí-la. Dessa forma, mesmo sendo uma classe Global, áreas do programa que NÃO deveriam vê-la, NÃO verão. Isso evita muitos problemas de acoplamento, efeitos colaterais e melhora muito a reutilização.</p>
<pre class="brush:java">public function TPrincipal()

{

	// Provocando o erro:

	//var teste:TSingleton = new TSingleton();

	TSingleton.Instancia.SetarValor(345);

	this.Exibe();

}</pre>
<p>Como o construtor da TSingleton está protegido do acesso do programador, usar var teste:TSingleton = new TSingleton() vai resultar no erro:</p>
<p><span style="font-style: italic"> </span></p>
<p>Error: Uso: TSingleton.Instancia.Metodo()</p>
<p>at TSingleton$iinit()</p>
<p>at TPrincipal$iinit()</p>
<p>Lembrando que Uso: TSingleton.Instancia.Metodo() é a string que passamos para throw new Error lá no construtor de TSingleton, permitindo que vocês troquem a mensagem para algo mais descritivo, caso queiram.</p>
<p>Só para terminar, eu ressalto que esse é somente um dos vários algoritmos diferentes para o Singleton que vocês podem encontrar aí pela internet. Ele foi criado pelo Douglas prá nossa TIdioma há algumas poucas semanas, pois nenhum dos que encontramos era satisfatório o suficiente. Alguém aí tem mais algum exemplo do Singleton?</p>
<p><span style="font-size: 85%"><br />
</span></p>
<p><span style="font-size: 85%"> </span></p>
<p>PS.: Aqueles que querem mesmo testar o Singleton, os arquivos estão <a href="http://www.brasilvision.com.br/home/tsfrossard/nuss/Arquivos/Singleton.rar">aqui ó</a>. Download Action Script 3.0 Singleton class (portuguese) <a href="http://www.brasilvision.com.br/home/tsfrossard/nuss/Arquivos/Singleton.rar">here.</a> Saiba mais: <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Wikipedia</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/singleton-limitando-e-distribuindo/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

