<?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; Problemas</title>
	<atom:link href="http://www.nusseagora.blog.br/category/problemas/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>&#8220;Talvez normalizar não seja normal&#8221;</title>
		<link>http://www.nusseagora.blog.br/talvez-normalizar-nao-seja-normal</link>
		<comments>http://www.nusseagora.blog.br/talvez-normalizar-nao-seja-normal#comments</comments>
		<pubDate>Thu, 10 Jul 2008 21:17:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Artigos Exteriores]]></category>
		<category><![CDATA[Gerência de Projetos]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[bancos de dados]]></category>
		<category><![CDATA[normalização]]></category>
		<category><![CDATA[projeto de sistemas]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/talvez-normalizar-nao-seja-normal/</guid>
		<description><![CDATA[Hoje vai mais um lembrete que propriamente um artigo: a idéia dele me foi mandada pelo Mário. Ele me mandou esse artigo em inglês lá do Coding Horror que mostra problemas causados pela extrema normalização em Banco de Dados. Prestem bastante atenção quando o Jeff Atwood diz que "você deve normalizar quando os dados te [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vai mais um lembrete que propriamente um artigo: a idéia dele me foi mandada pelo <a href="http://vovoviuarede.blogspot.com/" target="_blank">Mário</a>. Ele me mandou <a href="http://www.codinghorror.com/blog/archives/001152.html">esse</a> artigo em inglês lá do <a href="http://www.codinghorror.com/blog/" target="_blank">Coding Horror</a> que mostra problemas causados pela extrema normalização em Banco de Dados.</p>
<p>Prestem bastante atenção quando o Jeff Atwood diz que "você deve normalizar quando os dados te disserem para fazê-lo" e não simplesmente por ser mais elegante ou teoricamente correto. Isso <strong>não</strong> significa que seu código deva ser anárquico, completamente contrário às regras de boa programação, e sim que ele seja <strong>adequado </strong>ao que escopo que o projeto prevê.</p>
<p>Para quem quiser mais informação sobre essa lógica, coloquei aqui no <em>Nuss... e Agora?!?</em> há algum tempo o artigo <a href="http://nusseagora.blog.br/wp-admin/Padr%C3%B5es%20de%20Projeto:%20quest%C3%A3o%20de%20bom%20senso" target="_blank"><em>Padrões de Projeto: questão de bom senso</em></a>. Ele fala exatamente sobre essa briga entre os pontos de vista de "<em>faça por ser útil</em>" e "<em>faça por ser elegante</em>" focado na análise de sistemas.</p>
<p>Lembrem-se: <em>"Adequação, não perfeição"</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/talvez-normalizar-nao-seja-normal/feed</wfw:commentRss>
		<slash:comments>1</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>Post mortem de um projeto que não nasceu</title>
		<link>http://www.nusseagora.blog.br/post-mortem-de-um-projeto-que-nao-nasceu</link>
		<comments>http://www.nusseagora.blog.br/post-mortem-de-um-projeto-que-nao-nasceu#comments</comments>
		<pubDate>Sat, 29 Mar 2008 15:29:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Gerência de Projetos]]></category>
		<category><![CDATA[Problemas]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/post-mortem-de-um-projeto-que-nao-nasceu/</guid>
		<description><![CDATA[Aí eu vejo pessoas na Unidev que ridicularizam os novatos com o já clássico "vou fazer um MMORPG". Ta, é realmente absurdo ver um cara falar "sou iniciante" e "quero fazer um MMOG" na mesma sentença. É como entrar na faculdade de engenharia e querer montar no quintal de casa a torre mais alta do [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify">Aí eu vejo pessoas na Unidev que ridicularizam os novatos com o já clássico <em>"vou fazer um MMORPG"</em>. Ta, é realmente absurdo ver um cara falar "sou iniciante" e "quero fazer um MMOG" na mesma sentença. É como entrar na faculdade de engenharia e querer montar no quintal de casa a torre mais alta do mundo.Agora, sejamos francos: os caras são iniciantes e, graças aos programistas de revistinha de banca, o mercado foi banalizado: qualquer um acha que é muito fácil fazer qualquer coisa. Então, ao invés de metralhar (mais) os sujeitos falando <em>"isso não vai ser terminado"</em>, pq não dizer pra eles <em>"por quê não vão terminar"</em>?</p>
<p>É pra isso que eu vou começar essa lista e esperar que vocês a debatam, enfeitem, critiquem e aumentem. Eu vou editando assim que novas coisas forem surgindo e espero que tenhamos uma lista bem grande de motivos com os quais se preocupar. Ah, é claro, é também pra ter uma lista para linkar toda vez que alguém vier com mais um <em>"eu sou iniciante mas vou fazer um MMORPG".<br />
</em><span id="more-60"></span><br />
Então, vamo lá. Listando sem ordem de prioridade, os erros mais comuns nos quais consigo pensar:</p>
<ul class="unIndentedList">
<li> pessoas querendo "ajudar" ou "dar idéias" não são úteis ao projeto por incharem demais o design: se você não tá dando conta de fazer tudo a tempo, não vai terminar nunca com aquele "eu tive uma idéia boa..." adicional toda semana. Um design é o que deve ser seguido e terminado. Aí sim arruma-se mais coisa prá fazer.<br />
<em><br />
Links relacionados:<br />
<a href="http://nusseagora.blogspot.com/2007/08/design-inchado-voc-est-fazendo-seu_03.html" target="_blank">Design Inchado</a></em></li>
</ul>
<ul class="unIndentedList">
<li> se já é difícil gerenciar muitos profissionais que ganham e trabalham 6h por dia juntos, imagina 30 profissionais que nunca se viram e tão trabalhando no período de lazer... <strong>DUVIDO </strong>que alguém deixe de ir àquela festa fodônica no fim de semana, ou deixe de assistir aquele filme pela 15a vez só pq o seu cronograma tá apertado. Ah, falando nele...<br />
<em><br />
Links Relacionados:<br />
<a href="http://nusseagora.blog.br/wp-admin/vide%20http://nusseagora.blogspot.com/2007/09/atraso-em-projetos-de-horas-vagas-ou.html" target="_blank">Atraso em Projetos de Horas Vagas</a></em></li>
</ul>
<ul class="unIndentedList">
<li> Inexistência completa, total e absoluta de um cronograma a se seguir. O cronograma é uma tabelinha que, resumidamente, diz quem tá fazendo o que, há quanto tempo tá fazendo e quando tem que terminar de fazer. Assim vocÊ controla o que tá atrasando mais e quem tá à toa, podendo ser empregado em outra parte do projeto. Cronogramas nesses projetos são tão raros quanto lançamentos para Atari.</li>
</ul>
<ul class="unIndentedList">
<li> Os grupos são sempre uma porrada de profissionais de conhecimento, no máximo, mediano. Um jogo é algo avançado e extremamente difícil de ser feito até mesmo quando todo engambiarrado.</li>
</ul>
<ul class="unIndentedList">
<li> Cadê a <em>Especificação de Requisitos</em>? Somente um <em>"vamos fazer um jogo"</em> é absurdamente raso. É difícil achar alguém com conhecimento profundo das tecnologias que vão ser utilizadas nem do público alvo ao qual se destina. Isso, claro, sem falar no design básico: como o jogo vai ser, o que ele vai ser e como vão jogá-lo. Isso tudo se reflete nos profissionais que se consegue. Acaba-se criando o que eu chamo de <strong>projeto Torre de Babel</strong>: você tem umas 30 linguagens de programação diferentes e artistas em 2d, 3d, 4d e 5d.<br />
<em><br />
Links Relacionados</em><br />
<a href="http://nusseagora.blog.br/a-roda-do-tempo-parte-2/" target="_blank"><em>A Roda do Tempo</em></a></li>
</ul>
<ul class="unIndentedList">
<li> Gerência é algo em 15º plano. <em>"Gerência? Não não, queremos só fazer um jogo"</em>. Quando muito, o cara que resolve juntar o pessoal saca um cado de programação. Sem gerência nada vai pra frente: você precisa impor limites, cobrar resultados e motivar pessoas. Precisa mover recursos, precisa solucionar problemas. Isso tudo requer estudo profundo e extenso ou então esteja preparado para muita bateção de cabeça.</li>
</ul>
<p>Algumas coisas aí estão realmente necessitando de uma explicação mais profunda, como o <em>Cronograma</em>. Por isso, assim que eu abordar esses documentos de desenvolvimento aqui, prometo eu linká-los diretamente aqui.</p>
<p>Além disso, peço que vocês também enviem-me links sobre os tópicos aqui relacionados, fazendo essa biblioteca crescer cada vez mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/post-mortem-de-um-projeto-que-nao-nasceu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mais problemas… E agora?!?</title>
		<link>http://www.nusseagora.blog.br/mais-problemas-e-agora</link>
		<comments>http://www.nusseagora.blog.br/mais-problemas-e-agora#comments</comments>
		<pubDate>Thu, 15 Nov 2007 16:44:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Problemas]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=33</guid>
		<description><![CDATA[Nesse exato momento, estamos tentando resolver um problema meio chatinho. Até então, estávamos desenvolvendo o Jogo SEM a camada de Armazenamento, já que isso simplifica (e muito) o nosso trabalho. Para acessar as cartas do BD, usávamos métodos com lógica falsa que simulava um acesso ao Armazenamento, mas que, na realidade, construíam tudo o que [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:justify;">Nesse exato momento, estamos tentando resolver um problema meio chatinho. Até então, estávamos desenvolvendo o Jogo SEM a camada de Armazenamento, já que isso simplifica (e muito) o nosso trabalho. Para acessar as cartas do BD, usávamos métodos com lógica falsa que simulava um acesso ao Armazenamento, mas que, na realidade, construíam tudo o que era pra ser construído diretamente em código.</p>
<p>Eu vi um leitor ali com cara de “oO?”. Xô passar um exemplo: A gente tem um método BuscarCartas() que deveria ir à camada de Armazenamento e materializar todas as cartas para que a interface pudesse desenhá-las. DEVERIA, mas não está fazendo isso. Pelo contrário: BuscarCartas() está cheia de linhas de código que criam diretamente aquele monte de cartas que deveriam ter sido buscadas no Armazenamento.</p>
<p>“Ta Tiago, mas qualé o problema disso?”. O problema é que o exemplo cresceu demais. Antes isso funcionava perfeitamente, pois ainda estávamos acertando o funcionamento básico da interface e as interações dela com a lógica do caso de uso Batalhar. Agora que precisamos trabalhar corretamente com a diversidade de cartas entre os jogadores, o troço não dá vazão: temos que ficar criando métodos falsos um em cima do outro, o que tem me deixado com medo. No final, se esse monte de métodos continuar crescendo, pode dificultar muuuuito a inserção da camada de Armazenamento.</p>
<p>Ainda não está nada certo, mas o Douglas deu a idéia de utilizar um padrão chamado Database Broker (ou só DB Broker), uma Indireção entre a camada de Armazenamento e o resto do programa. Assim, uma vez criado o DBBroker, todos os acessos ao armazenamento vão ser realizados por ele, bem como funciona com a Controladora. Independente de como seja implementado o Armazenamento, basta trocar a lógica dos métodos do DBBroker que tudo está 100% funcional.</p>
<p>“E por que fazer isso?” Pois nosso BD vai ser inicialmente uma tabelona XML mesmo. Estamos tendo trabalho suficiente com a interface e a interação dela com a lógica para implementarmos um BD distribuído. Somos só 3, nada de inchar o design <img src='http://www.nusseagora.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>P.S.: Caso algum de vocês leitores já passaram por algum problema do gênero, agradeceria muito se rolasse uma ajuda com esse problema!</p>
<p>P.S.2: Desculpem pela falta de matérias, mas realmente não tô tendo muito sobre o que postar: graças à esse rolo, não muito tem acontecido no Jogo. Pelo menos, a solução vai virar um outro artigo.</p>
<p>P.S.3: Não não, realmente prefiro o Wii. - Já vi  isso em algum outro lugar <img src='http://www.nusseagora.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   </div>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/mais-problemas-e-agora/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MVC e o Linkage: O que se deve ou não fazer? (parte 2)</title>
		<link>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-2</link>
		<comments>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-2#comments</comments>
		<pubDate>Sat, 20 Oct 2007 13:52:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[O Jogo]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Linkage]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Padrões de Arquitetura]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Unified Modelling Language]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=31</guid>
		<description><![CDATA[Agora que todos já sabem como funciona o MVC, vou continuar com a 2a e última parte do artigo. Hoje vou mostrar os pontos positivos e negativos da implantação da arquitetura, além de finalmente mostrar o que isso tudo tem a ver com o Linkage. Pontos positivos: Abstração e desacoplamento das camadas Quando estamos programando [...]]]></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/10/mvc-e-o-linkage-o-que-se-deve-ou-no_20.html" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">Agora que todos já sabem como funciona o MVC, vou continuar com a 2a e última parte do artigo. Hoje vou mostrar os pontos positivos e negativos da implantação da arquitetura, além de finalmente mostrar o que isso tudo tem a ver com o Linkage.</p>
<p>Pontos positivos:</p>
<ul>
<li>Abstração e desacoplamento das camadas</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Quando estamos programando a interface do problema, não nos preocupamos com a programação da lógica dele, somente com o que vai e o que vem dela. Dessa forma, podemos facilmente simular todo o funcionamento da lógica do programa com uma classe de testes que simula o funcionamento da lógica. Esse é o conceito de <em>caixa preta</em>, importantíssimo para o bom funcionamento de um software.</p>
<ul>
<li>Facilidade de manutenção</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Graças a esse desacoplamento, é <strong>muito mais</strong> fácil realizar a manutenção de um programa desses. Se for um problema visual, você vai à camada responsável pelo visual do programa e pronto, corrige. Se for um problema de lógica, é na lógica que você buscará a solução. Além disso, graças ao padrão <em>Controlador</em> (<em>Controller</em>), você pode apagar <strong>toda </strong>uma janela sem perder <strong>nada</strong> de sua implementação.</p>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Quem está acostumado a adicionar código em um botão sabe exatamente o trabalho que isso ta poupando, mas para quem não está, aí vai um exemplo. Sabe esse Mario 2 que refizeram em 3D pro Nintendo DS? Se eles não usaram o MVC para fazer o original, perderam uma gigantesca parte da lógica do programa só por trocar a interface. Em compensação, usando o MVC de forma correta eles trocariam toda a interface sem mexer em 1 linha da lógica.</p>
<ul>
<li>Possibilidade de Expansão</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">A estrutura de camadas proposta no MVC pode (e deve) ser expandida: criar mais camadas aumenta a coesão e diminui o acoplamento, organizando melhor o seu código. No jogo, por exemplo, além da Lógica e da Interface, temos a camada de Comunicação (rede) e a camada de Armazenamento (Banco de Dados), além das camadas entre elas. Um outro jogo pode, por exemplo, ter uma camada de IA, uma camada de hardware e uma camada de comunicação com outro jogo. O nosso, inicialmente, está assim:</p>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify"><img class="aligncenter size-full wp-image-910" title="piramide" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2007/10/piramide.jpg" alt="piramide" width="450" height="228" /></p>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">As camadas se comunicam através de <em>Indireções</em>, como os já citados padrões <em>Controlador</em>, <em>Proxy </em>e <em>DBBroker</em>. Isso claro, pode mudar durante a análise de <em>Casos de Uso</em> mais avançados, mas inicialmente, essa é a idéia. Além disso, o funcionamento desses padrões vai ficar para futuros artigos.</p>
<ul>
<li><!--[if !supportLists]-->Facilidade de realização de testes</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Com o programa modularizado, podemos criar classes de teste que rodam nosso programa à exaustão, podendo encontrar bugs estatisticamente impossíveis de encontrarmos. Mas sabe qual é o melhor? Você pode testar isso tudo sem ter NADA de interface pronta: a lógica fica tão independente que chega a funcionar sem a interface. Então não precisamos esperar que o pessoal do desenvolvimento resolva aquele problema dos relatórios para que o pessoal do teste disseque nosso <em>Caso de Uso</em>. Maneiro, não?</p>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Pontos negativos:</p>
<ul>
<li><!--[if !supportLists]-->Programação complexa</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">A programação torna-se mais complexa quando aplicamos o MVC. Chamadas consecutivas e abstração do código são extremamente importantes. Além disso, uma documentação de todo o projeto é imprescindível para que as camadas sejam mapeadas e seguidas da forma correta. Além disso, teremos o...</p>
<ul>
<li><!--[if !supportLists]-->Uso extensivo de padrões de projeto</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">O MVC simples já dita o uso do padrão <em>Controller</em>. Expandindo camadas de Comunicação e Armazenamento, ainda usaremos <em>Proxies</em> como o <em>Remote Proxy</em> e <em>Database Brokers</em>. Para desacoplar essas camadas, criaremos várias classes baseadas nos padrões <em>Indireção</em> (usado para desacoplar 2 classes que não deveriam ter visibilidade entre si) e <em>Invenção Pura</em> (padrão que adiciona classes que não estão diretamente ligadas ao problema em si, mas que facilitam a solução dele). No final, a relação entre as classes é bem mais burocrática</p>
<ul>
<li><!--[if !supportLists]-->Dependência do MVC na portabilidade</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Para poder portar um código MVC de forma correta, o programa que irá recebê-lo precisa trabalhar nos moldes do MVC. Por exemplo, se estamos portando uma janela de cadastro de cliente já pronta para um programa parecido, ele tem que estar modularizado de forma a trabalhar com a classe Controladora para que a manutenção seja mínima. Isso causa uma certa dependência à estrutura.</p>
<ul>
<li><!--[if !supportLists]-->Queda de performance</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">As mensagens trocadas navegam entre camadas de forma burocrática e indireta, o que faz com que os programadores “performance acima de tudo” reclamem bastante. Por exemplo, uma chamada a uma função que seria direta numa programação estruturada torna-se uma cadeia de várias subchamadas a métodos que somente levam a chamada para a próxima camada nessa estrutura, como vocÊs viram no diagrama de seqüência lá em cima.</p>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">A performance perdida está longe de ser relevante, principalmente com os processadores de hoje em dia, mas mesmo assim continua sendo um ponto negativo da arquitetura.</p>
<p class="MsoNormal" style="text-align: justify"><em>“Ta, ta, eu entendi o MVC. Mas o quê que o Linkage tem à ver com isso???”</em> O linkage do Flash é uma facilidade ao trabalhar com a interface, pois permite que uma classe use os atributos do MovieClip como se fossem atributos de si mesma. A grosso modo, parece muito uma herança de atributos e métodos públicos. O maior problema é que, se não tomarmos cuidado, <strong>acabamos destruindo toda a modularidade do MVC</strong>.</p>
<p class="MsoNormal" style="text-align: justify">O linkage só deve ser usado para que as classes de interface controlem os MovieClips relacionados à elas. No nosso jogo, temos as classes <em>TCarta</em> e <em>TCartaAvatar</em>, ambas controlando uma carta em  jogo. A diferença é que, seguindo o MVC, modularizamos uma carta em 2 camadas:</p>
<ul>
<li><!--[if !supportLists]--><!--[endif]-->TCarta</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Controla a <strong>lógica</strong> da carta: os atributos, as contas, o dano que ela recebe, se ela está no <em>Deck</em>, na <em>Mão</em>, em <em>Jogo</em> ou no <em>Cemitério</em> e coisas do gênero.</p>
<ul>
<li><!--[if !supportLists]-->TCartaAvatar</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Controla todos os efeitos visuais da carta. É ela que desenha a marcação do mouse sobre a carta, quem coloca a carta em qualquer posição, que inicia/pára o arrastar, que gera os efeitos de dano e desenha na tela todos os atributos buscados de TCarta.</p>
<p class="MsoNormal" style="text-align: justify">Dessa forma, podemos trocar completamente a interface sem mexer nas classes de lógica. Trocar para Papervision 3D, a Plasticvision 4D, a Metalvision 5D ou até mesmo OpenGL ou ClosedLG, no nosso projeto, é muuuito mais simples: basta que criemos as mesmas classes de Interface, mas agora programadas com a nova interface. MOLEZA.</p>
<p class="MsoNormal" style="text-align: justify">Essa portabilidade ainda pode ser da interface para a lógica: nossas cartas são arrastadas independente da lógica, elas brilham independente dlógica, elas se movem independente da lógica. Basta chamar os métodos da classe de Interface na hora certa, seja em Action Script 3.0 ou qualquer outra linguagem que o Flash suporte mais pra frente.</p>
<p>Caso uma única classe fosse responsável por isso tudo, durante uma troca de interface ou na hora de portar um trecho do código, a manutenção seria muito mais complicada: você deveria ficar movendo/apagando métodos das classes de lógica. Isso claro, pois estou pensando numa classe bem feita, com métodos bem estruturados. Muitas vezes, o que você encontra são linhas de interface no meio da lógica. Aposto que vários de vocês já viram um “se (this.morto) rode (“AnimacaoMorto”)”. Imaginem trocar o código para o futuro suporte OpenGL nesse caso...</p>
<p class="MsoNormal" style="text-align: justify">Se vocês já pegaram o esquema do MVC e da expansão que fizemos, criando a camada de Armazenamento, já sacou que a carta também terá uma camada de armazenamento. Ela não está implementada ainda, mas seria mais ou menos assim:</p>
<ul>
<li><!--[if !supportLists]--><span><span><span> </span></span></span><!--[endif]-->TCartaDados</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Seria a classe responsável por <em>materializar </em>e<em> desmaterializar</em> a Carta. Pra quem não sabe, <em>materializar</em> é buscar os dados de um objeto no BD e criá-lo em memória e <em>desmaterializar</em> é jogar no BD, destruindo o objeto da memória. Essa classe também seria responsável por todos os outros métodos possíveis</p>
<p class="MsoNormal" style="text-align: justify">Gente, de todos os artigos que fiz até agora, esse foi de longe o que eu mais gostei de escrever. Espero, por meio desse, ajudar a derrubar essa história de que o Action Script é uma linguagem de 2<sup>a</sup> linha e que jogo em Flash é um amontoado de gambiarras. Espero também incentivar os leitores a escrever sobre qualidade de software em AS. Dá mais trabalho na hora de programar, mas esse trabalho é recompensado na hora de reutilizar o código em diversos outros projetos. Pensem nisso e até a próxima!</p>
<p>[EDIT] Não se esqueça de conferir o resto do artigo! <a href="http://nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-1/" target="_blank">Parte 1</a> e <a href="http://nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-3/" target="_blank">Parte 3</a>, valeu?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-2/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MVC e o Linkage: O que se deve ou não fazer? (parte 1)</title>
		<link>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-1</link>
		<comments>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-1#comments</comments>
		<pubDate>Wed, 17 Oct 2007 11:32:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[O Jogo]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Linkage]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Padrões de Arquitetura]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Unified Modelling Language]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=30</guid>
		<description><![CDATA[Eu acredito que muita gente vai me chamar de maluco depois desse artigo, mas espero que todos entendam. Pra começar, vamos falar do MVC (ou Model-View-Controller), uma arquitetura de software baseado na idéia de interações emtre camadas de alta coesão (fazem exatamente aquilo que se propõem a fazer e nada mais que isso) e baixo [...]]]></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/10/mvc-e-o-linkage-o-que-se-deve-ou-no.html" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">Eu acredito que muita gente vai me chamar de maluco depois desse artigo, mas espero que todos entendam. Pra começar, vamos falar do MVC (ou <em>Model-View-Controller)</em>, uma arquitetura de software baseado na idéia de interações emtre camadas de <em>alta coesão</em> (fazem exatamente aquilo que se propõem a fazer e nada mais que isso) e <em>baixo acoplamento</em> (são o mais independentes possível entre si).</p>
<p style="text-align: justify"><em>“CALMAÊ!!!! QUE NEGÓCIO É ESSE DE ARQUITETURA??? O MVC NÃO É UM PADRÃO DE PROJETO???”</em> Pois então, como eu disse, muita gente vai me chamar de maluco... Deixa eu explicar:Eu já vi vários sites, artigos e livros chamando o MVC de várias coisas. Já vi chamando de <em>padrão de projeto</em>, com o que eu não concordo. Ele não é um <em>padrão de projeto</em> pelo fato de organizar todo um sistema, não somente um bloco ou pequeno problema. Além disso, para implementar o MVC nós precisamos utilizar <em>padrões</em>, como o <em>controlador </em>(<em>Controller</em>).</p>
<p>Pensando nisso, algumas pessoas começaram a chamá-lo de <em>meta-padrão</em>, coisa que ele não é. Um meta-padrão definiria o comportamento dos <strong>padrões</strong>, não de <strong>toda a</strong> <strong>arquitetura</strong>.</p>
<p>O MVC é isso: ele define como as classes vão se comportar, ditando quem fica onde, faz o quê e, o mais importante, o por quê disso ser assim, bem como faz uma planta de uma casa. Por isso é que, em vários locais (como aqui no <em>Nuss</em>), vocês vão encontrar o MVC como uma <strong>arquitetura de software</strong>.</p>
<p>Isso é um ponto de vista, não chega a influenciar diretamente no uso do MVC. Mas é importante explicar para que ninguém saia com “cara de LG”. Beleza? Então continuemos com o artigo.</p>
<p>Voltando às camadas, é como se você transformasse o software no corpo humano: separasse os ossos e delegasse a eles a sustentação do corpo, o sangue ficaria com o transporte de substâncias pelo organismo e o sistema neurológico se responsabilizasse pela propagação das sensações e ordens do cérebro. É claro que as funções não são bem essas, mas é assim que as coisas funcionam.</p>
<p>O MVC em nosso jogo fica assim:</p>
<p><img class="aligncenter size-full wp-image-904" title="camadas" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2007/10/camadas.jpg" alt="camadas" width="175" height="341" /></p>
<p class="MsoNormal" style="text-align: justify">Com esse diagrama eu posso falar da maior característica do MVC: <strong>Toda e qualquer camada só se comunica com as camadas imediatamente abaixo de si</strong>. Lembrando-se que, para evitar dúvidas, quanto mais próxima do usuário, mais “alta” ou “alto nível” está a camada. Nota-se que <strong>nenhuma</strong> classe da Lógica realiza chamadas à classe Controladora da mesma forma que a classe controladora <strong>não </strong>realiza chamadas à Interface. Além disso, a Interface <strong>não </strong>chama diretamente método algum da Lógica: isso é feito através da <em>classe Controladora</em>, como mostra o <em>Diagrama de Seqüência</em><!--[if gte vml 1]&amp;gt;   &amp;lt;![endif]--><!--[if !vml]--> a seguir:</p>
<p class="MsoNormal" style="text-align: center;"><a href="http://nusseagora.dominiotemporario.com/wp-content/uploads/2007/10/sequencia.jpg"><img class="aligncenter size-full wp-image-905" title="sequencia" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2007/10/sequencia.jpg" alt="sequencia" width="540" height="270" /></a></p>
<p class="MsoNormal" style="text-align: justify">No MVC, cada camada tem uma função específica:</p>
<p style="text-align: justify">
<ul>
<li class="MsoNormal"><em><span>Model</span></em><span> (Modelo / Lógica)</span></li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Essa é a camada de negócios, onde está toda a lógica do teu sistema. No Jogo, por exemplo, é onde estão as classes <em>TCarta</em>, <em>TPersonagem</em>, <em>TLadrilho</em> e todas as outras relacionadas ao funcionamento do núcleo do Jogo (ou <em>engine</em>, se preferir).</p>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">
<ul>
<li class="MsoNormal"><em>View</em> (Visão / Interface)</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">Na camada de visão você não encontra NADA além das classes de interface com o usuário. <em>TCartaAvatar</em>, <em>TPersonagemAvatar</em> e <em>TLadrilhoAvatar</em> são exemplos de classes que, no Jogo, ficam na Interface. Outras classes que estão aqui são a <em>TIdioma</em> (que controla todos os textos do programa) e a <em>TJukeBox </em>(recém implementada, que controla todos os sons do jogo)</p>
<p style="text-align: justify">
<ul>
<li class="MsoNormal">Controller (Controladora)</li>
</ul>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">A controladora é uma camada intermediaria entre a <em>Lógica</em> e a <em>Interface</em>, que faz somente a propagação das mensagens da interface para a lógica, visto que a lógica <strong>não pode</strong> se comunicar com a interface.</p>
<p class="MsoNormal" style="margin-left: 18pt; text-align: justify">A continuação do artigo, com os prós e contras da arquitetura, além do que o Linkage do flash tem a ver com isso vai ficar para o próximo. Então gente, até lá!</p>
<p align="right"><em>[EDIT] Seguem os links para as Partes <a href="http://nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-2/" target="_blank">2</a> e <a href="http://nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-3/" target="_blank">3</a> do artigo.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-1/feed</wfw:commentRss>
		<slash:comments>3</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>
		<item>
		<title>Padrões de Projeto: O que são e pra que servem?</title>
		<link>http://www.nusseagora.blog.br/padroes-de-projeto-o-que-sao-e-pra-que-servem</link>
		<comments>http://www.nusseagora.blog.br/padroes-de-projeto-o-que-sao-e-pra-que-servem#comments</comments>
		<pubDate>Sun, 16 Sep 2007 14:46:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=24</guid>
		<description><![CDATA[Quando começamos o projeto em Action Script 2.0, começamos a ter problemas com o Flash, já que não tínhamos prática para montar um projeto mais robusto. Foi quando o Douglas (naquela época o Mário não estava ainda com a gente) começou a recorrer aos grandes fórums sobre o assunto, para resolver problemas de boa programação. [...]]]></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/quando-comeamos-o-projeto-em-action_16.html" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">Quando começamos o projeto em Action Script 2.0, começamos a ter problemas com o Flash, já que não tínhamos prática para montar um projeto mais robusto. Foi quando o Douglas (naquela época o Mário não estava ainda com a gente) começou a recorrer aos grandes fórums sobre o assunto, para resolver problemas de boa programação. Depois das 4 primeiras respostas, o meu mundo mudou completamente.</p>
<p class="MsoNormal" style="text-align: justify">Foi impossível não notar uma característica chave em todos os locais onde procuramos informações: os “grandes usuários” desses locais não sabiam absolutamente NADA de <em>POO</em> (Programação Orientada a Objetos) e SEMPRE criticavam nosso código, dando para a gente uma solução POG (Programação Orientada à Gambiarras).</p>
<p class="MsoNormal" style="text-align: justify"><em>“Tiago, você está falando a maior besteria da tua vida”</em> vocês podem dizer, mas antes de qualquer coisa, o exemplo clássico do que eu estou falando foi quando estávamos com o clássico problema de escopo do AS2.0, onde o “this” dentro de um método sobrecarregado apontava para a classe de onde ele veio, ao invés de apontar para a classe que o sobrecarregava. Antes de encontrarmos o <em>Ellipsis</em> (um pacotão de atualizações) e a classe <em>Delegate</em>, nos foi dada a seguinte resposta por um dos “grandes usuários”: <em>“Teu código está muito burocrático. Pega todos os métodos, bota num script na 1ª frame que ele vai funcionar”</em>. Lindo, não???</p>
<p class="MsoNormal" style="text-align: justify">É CLARO que eu não vou falar onde nem quem mandou fazermos tamanha bizonhice, mas não posso deixar de comentar a baixa qualidade geral dos códigos que vejo por aí. Variáveis Globais pra tudo q é lado, programação monolítica (um arquivo único de 15mil linhas) e, principalmente, ignorância absoluta sobre a existência dos <em>Padrões de Projeto</em>, o básico do básico em qualquer aplicação com qualidade e profissionalismo.</p>
<p class="MsoNormal" style="text-align: justify">O conceito de <em>Padrões de Projeto</em> (<em>Design Patterns</em>, em inglês, também chamados de <em>padrões de projeto de software</em><strong> </strong>ou <em>padrões de desenho de software</em>) vem da década de 70, mas foram realmente implementados <span style="font-weight: bold">catalogados mesmo</span> lá pro final da década de 80, por Kent Beck e Ward Cunningham. Os Padrões são conjuntos de soluções para determinados problemas no desenvolvimento do seu software. Essas soluções já foram tão testadas por aí que foram padronizadas, recebendo um nome, o problema que ele resolve, a forma com que ele resolve e as conseqüências do seu uso. A idéia era que, quando falássemos do padrão <em>X</em>, soubéssemos <strong>exatamente</strong> sobre o que falamos.</p>
<p class="MsoNormal" style="text-align: justify">Um padrão de projeto possui sempre um <em>Diagrama de Classes</em> (como esses <a href="http://nusseagora.blogspot.com/2007/08/orientao-objetos-q-raios-isso-parte-2.html">aqui</a>) relacionado a ele, usado para mostrar para os programadores como o código deve ficar. Uma vez conhecido o padrão e entendido como programá-lo, fica muito fácil resolver problemas graves ou que geram muita programação inútil.</p>
<p class="MsoNormal" style="text-align: justify">Há uma reserva quanto ao uso de Padrões de Projeto: mesmo aumentando a reutilização das soluções enquanto você ainda está projetando o software, eles diminuem consideravelmente a reutilização de blocos pequenos de software, já que você vai ter que gastar um tempinho extra na manutenção das classes. Nada que a gente já não faça, mas o uso indiscriminado pode fazer com que seu projeto fique muito pouco reaproveitável.</p>
<p class="MsoNormal" style="text-align: justify">Apesar disso, o verdadeiro maior problema que encontramos para adicionar os padrões ao nosso projeto foi que a Orientação a Objetos do AS2.0 era falha: existia, mas o foco ainda era a estruturação. Talvez por isso as pessoas fizessem gambiarras híbridas sem a menor pena. Em compensação, quando migramos para o AS3.0 e nos deparamos com OO pura, vimos que ele está completamente preparado para a confecção de softwares de nível profissional.</p>
<p class="MsoNormal" style="text-align: justify">Então, daqui pra frente, quando disserem pra vocês que o Action Script 3.0 é uma linguagem de programação inferior, podem bater de frente. Eu mesmo vou colocar aqui algumas matérias sobre padrões de projeto aqui. Já estou preparando algumas sobre os padrões <strong>State</strong>, <strong>Concrete Factory</strong> e <strong>Singleton </strong>(em parceiria com os verdadeiros programadores do meu projeto, claro) e, se mais algum leitor programar em AS3.0 e quiser fazer o mesmo, me mande o link que vou colocá-lo aqui.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padroes-de-projeto-o-que-sao-e-pra-que-servem/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Os problemas de se focar na perfumaria.</title>
		<link>http://www.nusseagora.blog.br/os-problemas-de-se-focar-na-perfumaria</link>
		<comments>http://www.nusseagora.blog.br/os-problemas-de-se-focar-na-perfumaria#comments</comments>
		<pubDate>Thu, 13 Sep 2007 12:46:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Gerência de Projetos]]></category>
		<category><![CDATA[Problemas]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=23</guid>
		<description><![CDATA[Estava olhando projetos postados por aí quando notei um erro recorrente na maioria dos projetos: as pessoas começam pela perfumaria. A perfumaria era um termo usado por meu professor de Multimídia e Interfaces Homem-Máquna, Projeto Final e tantas outras que designava as coisas bonitinhas que não têm influência direta no andamento do projeto. Coisas como [...]]]></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/os-problemas-de-se-focar-na-perfumaria.html" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">
<p>Estava olhando projetos postados por aí quando notei um erro recorrente na maioria dos projetos: as pessoas começam pela <em>perfumaria</em>.</p>
<p>A <em>perfumaria</em> era um termo usado por meu professor de <em>Multimídia e Interfaces Homem-Máquna</em>, <em>Projeto Final</em> e tantas outras que designava as coisas bonitinhas que não têm influência direta no andamento do projeto. Coisas como o ícone do programa, as janelas, os mapas... tudo isso se encaixa no termo <em>perfumaria</em>.O termo <em>perfumaria</em> também pode ser traduzido como a <em>interface do programa</em>. Então, começar pela <em>perfumaria</em> é como começar um jogo pensando nas cores e formas das magias, ao invés de se preocupar com a programação delas.</p>
<p><span id="more-23"></span>No início do nosso Jogo, enquanto ele ainda era só nosso Projeto Final, a gente se perdeu um cado na perfumaria, o que nos fez perder um tempo razoável. Pelo menos caímos na real e conseguimos nos "desatrasar" à tempo.</p>
<p><em>“Mas qualé o erro disso, Tiago?”</em>. É simles: quando você começa pela <em>perfumaria</em>, não tem noção exata do que irá enfrentar ao encarar as partes mais difíceis do projeto. Dessa forma, quando você descobre que não consegue fazer aquela comunicação cliente-servidor do jeito que quer na linguagem X e tem que passar para a linguagem Y, vai perder uma porrada de coisas já prontas pra linguagem X.</p>
<p>Quer outro exemplo disso acontecendo? Imagina ter uma porrada de animações prontas em um modelador qualquer e descobrir que, para resolver aquele problema de IA (<em>Inteligência Artificial</em>) de forma certa, vai ter que trocar pruma linguagem que o modelador NÃO suporta.</p>
<p>Já vi alguns casos em que acontece EXATAMENTE isso: as pessoas começam a fazer o jogo pela interface e não têm a menor idéia de qual linguagem vai usar para a lógica do programa. “<em>A modelagem vai ser feita no Model Maniac 3000 Gold</em>, <em>mas a linguagem de programação eu não sei não”</em>. Fazer isso é o mesmo que subir as paredes de uma casa primeiro para, só depois, fazer a fundação.</p>
<p><em>Perfumaria</em> ou Interface é a ÚLTIMA coisa com a qual nos preocupamos pois, por definição, um projeto muda muito no decorrer do seu desenvolvimento. Se, no meio do caminho, você resolveu fazer com que seu jogo de corrida possua personalização dos carros, o programa mudou (e MUITO). Se, no meio do caminho, você resolveu implementar a capacidade de girar seu mapa 2D para visualizar outras áreas, o programa mudou (e MUITO). Se você <strong>JÁ TIVESSE </strong>todas as janelas prontas, teria que mexer em alguma coisa.</p>
<p><em>“Então Tiago, quer dizer que eu não penso nas janelas e efeitos do meu programa antes?”</em> Não, não é bem isso. Você DEVE pensar na interface sim, para que os programadores saibam como programar as coisas. O problema é que você não vai se prender ao desenvolvimento dela. Desenhe em papel ou faça os modelos sem programação alguma....</p>
<p>No início a gente perda tempo com  programação, análise, projeto.... Coisas que são a fundação do programa, mas não têm nenhum apelo visual ou funcionamento que os usuários finais ele irão gostar. Chato? Pode até ser, mas isso vai poupar muito do seu tempo no futuro. Pode ter certeza.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/os-problemas-de-se-focar-na-perfumaria/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Atraso em projetos de horas vagas (Ou &#8220;Olha… já tamo devendo quase 3 semanas…&#8221;)</title>
		<link>http://www.nusseagora.blog.br/atraso-em-projetos-de-horas-vagas-ou-oiha-ja-tamo-devendo-quase-3-semanas</link>
		<comments>http://www.nusseagora.blog.br/atraso-em-projetos-de-horas-vagas-ou-oiha-ja-tamo-devendo-quase-3-semanas#comments</comments>
		<pubDate>Mon, 03 Sep 2007 12:29:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Gerência de Projetos]]></category>
		<category><![CDATA[Problemas]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=18</guid>
		<description><![CDATA[Lembram-se que eu fiquei de falar sobre os problemas com os quais nós iríamos nos deparar? Pois então, depois do Design Inchado e da Escolha do Flash, não acredito ter esquecido desse pequeno problema... “Que pequeno problema, Tiago?” você pergunta. Sabe quando a gente passa o dia todo trabalhando numa coisa séria, que exige atenção [...]]]></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/atraso-em-projetos-de-horas-vagas-ou.html" type="text/javascript"></script></span></p>
<p style="text-align: justify; margin-left: 70pt">Lembram-se que eu fiquei de falar sobre os problemas com os quais nós iríamos nos deparar? Pois então, depois do Design Inchado e da Escolha do Flash, não acredito ter esquecido desse pequeno problema...</p>
<p style="text-align: justify">“<span style="font-style: italic">Que pequeno problema, Tiago?</span>” você pergunta. Sabe quando a gente passa o dia todo trabalhando numa coisa séria, que exige atenção completa e dedicação total? Aí, depois que a gente chega em casa, cansado, o quê que vamos fazer? “<span style="font-style: italic">Tomar aquele banho</span>”, “<span style="font-style: italic">jogar Crysis</span>”, “<span style="font-style: italic">cair na cama e dormir</span>”, todas essas são respostas válidas. Agora, me responde uma coisa: e se você ainda tivesse um jogo pra fazer? Pois então, aí que ta o problema. Todo aquele tempo de descanso, aquela hora de reflexão pra saber quem é o assassino da Taís, aquelas horinhas para escrever no Nuss... E Agora?!?,  isso tudo vai pro saco.</p>
<p>Fazer um trabalho fora do trabalho é EXTREMAMENTE DIFÍCIL pelo simples fato de que você não pode mais jogar Warcraft III o domingo todo, não pode sair pra organizar o churrasco de aniversário, nem ir ao rodízio de pizza sem que isso afete o tempo que você tem para terminá-lo. E, apesar disso tudo ser muito lógico e extremamente idiota de ser lido, EU NUNCA FUI AVISADO DISSO!!!!!!!</p>
<p>Só depois de uma conversa com o Douglas que eu me toquei que o maior atraso do Jogo vem justamente dos contratempos que apertam nossas horas livres. É o meu trabalho extra que atrasa, é ele que fica preso a um PC ruim. E o Mário, coitado, ta há 2 semanas esperando que a gente quebre uma classe em 3 outras para aumentar a coesão e diminuir o acoplamento. Sim, estamos 2 semanas atrasados e, se bobear, caímos na 3ª.</p>
<p>Seria tudo mais fácil se nós 3 estivéssemos ganhando com o projeto, pegando 8h diárias para trabalhar única e exclusivamente nele. Daria tempo pr’eu pesquisar muitos jogos, pro Douglas dissecar o Action Script 3.0 e o Mário ler muito sobre padrões. Daria para fazermos nossas reuniões e gerenciarmos nosso projeto de uma forma profissional. Porém, já que não é assim (e eu sei que também não é assim prá vários de vocês), como minimizar esses problemas todos?</p>
<p>Pois então... No momento eu não consigo pensar em muitas coisas. Não tenho propriedade para escrever sobre como evitar atrasos nos projetos de horas-vagas (também conhecidos como “to fazendo um jogo” ou “ainda é só hobby”). Porém, o pouco de lógica e consciência que me restam (é quase 1h da manhã e tô quase dormindo no teclado...) me permite dar os seguintes toques:</p>
<p>1. Faça o que gosta<br />
Quando estamos cansados, fazer o que gostamos torna o serviço leve, muuuuito mais aceitável. Se o serviço em si não lhe agrada muito e tem que ser feito...</p>
<p>2. Faça do jeito que você gosta<br />
Procure resolver o problema de uma forma de que lhe agrade. Lembro do final do projeto final, quando passei uma semana trabalhando coisa de 6h diárias na documentação do dito cujo. Para tornar o serviço menos tedioso (acreditem), eu fiz todos os diagramas no Word.</p>
<p>“VOCÊ TÁ MALUCO, NÉ?!?” Olha, certa hora eu achei que sim. Mas eu trabalho tão bem com o Word que, acredito eu, maluco estaria se estivesse tentando fazer aquilo tudo em um outro programa, como o Rational Rose. Já que éramos obrigados a fazer a papelada toda, fiz duma forma que me era agradável. Um serviço cansativo pode acabar tornando-se um descanso. Para isso...</p>
<p>3. Faça com prazer<br />
Isso significa que você deve fazer aquilo sem o peso da obrigação. Não estou dizendo para que você não leve seu projeto a sério, é só pra que você não encare a tarefa como se o seu salário dependesse daquilo. Se a mente não consegue funcionar mais, saia e descanse. Dê-se esse direito e as coisas vão ficar mais fáceis de aturar. Lembre-se: se não é seu emprego, então é um HOBBY.</p>
<p>4. Não se esqueça das outras atividades<br />
Isso tem muito a ver com o tópico anterior. Não se tranque, não se feche, não se desespere. Lembre-se que, quando você não precisa cumprir horários, o chopp da 6ª feira não se torna um pecado. Realmente não dá pra ficar sem trabalhar? Então...</p>
<p>5. Concilie as coisas<br />
Desenhamos muitos Diagramas de Classe e Seqüência em reuniões regadas à chopp numa praça de alimentação de um shopping em Friburgo. Isso tornou o trabalho muito mais simples de se aturar.</p>
<p>6. Organize-se!<br />
Se você não se organiza, não tem tempo pra nada. Termine as coisas pendentes ao invés de arrumar mais coisas pra terminar. Tente montar uma rotina flexível, separando um tempo para teu projeto. Fazer um cronograma é sempre essencial, mensurando o que se consegue fazer e o tempo que se demora a fazê-lo. Se não há um limite para resolução daquele problema, não há noção de atraso. Se não há noção de atraso, também não tem como saber se o projeto vai sair e quando se espera que ele saia. Daí pra frente, tudo fica tão nebuloso que se acaba duvidando da viabilidade da tarefa.</p>
<p>7. Foque-se!<br />
Sem foco, não há trabalho que renda. Se você vai tirar 1h do seu tempo livre, TIRE 1H DO SEU TEMPO LIVRE. Não faça mais nada que divida sua atenção. Gosta de ar livre? Então vá para a varanda, leve o lap top e aproveite o sol. Gosta de silêncio? Então tranque-se e trabalhe à vontade. Gosta de ouvir músicas? Então ouça aquilo que quiser, o quanto quiser.</p>
<p>Mas lembre-se: você está buscando o foco. Você saberá que alguma coisa deu errada quando deixar de trabalhar para cantar. Não liguem, acontece muito comigo quando o Winamp escolhe uma dos Chili Peppers.</p>
<p>Essas são coisas que, instintivamente, eu tenho feito para despiorar essa situação, mas podem não ser aplicáveis a todos os casos. De qualquer jeito, já é um ponto de partida por onde vocês poderão desenvolver suas próprias técnicas. Aliás, falando nisso, mais alguém aí tem alguma dica para passar?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/atraso-em-projetos-de-horas-vagas-ou-oiha-ja-tamo-devendo-quase-3-semanas/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

