<?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>Elf Blog</title>
	<atom:link href="http://edipolf.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://edipolf.com/blog</link>
	<description>Ruby, Rails, Java, Tests, Mac, Linux ...</description>
	<lastBuildDate>Sat, 21 Aug 2010 12:34:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Notação Infixa, Posfixa, Conversão.</title>
		<link>http://edipolf.com/blog/2010/08/18/notacao-infixa-posfixa-conversao/</link>
		<comments>http://edipolf.com/blog/2010/08/18/notacao-infixa-posfixa-conversao/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 16:20:02 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[TDD Problems]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=545</guid>
		<description><![CDATA[[UPDATE 20 Agosto 2010] Nesses ultimo dias tinha criado uma classe para resolver as expressões na notação posfixa, segue o link do github: http://github.com/edipofederle/PostfixEvaluation Olá esse post irá ser um pouco diferente do que venho escrevendo por aqui, esse é um assunto assim digamos mais teórico(realmente a palavra não é essa), enfim, vou falar um [...]]]></description>
			<content:encoded><![CDATA[<h4>[UPDATE 20 Agosto 2010]</h4>
<p>Nesses ultimo dias tinha criado uma classe para resolver as expressões na notação posfixa, segue o link do github:</p>
<p><a href="http://github.com/edipofederle/PostfixEvaluation">http://github.com/edipofederle/PostfixEvaluation </a></p>
<p>Olá esse post irá ser um pouco diferente do que venho escrevendo por aqui, esse é um  assunto assim digamos mais teórico(realmente a palavra não é essa), enfim, vou falar um pouco aqui sobre a notação Infixa e Posfixa, e também sobre o algoritmo para resolver uma conversão de infixa para posfixa.</p>
<h4>Notação Infixa</h4>
<p>Notaçao infixa é quando na expressão temos os operedatores binários colocados entre os operandos, ou seja o que estamos mais acostumados a fazer. Algo como:<a href="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn1.png"><img class="aligncenter size-full wp-image-547" title="CodeCogsEqn" src="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn1.png" alt="" width="61" height="24" /></a>Sabemos que nessas expressões as vezes se faz necessário o uso de paranteses para nao ocorrer ambiguidade.(regras de prioridade). Por exemplo:<a href="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn2.png"><img class="aligncenter size-full wp-image-548" title="CodeCogsEqn(2)" src="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn2.png" alt="" width="150" height="25" /></a><strong>NOTA #1: </strong><em>Estou considerando apenas oprações binárias.</em></p>
<p>Esse tipo de expressão torna o trabalho computacional muito mais complicado.</p>
<h4>Notação Posfixa</h4>
<p>Notação posfixa é aquela onde os operadores estão localizados após os operandos, dessa forma não se faz preciso parenteses. Por exemplo, a expressão acima ficaria assim:<a href="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn3.png"><img class="aligncenter size-full wp-image-549" title="CodeCogsEqn(3)" src="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn3.png" alt="" width="117" height="31" /></a>Simplificamos bem a expressão escrevendo ela de forma posfixa.</p>
<h4><strong>Convertendo Expressões de Infixa para Posfixa</strong></h4>
<p><em>Árvore de expressão Binária</em></p>
<p>Uma árvore de expressão binária nos mostra de forma clara a precedencias e a associetividade dos operadores em uma expressão, dada a expressão na notação infixa:<a href="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn4.png"><img class="aligncenter size-full wp-image-550" title="CodeCogsEqn(4)" src="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn4.png" alt="" width="180" height="29" /></a>temos a seguinte árvore de expressão:<a href="http://edipolf.com/blog/wp-content/uploads/2010/08/treeex1.png"><img class="aligncenter size-full wp-image-551" title="treeex1" src="http://edipolf.com/blog/wp-content/uploads/2010/08/treeex1.png" alt="" width="302" height="234" /></a></p>
<p>Agora dada uma expressão na forma posfixa:<a href="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn41.png"><img class="aligncenter size-full wp-image-552" title="CodeCogsEqn(4)" src="http://edipolf.com/blog/wp-content/uploads/2010/08/CodeCogsEqn41.png" alt="" width="159" height="21" /></a>temos a seguinte árvore de expressão:</p>
<p><a href="http://edipolf.com/blog/wp-content/uploads/2010/08/treeex2.png"><img class="aligncenter size-full wp-image-553" title="treeex2" src="http://edipolf.com/blog/wp-content/uploads/2010/08/treeex2.png" alt="" width="316" height="209" /></a></p>
<p>Se avaliarmos essa expressão de forma <a href="http://www.brpreiss.com/books/opus5/html/page261.html">&#8220;Postorder Traversal&#8221; </a>iremos ter a expressão na forma posfixa.</p>
<h4>Algoritmo</h4>
<p>A conversão de infixa para Posfixa é feita usando uma técnica chamada <a href="http://en.wikipedia.org/wiki/Operator-precedence_parser">operator precedence parsing</a>, precisamos usar a estrutura de dados do tipo pilha(stack), o algoritmo funciona da seguinte forma.</p>
<p><em>Data um expressão infixa faça:</em></p>
<p><em> &#8211; Add um parenteses esquerdo &#8216;(&#8216; na pilha;<br />
- Add um parenteses direito &#8216;)&#8217; à expressão infixa;<br />
- Enquanto a pilha não estiver vazia ler a expressão infixa da esquerda para a direita e então:<br />
- se o caractere lido por um digito(ou variavel) -&gt; então add na saida(posfixa);<br />
- se o caractere lido por um parenteses esquerdo  &#8216;(&#8216;-&gt; entao add na pilha;<br />
- se o caractere for um operador entao faça:<br />
- Enquanto operador no topo da pilha tiver precedencia igual ou maior que a do operador lido -&gt; Remove operador do topo da pilha.<br />
- add o caractere atual a pilha;<br />
- se o caractere aqual for um parenteses direito &#8216;)&#8217;;<br />
- enquanto não achar um parenteses esquerdo &#8216;(&#8216; no topo da pilha faça:<br />
-&gt; Remover operador do tipo da pilha e add a saida(posfixa)<br />
-&gt; remover e descartar o parenteses esquerdo &#8216;(&#8216;;</em></p>
<h4>Código Java</h4>
<p>Baixo segue o link para o github onde esta a classe para em Java para conversão, vale lembrar que acabei por escrever esse post pois encontrei esse problema no site TDD Problems que por sinal recomendo a todos para práticar TDD e programação, tem problemas bem legais lá, desde coisas simples até complexas, entao de uma olhada no código que escrevi para esse problemas, não sei o quão bom esta, mas esta com todos testes de unidade passando <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , tentei deixar a classe bem limpa, clara e pequena, as funções estão pequenas, mas acho que não é o bastante ainda, podemos simplificar bem mais, alguns métodos estão um pouco feios também(necessita de mais refatoração certamente).</p>
<p>A  classe é dividida nos seguintes métodos:</p>
<p><strong>converterToPostFix(String infix)<br />
removeFromStackUntilFindRightParenthesis(String postfix)<br />
isADigit(String digit)<br />
isOperator(String ch)<br />
precedence(String top, String ex)</strong></p>
<p>Acredito que os nomes estão bastante sugestivos quanto as suas responsabilidades.</p>
<p>Código Fonte: <a href="http://github.com/edipofederle/InfixToPostfixConverter">http://github.com/edipofederle/InfixToPostfixConverter</a></p>
<p>É isso pessoal, espero que tenha sido útil para alguem, e deixe-me saber de qualquer problema com esse código, podem criticar <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> (mas fazm fork e arrumem a sujeira <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ).</p>
<p>Até Logo.</p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/08/18/notacao-infixa-posfixa-conversao/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Deploy de Aplicações Rails Usando Git &#8211; Gem Gploy</title>
		<link>http://edipolf.com/blog/2010/07/31/deploy-de-aplicacoes-rails-usando-git-gem-gploy/</link>
		<comments>http://edipolf.com/blog/2010/07/31/deploy-de-aplicacoes-rails-usando-git-gem-gploy/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 12:34:46 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Deploy]]></category>
		<category><![CDATA[GIT]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=526</guid>
		<description><![CDATA[Este post irá descrever de forma mais completa o que a gem gploy faz, acredito que não será um post grande pois a gem não faz tanta coisa assim. Gploy é uma RubyGem que pode ser usada para configurar seu projeto Ruby on Rails e seu servidor para realizar deploy usando git. De forma alguma [...]]]></description>
			<content:encoded><![CDATA[<p>
              Este post irá descrever de forma mais completa o que a gem <a href="http://github.com/edipofederle/gploy">gploy </a>faz, acredito que não será um post grande pois a gem não faz tanta coisa assim. <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Gploy é uma RubyGem que pode ser usada para configurar seu projeto<a href="http://www.rubyonrails.pro.br/"> Ruby on Rails</a> e seu servidor para realizar <a href="http://en.wikipedia.org/wiki/Software_deployment">deploy</a> usando <a href="http://git-scm.com/">git</a>.  De forma alguma quero tentar substituir ou algo assim gems muito melhores e eficientes como o Imploy ou o locarails, até mesmo pois essas fazem o trabalho de outra forma.</p>
<h3>Resumo</h3>
<p>               Gploy é uma Gem Ruby simples para configurar e fazer deploy de apps Rails, essa gem foi escrita por min(Edipo), o codigo não esta elegente como deveria, mas estou trabalhando nisso <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<h3> O que preciso ter.</h3>
<p>              Se faz necessário o uso de git para controle de versão de seu projeto Rails, o que acredito que seja praticamente impossível alguem do Rails não esta usando git para versionamento, você também precisa um servidor web(sério?) que rode Ruby on Rails, até agora somente testei na locaweb, pois essa gem faz o uso de uma estrutura de pasta em particular que é encontrada nos servidores da locaweb(mas imagino que outros servidores não são diferentes disso), outra coisa muito importante é que, novamente, até o momento, essa gem faz o uso de um repositório git no mesmo servidor que irá esta hospedada a aplicação, então seu servidor também precisa ter suporte a git. Dito isso, a estrutura de pasta que o gploy usa é a seguinte:</p>
<p>              ~/repos  -> Repositorio git<br />
             ~/rails_app -> Onde fica seu projeto de produção<br />
             ~/public_html -> Aqui irá ser criado um link simbólico com a aplicação.</p>
<p>Logo a pasta repos poderá ser substituída por qualquer uma de sua preferencia atras de uma configuração adicional.</p>
<h3>Que arquivos são usados</h3>
<p>              Os comandos <strong>gploy -c</strong> e <strong>gploy -pr</strong> geram dois arquivos, config/config.yaml e config/post-receive respectivamente. O primeiro é um arquivo yaml que guarda as informação do seu servidor, nome da app e origin(git).</p>
<p><script src="http://gist.github.com/502117.js?file=config.yaml"></script></p>
<p>              Acho que não tem muito o que falar sobre esse arquivo ele é auto-explicativo, apenas tome cuidado com a ultima linha(origin) caso você já tenha no seu git um origin configurado use outro nome. Caso você tenha um key ssh configurada para seu servidor na sua maquina e não necessite senha simplesmente deixa essa opção em branco.</p>
<p>              O segundo arquivo é o post-receive que é um <a href="http://www.kernel.org/pub/software/scm/git/docs/githooks.html">hook</a> do git, basicamente falando é um arquivo que é executado sempre que o repositório em questão sofre algum tipo de ação, no nosso caso é quando ele recebe um push, esse arquivo se parece com isso:</p>
<p><script src="http://gist.github.com/502118.js?file=post.sh"></script></p>
<p>Esse conteúdo é o que é gerado pelo gploy, também acho que é auto-explicativo o que ele faz, caso você tenha mais tarefas para serem executadas quando você der um novo deploy simplesmente coloque ela nesse arquivo usando o env -i na frente como os demais.</p>
<h3>Como a gem Trabalha.</h3>
<p>              A forma como a gem trabalha é bem simples, o que ela faz é usar um pouco do poder do git ao seu favor, basicamente é:</p>
<p>              → Se projeto não estiver versionado então inicio um repositório git localmente e faça o primeiro commit.<br />
              → Adiciona a url remota configurada no config.yml ao git<br />
              → Faz um git push<br />
              → Faz um clone dentro do servidor da pasta repos para rails_app<br />
              → Adiciona a url “remota” dentro do servidor<br />
              → Cria o link simbólico entre public_html e rails_app<br />
              → Cria diretório tmp na aplicação caso não existir<br />
              → Faz upload do arquivo de hook configurado anteriormente<br />
              → Roda Migrations e Restart Servidor</p>
<p>Isso é o que acontece quando você executa <strong>gploy -s.</strong> Nesse momento seu projeto esta no ar, se tudo aconteceu como o esperado.</p>
<h3>Novos Deploys.</h3>
<p>              Toda vez que você quiser atualizar seu projeto em produção simplesmente faça <strong>gpoy -d</strong>, ele irá ir até a branch master e fazer um simples push.</p>
<h3>Quando usar essa gem?</h3>
<p>              Eu não recomendaria usar ela para algum projeto real no qual você possa perder dinheiro se o mesmo não estiver ok no ar. Mas acredito que se você esta desenvolvendo algo mais simples e quiser simplesmente colocar em produção para testes externos, ou até mesmo para colocar em produção sistemas ou Web Sites mais simples e que não precisem ficar 24/7 online acredito que possa vir a ser útil, eu até mesmo uso em algumas coisas que estão online.</p>
<h3> Logs</h3>
<p>              O gploy mantem arquivo de log bem simples, ele simplesmente informa qual comando foi executado e se o mesmo foi feito localmente ou remotamente, você pode encontrar esse arquivo dentro da pasta logs do seu projeto Rails.</p>
<h3>Testes</h3>
<p>              Essa gem não tem cobertura 100% de testes unitários, basicamente o que mantenho até o momento são 22 testes usando Rspec. Obviamente não esta tudo testado com esse numero, mas por hora já me ajuda a não ter muita dor de cabeça na hora de mexer no código do projeto. Abaixo o resultado gerado pelo Rcov para a cobertura de testes dessa gem.</p>
<p><a href="http://edipolf.com/blog/wp-content/uploads/2010/07/Screen-shot-2010-07-30-at-11.16.54-PM.png"><img src="http://edipolf.com/blog/wp-content/uploads/2010/07/Screen-shot-2010-07-30-at-11.16.54-PM.png" alt="" title="Screen shot 2010-07-30 at 11.16.54 PM" width="1262" height="297" class="aligncenter size-full wp-image-534" /></a></p>
<h3> Funcionalidades Futuras.</h3>
<p>              Ainda não tenho nada certo para novas funcionalidades do gploy, o que pretendo implementar é um forma de poder deixar para o usuário escolher qual pasta quer usar para repositório(ou seja, se quiser mudar o nome de repos para qualquer outro), também uma forma simples de usar seu repositório do github, já que o mesmo suporta hooks.</p>
<h3> Conclusão</h3>
<p>              Esta é uma RubyGem simples mas que pode ser útil em certas situações, caso você tenha gostado, faça um fork do projeto no github e sugira modificações e correções de bugs. E quem tiver acesso a outros servidores que não sejam da locaweb por favor entre em contato para que possamos realizar alguns testes, mas penso que a estrutura seja a mesma praticamente.</p>
<p>Links:<br />
                            Source Code:<a href=" http://github.com/edipofederle/gploy/"> http://github.com/edipofederle/gploy/</a><br />
                            RubyGems:   <a href="http://rubygems.org/gems/gploy">http://rubygems.org/gems/gploy</a></p>
<p>                            Git Documentation:<a href=" http://git-scm.com/documentation"> http://git-scm.com/documentation</a></p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/07/31/deploy-de-aplicacoes-rails-usando-git-gem-gploy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolvendo Problema de Rcov com Fakefs</title>
		<link>http://edipolf.com/blog/2010/07/30/resolvendo-problema-de-rcov-com-fakefs/</link>
		<comments>http://edipolf.com/blog/2010/07/30/resolvendo-problema-de-rcov-com-fakefs/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 13:10:32 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>
		<category><![CDATA[rcov]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=518</guid>
		<description><![CDATA[Hoje estava configurando o Rcov para o gploy, e na hora de gerar as estatisticas de cobertura de testes para o projeto alguns erros aconteciam, basicamente algo como a imagem abaixo: Após um pouco de investigação o que acontece(eu acho) é que como estou fazendo o uso do FakeFs em meus testes e como o [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje estava configurando o<a href="http://github.com/defunkt/fakefs"> Rcov</a> para o <a href="http://rubygems.org/gems/gploy">gploy</a>, e na hora de gerar as estatisticas de cobertura de testes para o projeto alguns erros aconteciam, basicamente algo como a imagem abaixo:</p>
<p><a href="http://edipolf.com/blog/wp-content/uploads/2010/07/Screen-shot-2010-07-29-at-9.13.03-PM.png"><img class="aligncenter size-full wp-image-519" title="Screen shot 2010-07-29 at 9.13.03 PM" src="http://edipolf.com/blog/wp-content/uploads/2010/07/Screen-shot-2010-07-29-at-9.13.03-PM.png" alt="" width="1215" height="333" /></a></p>
<p>Após um pouco de investigação o que acontece(eu acho) é que como estou fazendo o uso do FakeFs em meus testes e como o rcov precisa rodar os testes(obviamente) ele da erro ao tentar copiar os arquivos necessarios de template do rcov(reparem o comando cp ali), e como isso é manipulação de arquivos ele falha, ao tentar usar o FakeFs para fazer tal operação, já que o mesmo esta ativo em nossos casos de testes.<br />
Solução</p>
<p>Em seu arquivo de teste onde é feito o uso deo FakeFs provalmente você tenha algo assim.</p>
<p><script src="http://gist.github.com/500473.js?file=active.rb"></script> O que fiz foi usar o before e after para ativar e desativar o fakefs.(agora me veio uma solução mais simples, active no inicio e de deactivate no final do teste, mas não tenho como testar isso agora <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ).  <script src="http://gist.github.com/500459.js?file=before_after.rb"></script></p>
<p>Abaixo segue a tarefa rake para rodar o rcov,  caso esteja usando testunit ao invés de rspec mude o local de arquivos de testes de spec para test.</p>
<p><script src="http://gist.github.com/500479.js?file=rcov.rb"></script></p>
<p>Bom é isso pessoal, espero que ajude alguem.</p>
<p>Até Mais.</p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/07/30/resolvendo-problema-de-rcov-com-fakefs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Estrutura de Dados] &#8211; Pilha -&gt; TDD + Java + Junit</title>
		<link>http://edipolf.com/blog/2010/07/10/estrutura-de-dados-pilha-tdd-java-junit/</link>
		<comments>http://edipolf.com/blog/2010/07/10/estrutura-de-dados-pilha-tdd-java-junit/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 21:17:59 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=511</guid>
		<description><![CDATA[Este não será um post com texto, apenas uma implementaçao simples que fiz de uma pilha usando TDD + Junit com Java. Obviamente não usei a classe Stack do Java. Se alguem tiver sugestões so postar. Primeiros os Testes de Unidade. Depois as duas classes. É isso, espero sugestoes e muitas criticas para refatorar]]></description>
			<content:encoded><![CDATA[<p>Este não será um post com texto, apenas uma implementaçao simples que fiz de uma pilha usando TDD + Junit com Java. Obviamente não usei a classe <a href="http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/util/Stack.html">Stack do Java</a>. <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Se alguem tiver sugestões so postar.</p>
<p>Primeiros os Testes de Unidade.</p>
<p><script src="http://gist.github.com/471029.js"></script></p>
<p>Depois as duas classes.</p>
<p><script src="http://gist.github.com/471034.js"></script></p>
<p><script src="http://gist.github.com/471035.js"></script></p>
<p>É isso, espero sugestoes e muitas criticas para refatorar <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/07/10/estrutura-de-dados-pilha-tdd-java-junit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pensamentos Sobre UML e desenvolvimento de Software</title>
		<link>http://edipolf.com/blog/2010/06/28/pensamentos-sobre-uml-e-desenvolvimento-de-software/</link>
		<comments>http://edipolf.com/blog/2010/06/28/pensamentos-sobre-uml-e-desenvolvimento-de-software/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 00:16:17 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=497</guid>
		<description><![CDATA[Motivação Bom, normalmente eu não escrevo posts no estilo que esse irá(está) ser escrito, minha motivação para escrever tal texto já vem se criando à um certo tempo, mas agora finalmente resolvi escrever mesmo que o que venho à apresentar seja totalmente bobagem para muitos, mas tenho certeza que será correto ou resoavelmente bom para [...]]]></description>
			<content:encoded><![CDATA[<h3><a href="http://edipolf.com/blog/wp-content/uploads/2010/06/burocracia.jpg"><img class="aligncenter size-full wp-image-505" title="burocracia" src="http://edipolf.com/blog/wp-content/uploads/2010/06/burocracia.jpg" alt="" width="329" height="219" /></a></h3>
<h3>Motivação</h3>
<p>Bom, normalmente eu não escrevo posts no estilo que esse irá(está) ser escrito, minha motivação para escrever tal texto já vem se criando à um certo tempo, mas agora finalmente resolvi escrever mesmo que o que venho à apresentar seja totalmente bobagem para muitos, mas tenho certeza que será correto ou resoavelmente bom para muitos.</p>
<p>Grande parte da motivação para eu escrever esse texto vem de vários lugares, como por exemplo: universidade,&#8230;. bom basicamente a universidade encapsula todo o resto, o que inclue professores, alunos e outras n váriaveis. ( ou seriam constantes??)</p>
<p>Bom dito isso vamos começar.</p>
<h3>Nota I</h3>
<p>Quero deixar bem claro aqui que não sou um conhecedor profundo de NADA, muito menos dos tópicos desse posts. Tudo que for apresentando aqui se refere basiscamente ao que eu penso e idéias das quais simpatizo.</p>
<h3>Entregue-me um diagrama e lhe entregarei um Software</h3>
<p>A grande maioria das universidade(ou não) ensinam UML, não vamos entrar em questões se isso é bom ou ruim, o fato é que UML não é tudo, você não consegue fazer um software apenas com um(s) diagrama(s) UML,  e certamente você não não irá fazer um software seguindo fielmente uma especificação de diagrama de classe por exemplo, é basicamente sobre isso que esse post irá tratar&#8230;..</p>
<h3>Diagramas, Diagramas, Diagramas</h3>
<p>Sejamos sincero com nos mesmo, somente UML não é suficiente, o que muitos pregam por ai parecendo xiitas é que a única coisa que você precisa para fazer um software é uma especificação vinda de algum analista de sistema ou sei la quem vestindo um terno.  Não estou falando aqui que a UML não é boa ou que não resolve alguns problemas, de forma alguma, acho a UML um ótima ferramenta para expor visualmente algumas idéias e fluxos mais complexos de um sistemas,  mas onde eu acredito que realmente reside o bom uso de UML é na comunicação, ou seja fazer realmente o que seja importante, não sair desenhando todas as classes do sistema e em cada classe todos atribuitos e métodos, isso é simplesmente perda de tempo, acredito que o bom uso da UML seja pra coisas realmente importante, algo como &#8220;para se ter uma ideia&#8221;. Você quer detalhamento? Qual melhor local para isso do que no código?, é nesse que você tem que ser detalhado, cuidadoso e muito especifico, pois é isso que irá fazer seu software funcionar ou não.</p>
<p>Agora vamos ser realistas, na grande parte das vezes os Softwares não passam de um monte de cadastros(CRUDs e mais CRUDs) e não me entra na cabeça fazer meia dúzia de diagramas para fazer especificações sobre como implementar um simples CRUD que em 90% dos casos não tem nada de especial e nem vou entrar no assunto de documentações de casos de uso, ah ia me esquecendo casos de uso de &#8230;.. CRUD.</p>
<p>Acredito que grande parte disso tudo venha do modelo de desenvolvimentos tradicional de software o <a href="http://pt.wikipedia.org/wiki/Modelo_em_cascata">cascata</a>, onde existem níveis bem definidos e funções bem especificadas em cada nível, ou seja:</p>
<p><a href="http://edipolf.com/blog/wp-content/uploads/2010/06/800px-Waterfall_model.svg_.png"><img class="aligncenter size-full wp-image-502" title="800px-Waterfall_model.svg" src="http://edipolf.com/blog/wp-content/uploads/2010/06/800px-Waterfall_model.svg_.png" alt="" width="392" height="367" /></a></p>
<p>Finalizada um etapa podemos seguir para a próxima, basicamente aquela história, &#8220;toma aí o diagrama peão(programador) codifica essa especificação assim como um pedreiro segue uma planta de um engenheiro, no final você vai ter um software &#8220;. Usei a palavra peão para programador pois é assim que se parece, e é assim que muitos pensam. Essa abordagem me sugere dois principal resultados, um, o projeto de software é concluído fora do prazo, do orçamento e em grande parte das funcionalidades não batem com o que o cliente solicitou, o sistema vai para produção e a empresa fica eternamente pagando manutenções para que sejam corrigidos problemas que  deviam ter sido detectados na face de analise ainda( e que passaram despercebidos pelos testes), problemas esses muitas vezes de mal entendimento de requesitos do cliente; segunda, o software não é finalizado.</p>
<h3>Então a UML não serve ?</h3>
<p>Sou suspeito para falar isso, sou um fã de metodologias agéis, como <a href="http://www.extremeprogramming.org/">eXtreme Programming</a> por exemplo, eu realmente nunca ouvi falar de uma equipe XP usar diagramas de UML para nada, e segundo a literatura existente isso é pouco feito, segue um trecho do artigo <a href="http://www.infoq.com/br/articles/is-design-dead#8">&#8220;O Design Está Morto?&#8221;</a> de Martin Fowler, que recomendo a todos ler.</p>
<p style="padding-left: 30px;"><span style="color: #808080;"><em>&#8220;Há diversos pontos de incompatibilidade. É fato que XP possui muito  pouca ênfase em diagramas. Embora a posição oficial é a de &#8220;usá-los  quando eles forem úteis&#8221;, há uma mensagem implícita que diz que  &#8220;verdadeiros adeptos de XP não fazem diagramas&#8221;. Esta conclusão é  reforçada pelo fato de que pessoas como Kent não se sentem confortáveis  com diagramas; na verdade eu nunca vi Kent voluntariamente desenhar um  diagrama de software em uma notação determinada.&#8221;</em></span></p>
<p><span style="color: #000000;">E nem é pelo fato de não se usar de diagramas que não teremos um bom software, existe outras n técnicas para tal função que acredito ser muito mais interessante e mais proxima do cliente também, como os cartões CRC:</span></p>
<p><span style="color: #808080;"><a href="http://edipolf.com/blog/wp-content/uploads/2010/06/crcCardLayout.jpg"><img class="aligncenter size-full wp-image-503" title="crcCardLayout" src="http://edipolf.com/blog/wp-content/uploads/2010/06/crcCardLayout.jpg" alt="" width="337" height="193" /></a></span></p>
<p><span style="color: #808080;"><a href="http://edipolf.com/blog/wp-content/uploads/2010/06/crcCardStudent.jpg"><img class="aligncenter size-full wp-image-504" title="crcCardStudent" src="http://edipolf.com/blog/wp-content/uploads/2010/06/crcCardStudent.jpg" alt="" width="337" height="193" /></a></span></p>
<p><span style="color: #000000;">Acho isso muito elegante e eficiente, recomendo ler </span><a href="http://www.agilemodeling.com/artifacts/crcModel.htm">http://www.agilemodeling.com/artifacts/crcModel.htm</a> que foi de onde tirei essas duas imagens acima.</p>
<p>Não estou falando aqui que deve-se substituir UML por cartões CRC, o que eu falo é que existe algumas situações onde cada um tem seu maior valor e praticidade, ou um junção de ambos como o Martin Fowler diz que usa, na realidade o que o que realmente importa é saber medir as coisas e saber usar a coisa mais adequada em cada situação e não tentar forçar o uso de uma única ferramenta para resolver todos os problemas e esperar grandes resultados.</p>
<p>O que realmente queria dizer nesse post todo é que muitas vezes principalmente em universidade e certos professores acabam achando que aquilo que é passado na aula é tudo o que se tem para resolver problemas, e só aquilo que deve ser usado e pronto, me de ótimos resultados com isso, quando as coisas são muito mais complicadas&#8230; ou posso simplesmente esta falando bobagem&#8230;.. quem sabe.</p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/06/28/pensamentos-sobre-uml-e-desenvolvimento-de-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby Série #7 &#8211; Classes Simples</title>
		<link>http://edipolf.com/blog/2010/05/20/ruby-serie-7-classes-simples/</link>
		<comments>http://edipolf.com/blog/2010/05/20/ruby-serie-7-classes-simples/#comments</comments>
		<pubDate>Thu, 20 May 2010 01:35:57 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=481</guid>
		<description><![CDATA[Olá pessoas, finlamente estamos devolta para falar novamente de Ruby, dessa vez iremos dar uma olhada básica na criação de classes em Ruby. Iremos fazer nossos exemplo em cima de uam classe chamada Matemática. Definição de uma Classe Simples como só o Ruby poderia ser , usamos a palavra chave do Ruby class para criar [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoas, finlamente estamos devolta para falar novamente de Ruby, dessa vez iremos dar uma olhada básica na criação de classes em Ruby.</p>
<p>Iremos fazer nossos exemplo em cima de uam classe chamada<strong> Matemática.</strong></p>
<h2>Definição de uma Classe</h2>
<p><script src="http://gist.github.com/407087.js"></script></p>
<p>Simples como só o Ruby poderia ser <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , usamos a palavra chave do Ruby <strong>class</strong> para criar uma nova constante para fazer referência a nossa classe, nome de classe e constante ambas são as mesma, é por isso que devemos declarar classes com letra Maiúscula.</p>
<h2>A palavra chave self</h2>
<p>Podemos usar a palavra <strong>self</strong> para nos referir a própria classe, essa palavra vem dentro da definição da classe, por exemplo.</p>
<p><script src="http://gist.github.com/407088.js"></script></p>
<h2>Criando uma Instância de Matematica</h2>
<p>Até o momento ainda não colocamos nada de atributos ou métodos em nossa classe, mas isso não impede que agente crie uma instância dessa classe, para isso usamos a palavra-chave <strong>new</strong>.</p>
<p><script src="http://gist.github.com/407091.js"></script></p>
<p>Todo e qualquer objeto de classe tem um método new.</p>
<p>O que temos de importante para fazer com um objeto que não tem nenhum método ? Bem podemos pedir para ele qual é seu tipo, para tal operação:</p>
<p><script src="http://gist.github.com/407092.js"></script></p>
<h2>Inicializar a Nossa Classe</h2>
<p>Construtores é a palavra se você vem ou é do mundo Java, queremos inicializar nossa classe com dois argumentos x e y. Mas como você não está no Java aqui isso se chama <strong>initialize</strong>.</p>
<p><script src="http://gist.github.com/407094.js"></script></p>
<p>Simples heim, mas o que aconteceu nessas três novas linhas? Primeiramente usamos a palavra-chave def para definir nossa método initialize, vale dizer aqui que esse def define um método de instância da classe, quando vamos chamar um método de instância da classe o valor de self é uma instância da classe na qual o método foi declarado.</p>
<p>Bom, quando definimos uma initialize para uma classe, temos que saber que quando usamos o método new para criar um nova instância da nossa classe, ele chama automaticamente o método initialize para aquela instância, então todo e qualquer argumento que você passar para new irão ser passados para o initialize, então como nosso initialize está esperando dois argumentos devemos agora passar esses argumentos no momento em que criamos nosso objeto Matematica.</p>
<p><script src="http://gist.github.com/407095.js"></script></p>
<p>Pronto agora sim. Algo bacana que acontece internamente no Ruby é que o método intialize é PRIVATIZADO automaticamente. Ou seja um objeto por ele mesmo pode chamar esse método para fazer a inicialização de seus argumentos, mas você não pode fazer uma chamada explicita para por exemplo mudar os valores de inicialização.</p>
<p>O que temos dentro do método initialize é dois valores que passamos nas variáveis @x, e @y, em Ruby o que começar com @ é uma variável de instância, então podemos ter n instância de Matematica que cada um delas terá seus próprios valores para x e y.</p>
<p>Uma consideração sobre variáveis de instância é que elas somente podem ser acessadas pelos métodos de instância do Objeto. Ou seja se houver algum código que não esteja dentro de um método de instância não poderá ler ou modificar seu valor. Na verdade existe uma maneira de fazer isso usando algumas técnicas de reflexão(<a href="http://angrez.blogspot.com/2006/11/using-reflection-in-ruby.html">reflections</a>)</p>
<p>Certamente se você esta pensando em Java ou outras linguagens estáticas ficou pensando em fazer a declaração das variáveis, se você fizesse isso podia até pensar estar fazendo a coisa certa mas não está, no Ruby as variáveis de instância são resolvidas todas em contexto <strong>self</strong>, no momento em que é invocado o método initialize o self mentém uma instânia de nossa classe(Matematica), ou seja, o código fora do initialize faz referência à definição da classe e não a INSTÂNCIA da classe, então quando a leitura das variáveis que você declara fora(como no Java, por exemplo) são totalmente diferentes daquelas dentro do initialize.</p>
<h2>O quase sempre presente método to_s.</h2>
<p>Isso é praticamente default em todas as classes que você fizer, isso para poder retornar uma representação da sequência do objeto.</p>
<p><script src="http://gist.github.com/407096.js"></script></p>
<p>Bem melhor que antes não:</p>
<p><script src="http://gist.github.com/407097.js"></script></p>
<p><strong>Saídas</strong></p>
<p>com to_s: (3,4)</p>
<p>sem to_s: #</p>
<p>Bom essa foi a primeira parte, logo logo eu posto mais, obrigado por ler <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/05/20/ruby-serie-7-classes-simples/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criado_em, Atualizado_em &#8211; Timestamp com Hibernate</title>
		<link>http://edipolf.com/blog/2010/04/25/criado_em-atualizado_em-timestamp-com-hibernate/</link>
		<comments>http://edipolf.com/blog/2010/04/25/criado_em-atualizado_em-timestamp-com-hibernate/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 00:33:47 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=469</guid>
		<description><![CDATA[Antes de ler: http://en.wikipedia.org/wiki/Timestamp Uma das coisas que eu sempre achei muito bacana no Rails é a parte do ActiveRecord,(active record pattern) uma característica que particularmente gosto é a criação automatica dos timestemp das tabelas no banco de dados, no Rails quando tempo um modelo(model) quase sempre temos um tabela relacionada a esse modelo no banco [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Antes de ler: <a href="http://en.wikipedia.org/wiki/Timestamp">http://en.wikipedia.org/wiki/Timestamp</a></strong></p>
<p>Uma das coisas que eu sempre achei muito bacana no<a href="http://rubyonrails.org/"> Rails</a> é a parte do<a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html"> ActiveRecord,(</a><a href="http://pt.wikipedia.org/wiki/Active_record">active record pattern</a>) uma característica que particularmente gosto é a criação automatica dos timestemp das tabelas no banco de dados, no Rails quando tempo um modelo(model) quase sempre temos um tabela relacionada a esse modelo no banco de dados, para título de curiosidade do pessoal do Java vou apresentar abaixo uma classe(model) que representa um produto.</p>
<p><strong>OBS:</strong> <em>essa linhda validates_presence_of: eu coloquei somente para não deixar a classe vazia, ela faz a validação do campo nome e descrição.</em></p>
<p><script src="http://gist.github.com/450870.js?file=hb_postr.rb"></script></p>
<p><span style="font-size: 13px; line-height: 19px;">Simples não? Claro temos a migration para isso.</span></p>
<p><script src="http://gist.github.com/450871.js"></script></p>
<div>Explicando para quem não conhece Ruby/Rails. Uma classe que herda de <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">ActiveRecord::Migration</a> e tem dois métodos um que irá criar nossa tabela e suas colunas, e um método caso quizermos apagar nossa tabela.(Essa classe irá ser executada quando você rodar o comando <strong>rake db:migrate</strong>), sem muitas explicações para não sair muito da linha, mas sendo um pouco xiita, muito elegante esse código não?</div>
<div>Como podemos ver nessa classe temos uma linha que diz <strong>t.timestamp</strong>, é essa linha que irá criar os created_at e updated_at na nossa tabela, essa linha vem junto com qualquer migração(model) padrão que você criar, bom isso não ?</div>
<p><span style="font-size: 13px; line-height: 19px;">Ultimamente eu estou tendo um contado maior com <a href="http://www.java.com/pt_BR/">Java</a> e<a href="http://www.hibernate.org/"> Hibernate</a>, não vamos falar sobre Java vs Ruby aqui(ainda), então eu estava mapeando classes para o banco e me vi sem os timestamps, pensei, o hibernate é algo bacana provavelmente tenha algo parecido, uma olhada no google e na documentação e achei uma forma bem bacana e de certa forma elegante(não quanto o Ruby, xiita <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ) de se fazer tal funcionalidade.</span></p>
<p><span style="font-size: 13px; line-height: 19px;">Abaixo apresento uma classe Java Product que faz o uso do timestamp através de anotações do Hibernate.</span></p>
<p><script src="http://gist.github.com/450872.js"></script></p>
<p>Bom um tanto elegante também, mas &#8230; bom, tirei os gets e sets para deixar mais pequena, com essas anotações(@prePersist, @PreUpdate) iremos ter esses campos no banco igualmente temos no Rails, agora quando você persistir seu objeto ele ira gravar a data e a hora, e toda as vezes que você atualizar esse objeto no banco de dados ele irá atualizar a data e hora do campo updated, como na imagem a abaixo:</p>
<p><a href="http://edipolf.com/blog/wp-content/uploads/2010/04/Picture-1.png"><img class="alignnone size-full wp-image-473" title="Picture 1" src="http://edipolf.com/blog/wp-content/uploads/2010/04/Picture-1.png" alt="" width="352" height="92" /></a></p>
<p>Bom pessoal esse post foi rápido e espero que tenha sido bom. <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Até Logo. <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/04/25/criado_em-atualizado_em-timestamp-com-hibernate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Minha Primeira RubyGem &#8211; Gploy: automatizando deployment rails usando git push</title>
		<link>http://edipolf.com/blog/2010/03/31/minha-primeira-rubygem-gploy-automatizando-deployment-rails-usando-git-push/</link>
		<comments>http://edipolf.com/blog/2010/03/31/minha-primeira-rubygem-gploy-automatizando-deployment-rails-usando-git-push/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 00:50:13 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=467</guid>
		<description><![CDATA[Olá pessoas, ja fazia um tempão que não postava nada aqui, mas a coisa anda corrida por esses lados, mas vamos ao post. Recetemente lancei para o público a primeira gem que me arrisquei a fazer, essa gem está longe de ser perfeita e também esta bem longe de ter um bom código, mas como [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoas, ja fazia um tempão que não postava nada aqui, mas a coisa anda corrida por esses lados, mas vamos ao post.</p>
<p>Recetemente lancei para o público a primeira gem que me arrisquei a fazer, essa gem está longe de ser perfeita e também esta bem longe de ter um bom código, mas como é a primeira me perdoem <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>O que essa gem faz é simplesmente configurar seu projeto rails para usar o git para automatizar seu deploys, essa gem usas as configurações citadas pelo Fábio Akita <a href="http://akitaonrails.com/2010/02/13/deploy-com-git-push">neste post</a>, ou seja configura seu projeto localmente e o seu servidor para isso. Como sstou com um pouco de preguiça <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  irei colocar aqui somente por enquanto o link para o github e la tem a documentação(em inglês) de como usar(é fácil).</p>
<p><a href="http://github.com/edipofederle/gploy">Github Projet Page</a></p>
<p><a href="http://rubygems.org/gems/gploy">RubyGem Page</a></p>
<p>Valeu pessoas e comentem.</p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/03/31/minha-primeira-rubygem-gploy-automatizando-deployment-rails-usando-git-push/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby Série #6 &#8211; Exceções e Manipulação de Exceções &#8211; Parte 1</title>
		<link>http://edipolf.com/blog/2010/02/16/ruby-serie-6-excecoes-e-manipulacao-de-excecoes-parte-1/</link>
		<comments>http://edipolf.com/blog/2010/02/16/ruby-serie-6-excecoes-e-manipulacao-de-excecoes-parte-1/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 21:42:38 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://edipolf.com/blog/?p=460</guid>
		<description><![CDATA[<br />
<b>Warning</b>:  Missing argument 1 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in <b>/home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php</b> on line <b>432</b><br />
<br />
<b>Warning</b>:  Missing argument 2 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in <b>/home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php</b> on line <b>432</b><br />
Em linhas gerais uma exceção é um objeto que indica um tipo de condição excepcional, ela indica que algo muito errado aconteceu, um clássico exemplo de exceção é a divisão por zero, aposto que todos já passaram por algum caso de divisão por zero, chamar métodos que não existem, passar argumentos errados para métodos e [...]]]></description>
			<content:encoded><![CDATA[<p>Em linhas gerais uma <a href="http://pt.wikipedia.org/wiki/Tratamento_de_exceção">exceção</a> é um objeto que indica um tipo de condição excepcional, ela indica que algo muito errado aconteceu, um clássico exemplo de exceção é a <a href="http://en.wikipedia.org/wiki/Division_by_zero">divisão por zero</a>, aposto que todos já passaram por algum caso de divisão por zero, chamar métodos que não existem, passar argumentos errados para métodos e assim por diante, esses exemplos citados são todos erros de programação, mas uma exceção não é somente levantada por conta disso, também podemos ter outros tipos de exceções como tentar fazer o uso da rede quando a mesama estiver off.</p>
<p>Não irei falar mais sobre o que são exceções mas recomendo fortemente a leitura na <a href="http://pt.wikipedia.org/wiki/Tratamento_de_exceção">wikipedia</a> sobre isso.</p>
<p>Quando algum erro acontece, por exemplo à passagem de um argumento inválido para um método qualquer dizemos que uma exceção é levantada,  por padrão o Ruby finaliza o programa quando algo do tipo acontece, mas como iremos ver é possível fazer à declaração de manipuladores de exceções,  isto é um bloco de código que é sempre executado se uma exceção acontecer na execução de um bloco de código, quando uma exceção é levantada o que acontece é a transferência do fluxo de controle para um código que irá tratar essa exceção. Possivelmente você pode tentar fazer uma comparação com a delaração break para sair de um laço por exemplo, mas como iremos ver mais adiante as exceções são bem diferentes,  poderosas e flexíveis ao ponto de nos premitir transmitir o fluxo para n blocos.</p>
<p>No Ruby podemos fazer o uso do método raise para levantar exceções e fazer o uso da cláusula rescue para tratar as exceções.<br />
Todas exceções que são levantadas por raise são uma instância de classe Exception ou de alguma de suas subclasses.</p>
<p>Segue abaixo a hierarquia da classe <strong>Exception:</strong></p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;height:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC00FF; font-weight:bold;">Exception</span><br />
&nbsp;<span style="color:#CC00FF; font-weight:bold;">NoMemoryError</span><br />
&nbsp;<span style="color:#CC00FF; font-weight:bold;">ScriptError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">LoadError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">NotImplementedError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">SyntaxError</span><br />
&nbsp;<span style="color:#CC00FF; font-weight:bold;">SignalException</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">Interrupt</span><br />
&nbsp;<span style="color:#CC00FF; font-weight:bold;">StandardError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">ArgumentError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">IOError</span><br />
&nbsp; &nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">EOFError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">IndexError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">LocalJumpError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">NameError</span><br />
&nbsp; &nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">NoMethodError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">RangeError</span><br />
&nbsp; &nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">FloatDomainError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">RegexpError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">RuntimeError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">SecurityError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">SystemCallError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">SystemStackError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">ThreadError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">TypeError</span><br />
&nbsp; &nbsp;<span style="color:#CC00FF; font-weight:bold;">ZeroDivisionError</span><br />
&nbsp;<span style="color:#CC00FF; font-weight:bold;">SystemExit</span><br />
&nbsp;fatal</div></td></tr></tbody></table></div>
<p>Logicamente voçê não tem que saber cada uma delas(seus nomes não bem óbvios) o que você deve ter em mente é que algumas dessas classes extendem uma classe conhecida como StandardError, ou seja, exceções, digamos assim que acontecem com mais frequência, algumas outra expressões representam  níveis bem mais baixos, coisas que com menos possibilidade de recuperação logo os programas Ruby(normalmente) não tentam fazer a sua manipulação.</p>
<h3>Objetos dos métodos de excecção.</h3>
<p>Temos dois métodos que podem retornar alguns detalhes sobre uma dada exeção, esses métos são da classe Exception, message irá retornar uma sequência que permite obter alguns detalhes que podem ser entendidos por seres humanos, facilitando o entendimento de erros.<br />
Também temos outro método bastante importante que é o backtrace, backtrace irá retornar um array de sequências representando uma pilha no ponto em que a exceção foi levantada.</p>
<p><em>A[0] = posição no qual a exceção foi levantada.<br />
A[1] =  posição no qual o método que levantou a exceção foi chamado.<br />
A[2] = posição no qual esse método foi chmado.<br />
</em></p>
<p>E por ai vai, para poder ver um rastreamento da pilha o Ruby fornece um Método Kernel caller.</p>
<h3>Objetos de Exceção.</h3>
<p>Objetos de exceção são criados pelo método raise, também temos a opção de fazer a criação de nossos próprios objetos, normalmente usando o new ou com outra classe de métodos exception.</p>
<h3>Lançando Exceções com Raise.</h3>
<p>Quando um método do Kernel é sobreescreito uma exceção é levantada, fail é usado certas vezes quando há certa expectativa que seu programa deva ser finalizado pela exceção.<br />
Existem n formas de se invocar o método raise, veremos abaixo algumas dessas formas:</p>
<p><strong>Raise sem Argumentos</strong></p>
<p>	Se o método raise for chamado sem nenhum argumento, o mesmo irá criar um objeto do tipo RunTimeError que não irá ter nenhuma mensagem e então o levanta, por hora se raise for usado também sem argumento mas dentro de um rescue(iremos ver logo ele) o que irá acontencer é que a exceção(que estava sem manipulada)  irá ser re-levantada.</p>
<p><strong>Raise com um único argumento</strong></p>
<p>	Caso o raise for chamdo com um único argumento (objeto exception) ele irá levantar essa exceção.( Não é um forma muito comun se fazer o uso do raise)</p>
<p><strong>Raise com uma sequencia de argumentos.</strong></p>
<p>	Neste caso será criado um objeto novo de exceção( RunTimeError), é uma forma comun de fazer o uso do raise.</p>
<p><strong>Raise com objeto que possua uma exceção</strong></p>
<p>	Neste caso raise invoca tal método e levanta o objeto Exception que o mesmo retona.<br />
OBS: A classe Exception possue um método exception, isso quer dizer que você pode especificar a classe do objeto para qualquer tipo de exceçao para ser o primeiro argumento do raise.<br />
<strong></p>
<p>Raise com sequencia no terceiro argumento</strong></p>
<p>	Neste caso um array de sequências é especificado e então serão usados como o backtrace do objeto(exceção).<br />
OBS: Caso este terceiro argumentos não esteja especificado raise ira usar Kernel caller no backtrace.</p>
<p><strong><em>Exemplo 1:</em></strong></p>
<p>Até agora falamos muito, mas não colocamos nada em código ainda, vamos fazer um exemplo bem simples para começar, meio batido mas vou usar o exemplo fatorial novamente.</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#996600;">&quot;Argumento invalido&quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> n &lt; <span style="color:#006666;">1</span><br />
&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006666;">1</span> <span style="color:#9966CC; font-weight:bold;">if</span> n == <span style="color:#006666;">1</span><br />
&nbsp; n * fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006666;">-1</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">-4</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></td></tr></tbody></table></div>
<p><em><strong> ruby ex.rb<br />
120<br />
24<br />
3628800<br />
ex.rb:2:in `fatorial&#8217;: Argumento invalido (RuntimeError)<br />
	from ex.rb:10</strong></em></p>
<p>Este caso se encaixa no tipo de uso do raise um um único argumento, como dito antes temos outras formas de fazer a mesma coisa, por exemplo:</p>
<p><em>raise &#8220;Argumento invalido&#8221; if n < 1<br />
pode ser  perfeitamente substituido por:<br />
raise RuntimeError "Argumento invalido" if n < 1<br />
raise  RuntimeError.new "Argumento invalido" if n < 1 ou<br />
raise RuntimeError.exception "Argumento invalido" if n < 1</em></p>
<p>Claramente uma exceção RuntimeError não parece o mais apropriada para o caso do fatorial acima seria mais adequado usar um ArgumentError, ficando assim:</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span> <span style="color:#9966CC; font-weight:bold;">if</span> n &lt; <span style="color:#006666;">1</span><br />
&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006666;">1</span> <span style="color:#9966CC; font-weight:bold;">if</span> n == <span style="color:#006666;">1</span><br />
&nbsp; n * fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006666;">-1</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">-4</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></td></tr></tbody></table></div>
<p><em><strong>ruby ex.rb<br />
120<br />
24<br />
3628800<br />
ex.rb:2:in `fatorial&#8217;: ArgumentError (ArgumentError)<br />
	from ex.rb:10</strong></em></p>
<p>ou até mesmo você pode personalizar um pouco essa mensagem, por exemplo fazendo o seguinte:</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>, <span style="color:#996600;">&quot;Esperava um argumento &gt;= 1. Mas retornou #{n}&quot;</span>, <span style="color:#CC0066; font-weight:bold;">caller</span> <span style="color:#9966CC; font-weight:bold;">if</span> n &lt; <span style="color:#006666;">1</span><br />
&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006666;">1</span> <span style="color:#9966CC; font-weight:bold;">if</span> n == <span style="color:#006666;">1</span><br />
&nbsp; n * fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006666;">-1</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#CC0066; font-weight:bold;">puts</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">-4</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></td></tr></tbody></table></div>
<p><em><strong>ruby ex.rb<br />
ex.rb:7: Esperava um argumento >= 1. Mas retornou -4 (ArgumentError)</strong></em></p>
<p>Bom, bem melhor a mensagem assim ? O exemplo do fatorial é um código simples, você não irá querer escrever<a href="http://en.wikipedia.org/wiki/Unit_testing"> testes unitários</a> para ele(devia), pois podemos pensar facilmente nos casos em que ele irá falhar, se o código fose algo mais complexo e com n casos seria muito útil termos testes para eles, mas será que esse código de fatorial está ok ? claramente vemos que ele simplesmente checa se o número é positivo, mas não chega o tipo, isso pode ser facilmente resolvido adicionando um outro raise, assim:</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#CC00FF; font-weight:bold;">TypeError</span>, <span style="color:#996600;">&quot;Valor invalido, somente inteiros positivos&quot;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> n.<span style="color:#9900CC;">is_a</span>? <span style="color:#CC0066; font-weight:bold;">Integer</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>, <span style="color:#996600;">&quot;Esperava um argumento &gt;= 1. Mas retornou #{n}&quot;</span>, <span style="color:#CC0066; font-weight:bold;">caller</span> <span style="color:#9966CC; font-weight:bold;">if</span> n &lt; <span style="color:#006666;">1</span><br />
&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006666;">1</span> <span style="color:#9966CC; font-weight:bold;">if</span> n == <span style="color:#006666;">1</span><br />
&nbsp; n * fatorial<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006666;">-1</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>E por curiosidade aqui vai um simples teste unitário para o código acima:</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;test/unit&quot;</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;fatorial.rb&quot;</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">class</span> TestLibraryFileName &lt; <span style="color:#6666ff; font-weight:bold;">Test::Unit::TestCase</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> test_simples_cases<br />
&nbsp; &nbsp; assert_equal<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">120</span>, fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; assert_equal<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">6</span>, fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> test_negative_numbers<br />
&nbsp; &nbsp; assert_raise<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">ArgumentError</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">-1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> test_invalid_argument_type<br />
&nbsp; &nbsp; assert_raise<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">TypeError</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;a&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>Uma coisa que deve ser entendida aqui, é que muitas vezes exceçõe irão acontecer mesmo sem agente levanta-lás, ou seja, exceções no próprio código Ruby, então uma lição importante é saber manipula-lás mesmo sem agente nunca lenvantar sequer uma delas.</p>
<h3>O manipulador de Execções rescue</h3>
<p>O rescue é um declaração que deve ser usada em conjunto com a declaração begin, begin é um delimitador de bloco de código dentro das exceções sendo manipuladas(Vimos um pouco disso no post anterior), a declaração begin parece bom isso:</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">begin</span><br />
&nbsp; <span style="color:#008000; font-style:italic;">#algum código </span><br />
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =&gt; e<br />
&nbsp; <span style="color:#008000; font-style:italic;">#código da manipualação da exceção vem aqui, qualquer exceção levantada pelo código acima, cai aqui.</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>OBS: o Exception => e  é opcional, mas logo vermos que ele é útil.e</p>
<h3>Dando um nome para um Objeto de Exceção</h3>
<p>Podemos usar váriaveis para atribui-las um objeto de exceção(Exception), por exemplo:</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> simple<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>, <span style="color:#996600;">&quot;Argumento Invalido&quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> n &lt; <span style="color:#006666;">0</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">begin</span><br />
&nbsp; simple<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">-4</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =&gt; e<br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{e.class}: #{e.message}&quot;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p><em><strong>=>ArgumentError: Argumento Invalido</strong></em></p>
<p>Agora temos um váriavel global que faz referência ao objecto de exceção ( Exception ),  essa váriavel é a $!, temos outras n variáveis globais, outra interessante é a $@ que retorna o local do último erro.</p>
<p>Uma coisa a ser notada aqui é que a váriavel e ficará disponível após o rescue ser finalizado, veja esse exemplo:</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> simple<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>, <span style="color:#996600;">&quot;Argumento Invalido&quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> n &lt; <span style="color:#006666;">0</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">begin</span><br />
&nbsp; simple<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">-4</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =&gt; e<br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Dentro do Rescue&quot;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{e.class}: #{e.message}&quot;</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> $!<br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Erro em #{$@}&quot;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;&quot;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Fora do Rescue&quot;</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> $!<br />
<span style="color:#CC0066; font-weight:bold;">puts</span> e</div></td></tr></tbody></table></div>
<h3>Exceções por Tipo</h3>
<p>As execções mostras acima com o uso do rescue trata exceções StandardError, ou suas subclasses,  outras exceções que não tiverem dentro dessa hierarquia sera ignorado, então como podem tratar qualquer tipo de exceções ? Simples, faça o seguinte:</p>
<p><strong>Resuce Exception</strong></p>
<p>Agora você deve saber que para manipular um ArgumentError e atribuir isso para e, é simples:</p>
<p><strong>Rescue ArgumentError => ex</strong></p>
<p>E para definir mais que um tipo? Simples, simplesmente separe por virgula(,) elas.<br />
Então vemos um exemplo de como tratar duas exceções, ArgumentError, e TypeError,  mas queremos tratas ambas de forma diferentes.</p>
<div class="codecolorer-container ruby blackboard" style="border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">begin</span><br />
&nbsp; x = fatorial<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;f&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span> =&gt; e<br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Numero &gt;= que 1 eh preciso&quot;</span><br />
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">TypeError</span> =&gt; e<br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Tente com intiero&quot;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>Bom pessoal essa foi a primeira parte sobre como tratar exceções no Ruby, na segunda parte iremos ver sobre propagação de exceções, exceções que ocorrem dentro de exceções e outras coisas mais.</p>
<p>Espero que tenham gostado e comentem <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/02/16/ruby-serie-6-excecoes-e-manipulacao-de-excecoes-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Campanha #SouDev Twitter</title>
		<link>http://edipolf.com/blog/2010/01/29/campanha-soudev-twitter/</link>
		<comments>http://edipolf.com/blog/2010/01/29/campanha-soudev-twitter/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 16:43:31 +0000</pubDate>
		<dc:creator>Edipo L Federle</dc:creator>
				<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://edipolf.com/?p=449</guid>
		<description><![CDATA[Ontem chegou até min no twitter via @felipedeveloper uma mensagem sobre uma campanha #souDev no twitter, realmente não sei quem começou isso(se o fundador ler esse post por favor comente), essa campanha tem como simples objetivo fazer com que os desenvolvedores se &#8220;achem&#8221; no twitter e com isso fazer com que nossa timeline se torne [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem chegou até min no twitter via <a href="http://twitter.com/felipedeveloper">@felipedeveloper</a> uma mensagem sobre uma campanha #souDev no twitter, realmente não sei quem começou isso(se o fundador ler esse post por favor comente), essa campanha tem como simples objetivo fazer com que os desenvolvedores se &#8220;achem&#8221; no twitter e com isso fazer com que nossa timeline se torne algo melhor, onde possamos conhecer pessoas que trabalham com tecnologia, trocar informações e tudo mais.</p>
<p>Esse post tem como objetivo que o pessoal que ta participando do #SouDev deixe seu comentário para que eu possa ir adicionando aqui no post e com isso poder compilar opiniões de todos sobre a campanha, e até discutir formas de ampliar ela, quem sabe até um blog <img src='http://edipolf.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Então pessoas, o que vocês pensam do #SouDev ?</p>
]]></content:encoded>
			<wfw:commentRss>http://edipolf.com/blog/2010/01/29/campanha-soudev-twitter/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
