<?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>Léo Hackin 0.2c</title>
	<atom:link href="http://www.leohackin.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.leohackin.com.br</link>
	<description>Eternamente beta, geralmente funcional</description>
	<lastBuildDate>Tue, 12 Jan 2010 20:48:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHPzeiro? Adote um Framework! :)</title>
		<link>http://www.leohackin.com.br/2009/12/phpzeiro-adote-um-framework/</link>
		<comments>http://www.leohackin.com.br/2009/12/phpzeiro-adote-um-framework/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 21:29:53 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=342</guid>
		<description><![CDATA[
É notável a quantidade de aplicações em PHP que ainda utilizam nosso velho e conhecido modo Macarrônico de programar: dezenas de snippets e blocos de código que trabalham com regras de negócio, apresentação e tudo mais espalhados por N lugares na aplicação.
Esse método é justificável dentro da PHP até certo ponto: a própria linguagem tem [...]]]></description>
			<content:encoded><![CDATA[
<p>É notável a quantidade de aplicações em PHP que ainda utilizam nosso velho e conhecido modo <strong>Macarrônico</strong> de programar: dezenas de snippets e blocos de código que trabalham com regras de negócio, apresentação e tudo mais espalhados por N lugares na aplicação.</p>
<div id="attachment_344" class="wp-caption aligncenter" style="width: 318px"><a href="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-22-às-11.07.04.png"><img class="size-full wp-image-344 " title="Captura de tela 2009-12-22 às 11.07.04" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-22-às-11.07.04.png" alt="O PHP Macarrônico é assim" width="308" height="159" /></a><p class="wp-caption-text">O PHP Macarrônico é assim</p></div>
<p>Esse método é justificável dentro da PHP até certo ponto: <strong>a própria linguagem tem por princípio a simplicidade e velocidade</strong> na codificação e resolução de problemas. O próprio <a href="http://en.wikipedia.org/wiki/Rasmus_Lerdorf" target="_blank">Rasmus Lerdorf</a>, criador do PHP, já se mostrou bem contrário aos frameworks atuais pois eles são lentos e não escaláveis, culpa do feeling de  &#8221;<em>faz-tudo</em>&#8221; que a maioria delas leva no sentido de continuar ostentando a bandeira de &#8220;desenvolvimento rápido&#8221; da PHP, que muita gente confunde com gambiarras e que transformou a PHP em sinônimo de <strong>POG</strong> (Programação Orientada à Gambiarras).</p>
<p><span id="more-342"></span></p>
<p>Por muito tempo eu, como muitos desenvolvedores/empresas que conheço e já conversei, pensava assim:</p>
<blockquote><p>&#8220;<em>Porque vou abandonar toda aquela minha infra-estrutura pronta de gerenciamento de conteúdo e minhas bibliotecas caseiras que funcionam muito bem para adotar uma framework MVC e perder $$tempo$$ precioso ou impactar no $$prazo$$ que dei para o meu cliente. Não tem porque eu correr esse ri$co</em>&#8220;.</p></blockquote>
<p>Existem <strong>duas situações muito especiais </strong>que consigo identificar na hora de desenvolver uma aplicação e que impactam de forma crítica na <strong>decisão</strong> correta da arquitetura a ser seguida:<strong> necessidade de escalar a aplicação e potencial expansão de funcionalidades durante e depois do projeto</strong>.</p>
<p><em>Quantas aplicações de alta consumo de banda você já desenvolveu em sua empresa com PHP ? E dessas, quantas você realmente tem que dar uma atenção e implementação contínua de funcionalidades novas ?</em> <strong>Se você não contou nenhuma</strong>, o seu caso é bem comparável ao de muitos desenvolvedores PHP por aí. <strong>Se você contou alguma</strong> e<strong> não teve dores de cabeça</strong> com a manutenção ou testes em sua aplicação, <strong>você é um cara de sorte</strong>.</p>
<p>O <em>feijão com arroz </em>do desenvolvimento PHP no Brasil é muito atrelado à gerenciadores de conteúdo, front-end de websites e muitos projetos que geralmente são desenvolvidos por times por vezes multi-disciplinares. Um <strong>ecossistema comum</strong> são<em> agências digitais, bureau de mídias digitais</em> e várias outras<strong> que precisam desenvolver da forma mais simples e eficaz possível</strong>, muitas vezes devido até ao <strong>orçamento apertado</strong> e a menor margem de chance de que as coisas deêm errado para não ferrar um cronograma geralmente apertado e sem vez para os mais lentos. Juntamos isso à realidade dessas empresas que nem sempre tem um <strong>desenvolvedor</strong> com uma boa experiência, <strong>sem background de programação ou &#8220;migrados&#8221;</strong> de outras áreas e a lenha está feita.</p>
<p>Mesmo em ambientes mais profissionais, ainda existem aqueles que ainda resistem à idéia e são os &#8220;super-homens&#8221; que desenvolvem coisas que só eles conhecem e são difíceis de disseminar conhecimento válido na equipe.</p>
<p>Dentro desse contexto, <strong>algumas situações abaixo concerteza já rolaram com você </strong>ou na empresa em que você trabalha:</p>
<ul>
<li>Designers sobrescrevendo páginas com lógica de negócio embutida</li>
<li>Programadores detonando CSS dos outros</li>
<li>Classes das regras de negócio sendo alteradas a torto e direito ferrando algo que ja estava funcionando</li>
<li>Métodos espalhados pela aplicação com nomes bizarros e/ou funcionalidades redundantes ou no mínimo estranhas</li>
<li>Lógica de negócio repetidas, implementadas de formas diferentes e sem um lugar comum</li>
<li>Registros no banco de dados com dados incompletos e inconsistentes</li>
<li>Formulários que não validam tudo o que deveriam validar e que deixam cadastrar assim mesmo</li>
<li>e por ai vai &#8230;. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
</ul>
<p><strong>Puxadin ali, patchzin aqui</strong> e geralmente temos <strong>monstros</strong> burocráticos ou <strong>incontroláveis</strong> que temos que lidar com o passar do tempo: fruto de uma arquitetura por vezes equivocada mas que por N motivos não pode ser substituída. <em>E aí José ?</em></p>
<h2><span style="font-weight: normal;">Adote um framework!</span></h2>
<p>A <strong>solução mais sustentável</strong> para esse tipo de situação seja provavelmente a adoção de um framework, mas <strong>existe uma resistência</strong> muito grande que é completamente justificável: voltamos àquelas perguntas relativas à &#8220;<em>para que mexer num time que está ganhando?</em>&#8220;.</p>
<p>A resposta é:  &#8221;<em>Você pode ganhar muito mais a curto prazo e com mais qualidade de vida&#8221;</em>.</p>
<p><strong>Algumas perguntas e afirmações que já ouvi</strong> (e eu mesmo me fiz) antes de tudo:</p>
<ul>
<li>Meus programadores (ou eu) tem nível técnico para trabalhar com isso?</li>
<li>E tudo o que eu tenho? O que eu faço que isso ?</li>
<li>Isso vai atrasar o projeto cara!</li>
<li>MVC ? ORM? Que p*rra é essa ?</li>
<li>As funções dos meus includes já fazem tudo isso e muito melhor!</li>
<li>Bah! Já temos nosso ADM pronto: é só copiar, colar e alterar os campos. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>O cliente disse que quer apenas produtos e não vai precisar de nada mais.</li>
</ul>
<p>Todo esse tipo de pensamento/sentimento as vezes não vem de comodismo ou preguiça, mas da falta de conhecimento ou estudo de como uma framework pode ajudar no trabalho, até onde ela pode ir e principalmente em equipe multi-disciplinares com prazos ultra-curtos.</p>
<p>Então, vão <strong>algumas observações/pontos de vista</strong> em relação às principais frameworks PHP do mercado que podem resumir de certa forma alguns pontos positivos e relevantes para a adoção de uma framework:</p>
<ul>
<li><strong>Elas já estão bem difundidas, com boa documentação e geralmente tem uma curva de aprendizado mínima</strong>: com um mês um programador iniciante estará fazendo cadastros simples e bacanas;</li>
<li>Por serem frameworks de <strong>conhecimento público</strong>, a disseminação do conhecimento e uso é muito maior e não fica atrelado à uma ou duas pessoas;</li>
<li>Você não tem apenas uma ou duas pessoas pra fazer &#8220;aquela melhoria no envio de e-mail&#8221;: você terá uma comunidade para te ajudar com isso;</li>
<li><strong>Se o &#8220;dono da framework&#8221; morrer, você não perder todo o investimento</strong> na ferramenta porque não existe &#8220;dono&#8221;. Acaba aquela falácia do &#8220;super-homem&#8221; ou do &#8220;cara que fez a framework e só ele sabe mexer nisso&#8221;.</li>
<li>Estatisticamente comprovado, <strong>desenvolver e manter uma framework caseira é muito mais custoso</strong> que usar e customizar uma framework já extensamente utilizada no mercado, tanto à nivel de suporte quanto à melhoria da ferramenta e correção de bugs;</li>
<li><strong>O que traz diferencial para o negócio de seu cliente (e o seu) é o conhecimento de negócio</strong>: a ferramenta será apenas um meio e é mais que bacana que ela esteja pronta e você se preocupe apenas com o negócio e não como <em>&#8220;fazer aquele usuário logar e se manter autenticado em página X e Y&#8221;</em>.</li>
<li><strong>Frameworks trabalham com padrões de design testados e refatorados continuamente</strong> por pessoas com anos de experiência em software: é jogar dinheiro no lixo tentar re-inventar a roda ou re-implementar tudo se não for completamente necessário.</li>
<li>Programadores experientes terão uma ferramenta amplamente testada e na maioria das vezes bem flexíveis quando precisar adaptar &#8220;<em>aquela regra de negócio extraterrestre do cliente XPTO</em>&#8220;;</li>
<li>Frameworks tem um <strong>conjunto grande de plugins/componentes que cobre a maior parte das tarefas comuns</strong> como controle de sessão/cookies, envio de e-mails, upload de imagens, internacionalização, autenticação e por ai vai. Se não existir, geralmente é fácil (e muito didático) desenvolver algo novo e que a comunidade vai concerteza agradecer;</li>
<li>A parte de visualização dos dados (view) fica separada do controle das ações possíveis no sistema (controller), que por sua vez tem que respeitar as regras de negócio implementadas no acesso ao banco (model) que ficam centralizadas num lugar apenas: ou seja, o <strong>MVC (Model-View-Controller) vai diminuir bastante o quebra pau entre designers e programadores</strong> e evitar bastante re-trabalho. No caso de sistemas, vai melhorar e muito a manutenção deste;</li>
<li><strong>O trabalho com testes é praticamente embutido nessas frameworks</strong> e é uma forma ótima para iniciar os trabalhos com TDD nos projetos. Testes não são moda e sim uma tendência natural do mercado onde as aplicações precisam ser cada vez mais confiáveis para não trazer prejuízo para seu cliente;</li>
</ul>
<p><strong>Boa parte das dúvidas</strong> que geralmente se tem recaem principalmente na preocupação de comprometer um projeto com <strong>questões técnicas e impedimentos</strong> ou na parte do aprendizado em si da ferramenta. Felizmente, com o tempo se percebe que com empenho em <strong>cerca de um ou dois meses</strong> uma boa framework é <strong>absorvida naturalmente</strong>.</p>
<p>De certa forma, ela até mesmo <strong>promove uma auto-reciclagem</strong> de todos os profissionais pois começam a envolver questões como <strong>padrões de projeto, orientação à objetos, testes, controles de versão</strong> e tudo o que há mais de novo no mundo de desenvolvimento e que volta e meia não chega ao mundo das agências ou software houses mais caseiras.</p>
<h2><span style="font-weight: normal;">Em resumo</span></h2>
<p>A adoção de uma framework MVC não é um bixo de 15 cabeças cuspindo fogo e destruindo, mas assim como qualquer novidade apresenta riscos e custo, que CONCERTEZA são altamente recompensadores mesmo que no final ela não seja aproveitada: idéias são concebidas e o nível de conhecimento pós-experimentação é notadamente maior.</p>
<p>Para quem quiser tentar, <strong>algumas dicas podem ajudar</strong> (ao menos me ajudaram):</p>
<ul>
<li><strong>Inicie com projetos pequenos</strong> ou internos para sentir como a framework funciona e até mesmo descobrir características a favor ou contra sua adoção na empresa. <strong>Após conhecer pontos fortes e fracos, decida se ela é realmente viável em seu projeto</strong>;</li>
<li>Se você tem um time, <strong>escolha uma pessoa</strong> para estudar a ferramenta escolhida e <strong>depois faça um hands-on com a equipe </strong>pois assim as dúvidas/conclusões fluem de uma maneira surpreendente;</li>
<li><strong>Procure conhecer</strong> sobre OO (Orientação à Objetos), ORM (Object-Relational Mapping), MVC (paradigma Model-View-Controller), TDD (uso bastante o SimpleTest), controle de versão (estamos usando bastante o GIT) e metodologias ágeis (uso bastante o Scrum): essas coisas &#8220;puxam&#8221; junto um monte de outras coisas que vão fazer o aproveitamento de qualquer framework MUITO maior;</li>
<li><strong>Participe ativamente de listas</strong> para tirar dúvidas suas e dos outros: em pouco tempo se tornar um commiter em um projeto pode ser uma experiência e tanto de aprendizado;</li>
<li>Mantenha-se antenado nas novidades da framework: a maioria delas tem atualizações constantes e as vezes até chave para alguma coisas que sua empresa pretende fazer;</li>
</ul>
<p>Existem, claro, frameworks com diferentes abordagens e  vantagens. Então, para tentar encurtar o caminho mas sem traçar um comparativo muito técnico, vão algumas bacanas para se começar:</p>
<ul>
<li><a href="http://cakephp.org/" target="_blank"><strong>CakePHP</strong></a>, hoje uma das frameworks mais conhecidas e utilizadas no PHP, é uma ferramenta bem influenciada pelo Ruby On Rails, com documentação bacana e uma comunidade grande pacas. Sua curva de aprendizado é bem fácil e os resultados saem bem rápido também, devido ao enorme número de coisas prontas para serem utilizadas. Um ponto fraco é sua performance que não é tão rapida quanto às concorrentes;</li>
<li><strong><a href="http://codeigniter.com/" target="_blank">CodeIgniter</a></strong>, é uma framework que vai no caminho contrário da CakePHP: ela é mais enxuta e sem muitos componentes para rodar bem rápido. Sua curva é tranquila e a documentação bem bacana. Um ponto fraco é a ausência nativa de ORM para mapeamento do banco de dados.</li>
</ul>
<p><a href="http://www.phpframeworks.com/top-10-php-frameworks/" target="_blank">Existem várias frameworks</a>, com vários &#8220;sabores&#8221; a serem degustados:<strong> é ver, testar e ver qual mais agrada e ser feliz!</strong></p>
<p>Simbora.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/12/phpzeiro-adote-um-framework/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Gliffy : fluxogramas online fácil e rápido</title>
		<link>http://www.leohackin.com.br/2009/12/gliffy-fluxogramas-online-facil-e-rapido/</link>
		<comments>http://www.leohackin.com.br/2009/12/gliffy-fluxogramas-online-facil-e-rapido/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 17:26:26 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[diagramas]]></category>
		<category><![CDATA[gliffy]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=329</guid>
		<description><![CDATA[
Fluxogramas, UMLs, organogramas são coisas que todo mundo, seja da área de tecnologia ou não, sempre precisa fazer um dia para complementar um relatório, uma apostila, um post e por ai vai. Hoje em dia existem várias ferramentas desktop bacanas para esse fim.
Mas e quando não temos nada instalado e precisamos fazer um fluxograma descente [...]]]></description>
			<content:encoded><![CDATA[
<p>Fluxogramas, UMLs, organogramas são coisas que todo mundo, seja da área de tecnologia ou não, sempre precisa fazer um dia para complementar um relatório, uma apostila, um post e por ai vai. Hoje em dia existem várias ferramentas desktop bacanas para esse fim.</p>
<p><strong>Mas e quando não temos nada instalado e precisamos fazer um fluxograma descente e rapidin ?</strong> Já vi gente até apelando para aquelas bizarrices do Word: pra alguns funciona, mas vai fazer um rascunho de UML/Diagrama pra ver o lado bom da vida.</p>
<p>Para quem precisa de algo assim, vale a pena demais experimentar o <strong><a href="http://www.gliffy.com" target="_blank">Gliffy</a></strong>. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span id="more-329"></span></p>
<p><img class="alignleft size-full wp-image-335" style="margin: 10px;" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/gliffy_logo.gif" alt="" width="188" height="70" />Descobri por esses dias o <strong><a href="http://www.gliffy.com" target="_blank">Gliffy</a></strong>, uma ferramenta <strong>online</strong> de geração de diagramas bem bacana, fácil de mexer e<strong> o melhor: GRÁTIS por 30 dias na versão Premium! </strong>A <a href="http://www.gliffy.com/prodcomparison.shtml" target="_blank">diferença</a> crítica entre a versão <strong>Basic</strong> (que você terá após 30 dias se não quiser pagar pela versão Premium) além das adições significativas, é que você poderá ter apenas 5 mapas e todos eles serão públicos.</p>
<p>Então, se a sua idéia é mesmo fazer <strong>organogramas e coisas do tipo rapidim</strong> pra complementar aquele trabalho, essa é a ferramenta. <strong>Se você usa pra caramba</strong>, ainda acho que valeria avaliar a ferramenta, pois são apenas <strong>5 dólares por mês</strong>. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Para usar o serviço, basta se cadastrar e começar a usar. Enquanto estiver na versão Premium (que é a que você começa assim que se cadastra) você pode criar quantos documentos quiser.</p>
<h2><span style="font-weight: normal;">Interface e uso</span></h2>
<p>A interface é bem simplista e tem vários shapes (formas) acessíveis que podem ser usados e manipulados. Os menus também apresentam várias opções como agrupar elementos e afins.</p>
<div id="attachment_330" class="wp-caption aligncenter" style="width: 594px"><img class="size-full wp-image-330" title="A interface do Giffly é simples e intuitiva" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-08-às-11.50.13.png" alt="A interface do Giffly é simples e intuitiva" width="584" height="490" /><p class="wp-caption-text">A interface do Giffly é simples e intuitiva</p></div>
<p>A manipulação dos elementos é bem fácil também, com guias para aumentar, diminuir, rotacionar e inserir texto quando clicados duas vezes.</p>
<div id="attachment_332" class="wp-caption aligncenter" style="width: 393px"><img class="size-full wp-image-332" title="Manipulação de elementos" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-08-às-12.06.11.png" alt="Manipulação de elementos" width="383" height="265" /><p class="wp-caption-text">Manipulação de elementos</p></div>
<p>Outro lance bem bacana são as opções de propriedades e customizações, que são apresentadas num menu contextual, que apresenta diferentes opções dependendo do elemento selecionado.</p>
<div id="attachment_333" class="wp-caption aligncenter" style="width: 399px"><img class="size-full wp-image-333" title="Menu de opções contextualizado" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-08-às-11.50.29.png" alt="Menu de opções contextualizado" width="389" height="372" /><p class="wp-caption-text">Menu de opções contextualizado</p></div>
<h2><span style="font-weight: normal;">Exportando</span></h2>
<p>O Gliffy permite a exportação fácil para JPG/PNG. Ele possuiu um exportador para o Microsoft Visio também (formato SVG). Nunca se sabe né ?</p>
<div id="attachment_334" class="wp-caption aligncenter" style="width: 422px"><img class="size-full wp-image-334" title="Exportação" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-08-às-12.10.09.png" alt="Exportação" width="412" height="296" /><p class="wp-caption-text">Exportação</p></div>
<h2><span style="font-weight: normal;">E é isso</span></h2>
<p>Para quem quer algo pra fazer algo simples e no pulo, taí uma ótima ferramenta para quebrar o galho. Para quem quer algo para substituir ferramentas desktop tradicionais, vale a avaliação: eu sinceramente achei bem mais prático e com opções que o <a href="http://www.omnigroup.com/applications/OmniGraffle/" target="_blank">OmniGraffle</a> para Mac, um dos que o pessoal mais fala bem.</p>
<p>$imbora.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/12/gliffy-fluxogramas-online-facil-e-rapido/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mock Objects no SimpleTest</title>
		<link>http://www.leohackin.com.br/2009/12/mock-objects-no-simpletest/</link>
		<comments>http://www.leohackin.com.br/2009/12/mock-objects-no-simpletest/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 15:51:34 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[mockobjects]]></category>
		<category><![CDATA[simpletest]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=253</guid>
		<description><![CDATA[
Olá pessoal,
Continuando nossa sequência de artigos sobre o SimpleTest, já aprendemos como fazer testes unitários e agrupa-los para facilitar a execução em lote: agora vamos falar um pouco sobre mock objects.
Até agora, nossos testes unitários se resumiram a testar métodos e funcionalidades que envolviam apenas uma classe como nossa calculadora: tínhamos um método chamado &#8220;somar&#8221; que [...]]]></description>
			<content:encoded><![CDATA[
<p>Olá pessoal,</p>
<p>Continuando nossa sequência de artigos sobre o <a href="http://www.simpletest.org" target="_blank">SimpleTest</a>, já aprendemos <a href="http://www.leohackin.com.br/2009/07/iniciando-com-o-simpletest/" target="_blank">como fazer testes unitários</a> e <a href="http://www.leohackin.com.br/2009/07/agrupando-casos-de-teste-no-simpletest/" target="_blank">agrupa-los</a> para facilitar a execução em lote: agora vamos falar um pouco sobre <strong>mock objects</strong>.</p>
<p>Até agora, nossos testes unitários se resumiram a <strong>testar métodos e funcionalidades que envolviam apenas uma classe</strong> como nossa calculadora: tínhamos um método chamado &#8220;somar&#8221; que fazia parte da própria classe e recebia como parametro de entrada apenas dois inteiros.</p>
<p>A idéia do <strong>teste unitário</strong> (ou de unidade), como o próprio nome diz, é <strong>isolar e testar apenas aquele ponto e funcionalidade</strong> do software: então é imprescindível que possamos isolar da melhor maneira apenas a classe/métodos que desejamos testar para que, caso apresente falha, possamos <strong>identificar exatamente onde a falha ocorreu</strong>.</p>
<p>Mas e quando nossa classe depende de outra(s) classe(s) para fazer um método funcionar ?</p>
<p><span id="more-253"></span></p>
<h2><span style="font-weight: normal;">Conceituando o problema</span></h2>
<p>Então, vamos imaginar a seguinte situação: estamos desenvolvendo um software de e-commerce e em dado momento precisamos validar se um usuário existe em nosso banco de dados. Apesar das possibilidades abrangentes de um sistema de validação/autenticação, vamos nos preocupar com o básico e implementá-lo de uma forma simples como abaixo:</p>
<div id="attachment_264" class="wp-caption aligncenter" style="width: 568px"><img class="size-full wp-image-264" title="As classes usadas no validador" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/diagrama_validator.gif" alt="As classes usadas no validador" width="558" height="181" /><p class="wp-caption-text">As classes usadas no validador</p></div>
<p>Vamos criar uma classe chamada <em><span style="text-decoration: underline;">Validator</span></em>, que receberá o login do usuário, verificará no banco de dados se ele existe ou não e validará seu acesso. Para tanto, nossa classe de validação terá um método chamado <em>validate</em>, que receberá um parâmetro <em>string</em> representando o nome do usuário a ser validado.</p>
<p>Para conectar-se ao banco de dados, nossa classe receberá em sua criação um objeto referente à classe <em><span style="text-decoration: underline;">Conexao</span></em>, que disponibilizará um método chamado <em><span style="text-decoration: underline;">query</span></em>, que consulta o banco e retorna uma array de resultados.</p>
<p><strong><span style="color: #000080;">classe validator.php</span></strong></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Validator <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$conexao</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">conexao</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$conexao</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> validate<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// aqui vai a lógica para verificar se o usuário existe ou não e que vamos testar</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p><span style="color: #000080;"><strong><span style="color: #333399;">classe conexao.php</span></strong></span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Conexao <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// configura o acesso ao banco de dados</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> query<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// retorna um array com os resultados da consulta</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Para que tudo fique mais claro, podemos dar uma olhada em como ficaria nosso código final da aplicação:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Config<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$Conexao</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$validator</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Validator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$usuario</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Léo'</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$validator</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$usuario</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// redireciona para a página restrita</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #666666; font-style: italic;">// retorna uma alerta falando que o usuário não existe</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Como aprendemos em nosso primeiro artigo sobre TDD, <strong>primeiro fazemos os testes e depois fazemos nossa aplicação passar nos neles</strong>, implementando a lógica de negócio válida. Nosso objetivo nesse momento é <strong>testar o método validate</strong>: fazendo um pouco de nossa flexão mental chegamos a dois comportamentos válidos para o método:</p>
<ul>
<li>Se o usuário existir, ele retornará true;</li>
<li>Se o usuário não existir, ele retornará false;</li>
</ul>
<h2><span style="font-weight: normal;">O problema </span></h2>
<p>Então, pensamos &#8220;<em>Bacana! Então vou fazer um caso de teste chamado ValidatorTestCase e um teste chamado testValidarSeUsuarioExistir que irá validar se um usuário foi validado se ele existir!</em>&#8220;.</p>
<p>Partimos para o código então:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> ValidatorTestCase <span style="color: #000000; font-weight: bold;">extends</span> UnitTestCase <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> testValidarSeUsuarioExistir<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Config<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Conexao<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$validator</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Validator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEqual</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$validator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Léo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p><strong>Tudo ok ?</strong> <span style="color: #800000;"><strong><span style="color: #ff0000;">NADA OK!</span></strong></span> O código acima pode funcionar mas temos alguns problemas:</p>
<ul>
<li>Como garantir que nosso banco de dados vai estar disponível na hora do teste ?</li>
<li>Como vamos saber se existe o usuário que queremos testar está no banco, para testarmos se a validação realmente vai passar no teste e se comportar como queremos ?</li>
<li>E se ocorrer um erro de conexão ao banco no meio do teste ?</li>
<li>E se a conexão banco for demorada e nosso caso de teste ter 50 testes acessando o banco? oO</li>
<li>Como saber se as configurações estão exatas para a conexão no banco? Aliás, eu nem sei nada sobre config até agora!</li>
<li>E principalmente: e se ocorrer um problema na pesquisa da query que não tenha nada haver exatamente com nosso validador, já que nosso objetivo é testar unicamente se &#8220;ao receber um usuário, verificar se ele existe no banco e validar em caso afirmativo&#8221;.</li>
</ul>
<p><strong>Haja coisa né ?</strong></p>
<h2><span style="font-weight: normal;">Mock Objects (nosso boneco de testes)</span></h2>
<p>Pensando nesse problema, foram criados os <strong>Mock objects</strong>. Um mock object (vou usar o termo em inglês pois a esmagadora maioria das referências TDD estão assim) nada mais é que <strong>um objeto que simula e imita o comportamento de um objeto real</strong>.</p>
<p>Imagine os <strong>bonecos de teste de batidas de carro</strong>: os engenheiros os constroem com peso, altura, juntas e vários aspectos que <strong>imitam o corpo de um ser humano para poderem fazer seus testes</strong>. Eles colocam esses bonecos nas mais variadas situações e posições possíveis para testarem a segurança de um carro entre outras coisas, sem precisar matar ninguém para isso. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>No nosso caso, nossos <strong>mock objects são representações de classes reais onde podemos simular e forçar qualquer comportamento que desejamos para testarmos certas situações</strong> que talvez não seriam possíveis de serem alcançadas &#8220;explicitamente&#8221; sem gambiarra-las ou mesmo que sejam de dificil configuração.</p>
<p>Em resumo, usamos um mock quando nossa classe real (<span style="color: #c0c0c0;">colado do wikipedia &#8211; thank&#8217;s god</span>):</p>
<ul>
<li>gera resultados não deterministicos (e.g. a hora ou temperatura atual);</li>
<li>tem estados que são difíceis de criar ou reproduzir (e.g. erro de comunicação da rede);</li>
<li>é lento (e.g. um banco de dados completo que precisa ser inicializado antes do teste);</li>
<li>ainda não existe ou pode ter comportamento alterado;</li>
<li>teriam que adicionar informações e métodos exclusivamente para os testes (e não para sua função real).</li>
</ul>
<p>Analisando nosso problema anterior, podemos constatar que nossa classe <em><span style="text-decoration: underline;">Conexao</span></em> é forte candidata à ser &#8220;mockeada&#8221;: assim nos livramos de todos aqueles problemas de conexão, de existência de registros e tudo mais que não tem nada haver com nosso teste unitário em si, que diz respeito pura e diretamente à nossa classe <em><span style="text-decoration: underline;">Validator</span></em>.</p>
<p>Ou seja, <strong>ao invés de usar a classe Conexao real, vamos usar uma &#8220;imitação&#8221; dela, muito mais simples e fácil de manipular</strong> para chegarmos de forma mais simples ao nosso resultado esperado no teste unitário. Vamos utilizar esse mock pois não faz sentido testar a conexão nem nenhum método dessa classe e sim utilizar o comportamento referente ao código que vamos utilizar no nosso teste.</p>
<h2><span style="font-weight: normal;">Codando!</span></h2>
<p>Como vimos, nossa classe <em><span style="text-decoration: underline;">Conexao</span></em> não tem nada implementado ainda. Mas isso não nos interessa pois vamos fazer um mock da classe, para podermos simular o que precisamos: o retorno dos resultados que desejamos para testar o método <em><span style="text-decoration: underline;">validate</span></em> do <em><span style="text-decoration: underline;">Validator</span></em>.</p>
<p><strong>Para criar um mock de nossa classe</strong>, simplesmente fazemos o include dessa classe em nosso teste e &#8220;geramos&#8221; esse mock com o método <em><span style="text-decoration: underline;">generate</span></em> da classe <em><span style="text-decoration: underline;">Mock</span></em> (que é importada automaticamente no nosso include do autorun.php do Simpletest).</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'simpletest/autorun.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'conexao.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'validator.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
Mock<span style="color: #339933;">::</span><span style="color: #004000;">generate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Conexao'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Com isso, vamos gerar um clone mockeado da classe <span style="text-decoration: underline;"><em>Conexao</em></span> para podermos usa-la em nossos testes.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'simpletest/autorun.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'conexao.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'validator.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
Mock<span style="color: #339933;">::</span><span style="color: #004000;">generate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Conexao'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> ValidatorTestCase <span style="color: #000000; font-weight: bold;">extends</span> UnitTestCase <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> testValidarSeUsuarioExistir<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MockConexao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #339933;">...</span><br />
<span style="color: #339933;">...</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Fácil né ?</p>
<h2><span style="font-weight: normal;">Mocks como atores</span></h2>
<p>Agora que sabemos como criar um mock, <strong>vamos aprender a &#8220;imitar&#8221; o que a classe original faz afim de &#8220;simular&#8221; os resultados</strong> que queremos ter para fazer nossos testes passarem.</p>
<p>Os Mocks podem se comportar de duas maneiras:</p>
<ul>
<li>como <strong>Atores (Actors)</strong>, onde o Mock é usado para simular o retorno de propriedades e métodos (e o que vamos usar aqui).</li>
<li>como <strong>Críticos (Critics)</strong>, onde o Mock é usado para guardar e verificar as interações entre os objetos num teste.</li>
</ul>
<blockquote><p>Quando trabalhamos com o Mock apenas como Ator, apenas simulando o retorno de propriedades e métodos, ele é considerado um &#8220;server stub&#8221;, que nada mais é que um objeto que simula um comportamento. Existe uma grande discussão existe em torno disso, mas por enquanto vamos deixar pra lá pois vamos falar sobre os Mocks como uma ferramenta para testes baseados em interação no próximo post e isso vai ficar mais claro.</p></blockquote>
<p>Se analisarmos a classe <em><span style="text-decoration: underline;">Conexao</span></em> novamente, vamos chegar à conclusão que o método que vai ser utilizado em nosso teste será apenas o <em><span style="text-decoration: underline;">query</span></em>: vamos fazer uma consulta à base dados buscando todos os usuários cujo nome seja igual ao parametro que enviarmos ao método <em><span style="text-decoration: underline;">validate</span></em>.</p>
<p><strong>Nosso mock da </strong><em><span style="text-decoration: underline;"><strong>Conexao</strong></span></em><strong> ainda não sabe fazer nada, mas podemos instrui-lo a retornar o que a quisermos</strong>. Por exemplo, em nosso teste chamado <strong>testValidarSeUsuarioExistir</strong> vamos ter que dizer ao mock para retornar sempre um resultado que satisfaça nosso teste. Ou seja, como no exemplo da implementação, se eu envio &#8220;Léo&#8221; ele tem que me devolver um resultado onde &#8220;Léo&#8221; esteja presente, pois queremos testar o comportamento do <em><span style="text-decoration: underline;">validate</span></em> e não o retorno de valor da conexão.</p>
<p>Então, <strong>vamos fazer nosso mock devolver sempre um resultado onde exista o usuário &#8220;Léo&#8221; no resultado</strong>.</p>
<p>Como vimos, nosso método <em><span style="text-decoration: underline;">query</span></em> retorna uma array com os resultados da consulta. Vamos então instruir o mock a retornar sempre um array quando o método query for chamado. Quando o objeto é mockeado, ele ganha vários métodos, entre eles o <strong>s</strong><strong>etReturnValue: esse método diz ao mock &#8220;retorne sempre X resultado quando tal método for chamado&#8221;</strong>.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MockConexao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$conexao</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setReturnValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'query'</span><span style="color: #339933;">,</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Léo'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Pronto! Agora podemos testar nosso validate:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'simpletest/autorun.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'conexao.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'validator.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
Mock<span style="color: #339933;">::</span><span style="color: #004000;">generate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Conexao'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> ValidatorTestCase <span style="color: #000000; font-weight: bold;">extends</span> UnitTestCase <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> testValidarSeUsuarioExistir<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MockConexao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$conexao</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setReturnValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'query'</span><span style="color: #339933;">,</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Léo'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$validator</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Validator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEqual</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$validator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Léo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>O que aconteceu em nosso teste:</p>
<ul>
<li>Criamos um mock do nossa classe Conexao</li>
<li>Instanciamos esse mock em nosso teste</li>
<li>Instruimos ao mock para que ele devolvesse sempre um array com o usuário Léo quando o método query fosse chamado</li>
<li>Instanciamos nosso validator, passando como parâmetro nossa conexao mockeada</li>
<li>fizemos o teste para verificar se a validação deu certo</li>
</ul>
<p>Fui roda-lo e &#8230;.</p>
<div id="attachment_310" class="wp-caption aligncenter" style="width: 624px"><img class="size-full wp-image-310" title="Opsss! Falhou! :D" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-04-às-19.31.10.png" alt="Opsss! Falhou! :D" width="614" height="298" /><p class="wp-caption-text">Opsss! Falhou! <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p></div>
<p>Temos nosso resultado esperado, afinal <strong>não implementamos ainda nosso método <em><span style="text-decoration: underline;">validate</span></em></strong>. Então, vamos resolver isso:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;"><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="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Validator <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$conexao</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">conexao</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$conexao</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> validate<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$resultados</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">conexao</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select id, nome from users where nome = '<span style="color: #006699; font-weight: bold;">{$nome}</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/array_search"><span style="color: #990000;">array_search</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #339933;">,</span><span style="color: #000088;">$resultados</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Implementamos uma lógica onde fazemos uma pesquisa ao banco pedindo para selecionar o id e o nome da tabela users onde o nome seja igual ao parâmetro enviado. <strong>A mágica acontece finalmente</strong>: nossa &#8221; falsa conexao&#8221; foi instruída a retornar sempre um array com uma posição apenas, onde o resultado sempre é Léo. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Agora quando rodamos o teste:</p>
<div id="attachment_315" class="wp-caption aligncenter" style="width: 521px"><img class="size-full wp-image-315" title="Teste do validator agora com a implementação" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-05-às-10.25.05.png" alt="Teste do validator agora com a implementação" width="511" height="281" /><p class="wp-caption-text">Teste do validator agora com a implementação</p></div>
<p><strong>Bingo! Nosso teste passou!</strong></p>
<p>Para comprovarmos que o funcionamento do <em><span style="text-decoration: underline;">validate</span></em> está correto, vamos complementar nosso caso de teste adicionando um teste pra verificar se informarmos um usuário que não existe, ele retornar false.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:550px;height:350px;"><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 />29<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'simpletest/autorun.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'conexao.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'validator.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
Mock<span style="color: #339933;">::</span><span style="color: #004000;">generate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Conexao'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> ValidatorTestCase <span style="color: #000000; font-weight: bold;">extends</span> UnitTestCase <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> testValidarSeUsuarioExistir<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MockConexao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$conexao</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setReturnValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'query'</span><span style="color: #339933;">,</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Léo'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$validator</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Validator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEqual</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$validator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Léo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> testNaoValidarSeUsuarioNaoExistir<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MockConexao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$conexao</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setReturnValue</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'query'</span><span style="color: #339933;">,</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Léo'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$validator</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Validator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$conexao</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEqual</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$validator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Jeveaux'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Vamos testar denovo e &#8230;</p>
<div id="attachment_322" class="wp-caption aligncenter" style="width: 523px"><img class="size-full wp-image-322" title="Fazendo dois testes" src="http://www.leohackin.com.br/wp-content/uploads/2009/12/Captura-de-tela-2009-12-05-às-12.42.23.png" alt="Fazendo dois testes" width="513" height="281" /><p class="wp-caption-text">Fazendo dois testes</p></div>
<p>Mantemos o nosso mock retornando apenas &#8220;Léo&#8221; nos resultados, mas dessa vez passamos o nome &#8220;Jeveaux&#8221; para procurar e como esperado, ele retornou false, dado que o usuário &#8220;Jeveaux&#8221; não existe. <strong>Show!</strong></p>
<h2><span style="font-weight: normal;">Ufa! Vamos resumir o testamento</span></h2>
<p>O aprendizado de mock objects é um pouco abstrato inicialmente mas com alguma prática se revela uma técnica perfeita e viável para fazemos nossos testes unitários funcionarem de forma correta e independente. A utilização do Mock Object apenas como ator (ou server stub como você lerá muito por ai) é apenas uma parte do poder real de um mock.</p>
<p>Dentro de nosso entendimento, podemos resumir que um<strong><em> mock object é uma imitação de nosso objeto real que podemos manipular de forma fácil e simples para que ele faça exatamente o que quisermos, facilitando assim a implementação de nossos testes unitários e isolando nossas classes</em></strong>.</p>
<p>Algumas leituras legais melhorar o entendimento dos Mock Objects:</p>
<ul>
<li><a href="http://www.simpletest.org/en/mock_objects_documentation.html" target="_blank">Mock Objects no SimpleTest [ doc oficial do SimpleTest ]</a></li>
<li><a href="http://www.improveit.com.br/xp/praticas/tdd/mock_objects" target="_blank">Testes de unidade com mock objects [ ImproveIt ]</a></li>
<li><a href="http://codebetter.com/blogs/jeremy.miller/archive/2005/12/19/135757.aspx" target="_blank">Mock Objects and Stubs: The Bottle Brush of TD</a>D</li>
<li><a href="http://pt.wikipedia.org/wiki/Mock_Object" target="_blank">Mock Objects [ Wikipedia]</a></li>
</ul>
<p>Outra referência bem bacana é o <a href="http://www.jeveaux.com" target="_blank">blog do Jeveaux</a>, meu revisor TDD oficial e grande conhecer de causa. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>No próximo post vamos ver como trabalhar com nosso Mock Object em sua forma mais plena e com um exemplo um pouco mais complexo para partir também para o modo Critic. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Simbora.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/12/mock-objects-no-simpletest/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Giran no 4º QUARTA WEB</title>
		<link>http://www.leohackin.com.br/2009/12/giran-no-4%c2%ba-quarta-web/</link>
		<comments>http://www.leohackin.com.br/2009/12/giran-no-4%c2%ba-quarta-web/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 13:23:53 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Sociedade]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[giran]]></category>
		<category><![CDATA[mercado]]></category>
		<category><![CDATA[webcapixaba]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=246</guid>
		<description><![CDATA[
Aloha people!
Nesta quarta-feira, dia 02/12, rola no Canto da Roça da Praia do Canto o 4º Quarta Web, um evento que reúne vários profissionais da internet capixaba todo mês e vem se tornando uma referência no estado. Geralmente o evento ocorre sempre na última quarta do mês, mas excepcionalmente dessa vez será feito na primeira [...]]]></description>
			<content:encoded><![CDATA[
<p>Aloha people!</p>
<p>Nesta quarta-feira, dia 02/12, rola no Canto da Roça da Praia do Canto o <strong>4º Quarta Web</strong>, um evento que reúne vários profissionais da internet capixaba todo mês e vem se tornando uma referência no estado. Geralmente o evento ocorre sempre na última quarta do mês, mas excepcionalmente dessa vez será feito na primeira quarta-feira do mês. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O evento é um evento da comunidade <a href="http://webcapixaba.ning.com/" target="_blank">WebCapixaba</a>, organizado pelo André Fiorini @castiglioni, Celso Hora @cchcreative, Filipe Giacomin @filipegb e Paulo Henrique &#8220;PH&#8221; @ph_etc_br. O <a href="http://webcapixaba.ning.com/" target="_blank">WebCapixaba</a> é uma comunidade online de profissionais da internet capixaba bem bacana: <a href="http://webcapixaba.ning.com/" target="_blank">se não conhece acessa agora rapá!</a></p>
<p>O assunto dessa vez será <strong>&#8220;O que esperar do mercado web em 2010&#8243;</strong> e terá um formato de mesa redonda, onde irão participar pessoas de grandes agências envolvidas diretamente com web, como o Gilber Machado (<a href="http://www.e-brand.com.br" target="_blank">E-brand</a>) e o Rodrigo Quintão (<a href="http://www.4ps.com.br" target="_blank">4Ps</a>), respectivamente sócios-diretores das empresas em questão.</p>
<p>Tive a <strong>honra de ser convidado para participar</strong> da mesa redonda também, afim de representar a <a href="http://www.giran.com.br" target="_blank">Giran</a> e também tentar contribuir um pouco com a vivência de internet que tenho. Acredito que vá ser uma oportunidade legal das pessoas verem diretamente o que grandes agências e empresas novas como a nossa pensam à respeito de carreira, tecnologia, tendências e tudo mais.</p>
<p>O mediador da mesa será o Rafael Silveira, do <a href="http://www.gazetaonline.com.br" target="_blank">Gazeta Online</a>, e o papo está previsto para iniciar-se às 19:00.</p>
<p>O evento é freeware: <a href="http://bit.ly/7Uw2kt" target="_blank">basta inscrever-se no do evento</a> e aparecer lá com idéias, perguntas e tudo o que você achar interessante ser discutido. =) Para mais informações sobre o evento, <a href="http://webcapixaba.ning.com/forum/topics/4-quarta-web-o-que-esperar-do" target="_blank">clique aqui para acessar o tópico sobre o evento</a>.</p>
<p>Nos vemos por lá. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/12/giran-no-4%c2%ba-quarta-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Organizando o dia de trabalho</title>
		<link>http://www.leohackin.com.br/2009/11/organizando-o-dia-de-trabalho/</link>
		<comments>http://www.leohackin.com.br/2009/11/organizando-o-dia-de-trabalho/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 19:51:19 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[mapamental]]></category>
		<category><![CDATA[organização]]></category>
		<category><![CDATA[pomodoro]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=234</guid>
		<description><![CDATA[
Você é organizado ? Já tentou se organizar pra trabalhar melhor ?
Sua forma de organização lhe permite trabalhar de forma efetiva e com qualidade de vida ?
Me fiz essas reflexões à alguns dias e me considerei uma pessoa moderadamente organizada na vida profissional, mas ainda num caos quando se fala de contas pra pagar e [...]]]></description>
			<content:encoded><![CDATA[
<p><strong>Você é organizado ? Já tentou se organizar pra trabalhar melhor ?</strong><br />
<strong>Sua forma de organização lhe permite trabalhar de forma efetiva e com qualidade de vida ?</strong></p>
<p>Me fiz essas reflexões à alguns dias e me considerei uma pessoa moderadamente organizada na vida profissional, mas ainda num caos quando se fala de contas pra pagar e tarefas pessoais. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Isso era um tanto diferente, mas com sorte hoje estou bem melhor. Ajuda de alguns tarados por organização, como meu sócio Paulo&nbsp;<a href="http://www.jeveaux.com" target="_blank">Jeveaux</a>, e algumas ferramentas que hoje me fazem trabalhar menos mas com mais efetividade.</p>
<p>Então, afim de compartilhar experiências e inspirado pelo post de <a href="http://www.jeveaux.com/blog/2009/procrastinacao-nao/" target="_blank">Procrastinação</a> do Jeve, acho que vale relatar o que estou usando hoje para organizar melhor o meu dia de trabalho.</p>
<h2><span id="more-234"></span></h2>
<h2><span style="font-weight: normal;">Organizando as pendências, idéias e tudo mais</span></h2>
<p><strong>Antes</strong> eu ficava pensando e resolvendo os <strong>problemas sob demanda</strong>: os problemas iam se acumulando e anotava em papéis ou na minha <span style="text-decoration: line-through;">finada</span> agenda. O problema disso era que papéis e agenda me induziam à utilização de <strong>listas</strong>, o que nunca me deixava ter uma visão macro dos problemas que eu tinha.</p>
<p>Se eu começava com minhas pendências pessoais, deixava minhas pendências profissionais lá no final da folha ou numa folha avulsa: isso me <strong>levava inconscientemente à ficar rodando feito barata tonta</strong> lendo e vendo o que eu poderia resolver naquele momento.</p>
<p>Outro ponto negativo era &#8220;quando&#8221; eu iria resolver: as <strong>idéias acabavam se misturando</strong> as coisas que concretamente deveriam ser resolvidas, com datas de vencimento e tudo mais.</p>
<p>A solução foi repartir o processo em três fases:</p>
<p><span style="color: #800000;"><strong><span style="color: #800000;">1) Organizar as idéias num mapa menta</span></strong></span><strong><span style="color: #800000;">l</span></strong>, de modo que eu tivesse uma visão macro e organizada de todas as pendências, idéias e tudo mais. A forma de organização agrupada e ramificada do mapa mental ajudou e muito a fugir das listas e assim conseguir enxergar &#8220;de uma vez&#8221; tudo o que eu tinha pra fazer. Rapaz, tinha coisa pra caramba.</p>
<p>Estou usando ultimamente o <strong>MindMeister</strong> (<a href="http://www.mindmeister.com/" target="_blank">http://www.mindmeister.com/</a>), que é online, gratuito e o mais irado: você pode fazer brainstorms com outras pessoas em tempo real. Existem outras opções open source (como o <a href="http://freemind.sourceforge.net/" target="_blank">FreeMind</a>) e outras mais robustas e pagas como o <a href="http://www.mindjet.com/products/mindmanager-8-win/overview" target="_blank">MindManager</a>.</p>
<p><strong><span style="color: #800000;">2) Decompor as pendências e idéias em partes menores e tarefas mais simple</span></strong><span style="color: #800000;"><strong>s</strong></span>. Imagine que você tem uma tarefa &#8220;Fazer cartões de visita&#8221;. Vamos pensar direito: será que a tarefa é mesmo apenas fazer o cartão ??? Eu fiz a decomposição assim:</p>
<p>- fazer a arte do cartão<br />
- fazer orçamentos de impressão do cartão<br />
- escolher o melhor orçamento e enviar a arte do cartão<br />
- fazer o pagamento do cartão<br />
- buscar o cartão</p>
<p>&nbsp;<strong>Pronto!</strong> Agora tenho tarefas pequenas que eu posso resolver durante dois ou três dias em pequenos intervalos de tempo.</p>
<p>A <strong>decomposição das tarefas</strong> foi quase um exercício de <strong>refatoração</strong> de software: olhar, repensar, re-escrever. Esse exercício contínuo vai fazendo nosso &#8220;bom senso&#8221; crítico melhorar e assumir que somos atarefados e que &nbsp;o <em>achismo</em> não adianta muito. Então, porque não conseguir fazer algo com aqueles 15 min de ociosidade que você fica olhando pra tela sem saber o que vai fazer. Aposto que muitos tem esses momentos &#8220;<em>E agora, o que eu vou fazer?</em>&#8220;.</p>
<p>Outro ponto que <strong>ajudou muito</strong> foi meu contato diário com <strong>Scrum/XP</strong> na Giran: <em>ora bolas, será que se eu transformar minha pendência numa user storie e o que preciso fazer para resolver isso em tarefas não daria certo ?</em> Pior que deu. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><img class="size-full wp-image-237 alignleft" title="appicon-things" src="http://www.leohackin.com.br/wp-content/uploads/2009/11/appicon-things1.jpg" alt="appicon-things" width="154" height="154" />Ai entra em cena as <strong>ferramentas de gerenciamento e organização de tarefas</strong>: existem várias por aí mas a que estou usando e tem me dado um resultado surpreendente é a <a href="http://culturedcode.com/things/" target="_blank">Things</a>, da Cultured Code. A ferramenta permite você organizar tarefas com datas de expiração, sem data mas que precisam ser feitas e outras que você pode fazer &#8220;qualquer dia desses&#8221;. Além disso, o programa aceita tagear cada tarefa.</p>
<p>O pulo do gato com ela foi a versão para iPhone: com isso eu tenho sempre as tarefas sincronizadas e alarmes tanto no meu Macbook quando no iPhone quando estou na rua. Perfeito.</p>
<p><strong><span style="color: #800000;">3</span></strong><strong><span style="color: #800000;"><span style="color: #800000;">)</span> Definir as prioridades para serem feitas na próxima semana</span></strong>. Isso é feito continuamente e tem que ser feito num momento de tranquilidade e de preferência num ambiente relaxante de sua casa ou seu dia. <strong>Define-se para a próxima semana o que tem que ser feito, organizando isso por prioridade e importância.</strong></p>
<p>Contas a serem pagas, ligações para clientes, <strong>processos com vencimento próximo ou definido</strong>, feedback de propostas e afins são geralmente os que entram nessa lista. No caso das contas, é legal botar sempre elas com um dia da antecedência, para evitar problemas aos 45 do segundo tempo (uma vez tinha uma conta pra pagar que minha transferência online não permitia pagar &#8211; paguei juros à toa).</p>
<p><strong>Em seguida</strong>, vem as tarefas de trabalho dos projetos correntes, ligações para resolução de pendências futuras e <strong>tarefas corriqueiras do cotidiano</strong>, leitura técnica (na Giran a gente tem uma hora diária de leitura) e coisas que não precisam de algo muito pontual mas precisam ser resolvidas logo.</p>
<p><strong>Em terceiro lugar</strong>, eu penso: &#8220;<em>Agora que ja resolvi o que é prioridade e o que precisa ser feito em algum momento, o que eu vou priorizar dos meus outros projetos</em>&#8220;. Aí entram meus projetos pessoais, leituras avulsas, pesquisa de <strong>alguma coisa nova fora do escopo</strong> e tudo mais.</p>
<h2><span style="font-weight: normal;">Hora de trabalhar!!!</span></h2>
<p>No Things, as tarefas ficam organizadas em projetos. Por exemplo, a Giran tem um projeto com várias tarefas, com tags comuns como por exemplo &#8220;novosite&#8221;, &#8220;cursosdeverao&#8221; e por ai vai. Com elas distribuidas no meu Things, é hora de arregaçar as mangas.</p>
<p>O <strong>fluxo de trabalho então segue diário</strong>. Não que se precise ser feito algo cíclico e repetitivo do tipo &#8220;cara-cracha-cara-cracha&#8221;: isso é o que me induzia a tornar o cotidiano uma coisa f*da de aguentar. A idéia foi transformar o cotidiano em pontos que devem ser satisfeitos e não numa check list de conferência.</p>
<p>Então, organizo as <strong>tarefas que vou fazer pela manhã e à tarde, sem definir exatamente a ordem delas</strong>. Por exemplo: eu sei que devo ligar para o Paulo para resolver um problema, mas vai ser algo que pode atrapalhar um pouco meu &#8220;astral&#8221;. Então, de manhã eu deixo pra fazer as coisas mais tranquilas, priorizando aquelas que eu TENHO que concluir no dia, e deixo pra resolver problema a tarde.</p>
<p>Muita gente acha que o trabalho de um desenvolvedor é apenas &#8220;lógico&#8221;, mas existe muito do &#8220;criativo&#8221; na resolução de problemas e estratégias, não no sentido de re-inventar a roda ou gambiarrar a coisas, mas na definição da melhor solução. E como criativos, sabemos que interferências, problemas e tudo mais complica mesmo o aproveitamento 100%. Por isso a regra é: faça as coisas de cabeça fresca e deixe para resolver, se possível, os verdadeiros &#8220;problemas&#8221; após fazer o que deve ser feito.</p>
<p>Na <strong>H</strong>ora de fazer a coisa em si, entra a <strong>necessidade de foco</strong>: mas como manter o foco com Twitter, MSN, telefone e piadistas natos ao meu lado? A algum tempo pensei até que eu tinha DDA (Disturbio de Déficit &nbsp;de Atenção), tamanho eram os gaps e lags entre uma coisa e outra pra fazer e mesmo durante.</p>
<p><img class="alignleft size-full wp-image-241" title="pomodoro_logo" src="http://www.leohackin.com.br/wp-content/uploads/2009/11/pomodoro_logo.jpg" alt="pomodoro_logo" width="212" height="160" />Entrou em cena algumas formas de manter o foco, como fechar tudo, trabalhar com fones de ouvido. Mas a coisa melhorou bastante depois do Pomodoro. A <a style="color: #ed1e24; text-decoration: none; padding: 0px; margin: 0px;" href="http://www.pomodorotechnique.com/">Pomodoro Technique</a>&nbsp;é uma forma de você <strong>trabalhar com auto-recompensa</strong>: você trabalha num box de tempo de 25 minutos focado numa tarefa apenas. Por exemplo, &#8220;Ligar para agência para ver como andam os cartões de visita&#8221;. O Paulo Jeveaux tem um <a href="http://www.jeveaux.com/blog/2009/procrastinacao-nao/" target="_blank">ótimo post sobre isso</a>, como tinha dito.</p>
<p><strong>D</strong><strong>urante 25 minutos você se mantem COMPLETAMENTE focado</strong> nisso. <strong>Após os 25 minutos, você ganha um intervalo de 5 minutos para fazer QUALQUER COISA</strong>. Isso mesmo: qualquer coisa. Tomar um café, responder seu amigo no MSN, tuitar. Acabado os 5 minutos, é hora de fazer mais pomodoros.</p>
<p><strong>Depois de 4 pomodoros, você tem 15 minutos de intervalo</strong>: tempo o bastante até pra jogar uma partida de video game. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pensei no início que isso quebraria meu raciocínio para tarefas mais longas: mas o que aconteceu foi que as tarefas se tornaram peças bem definidas dentro do meu turno matutino e vespertino de trabalho, já que entre o trabalho codando, existe todo o trabalho de gerência e resolução de problemas do dia-a-dia da Giran.</p>
<h2><span style="font-weight: normal;">Resumindo a epopéia</span></h2>
<p>Acredito que cada um tenha uma forma bacana de organização, mas quando realmente tive que começar a separar os problemas pessoais, de projeto e cotidianos profissionais, precisei de um foco de Jedi para manter-se na linha e tentar produzir a contento.</p>
<p>Existem N técnicas e formas de organização, mas até para mim que assumidamente é uma pessoa desorganizada, essa forma deu certo e acredito que possa ao menos ajudar na vida de pessoas que vivem a 300 km/h no dia-a-dia. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Em poucas palavras:</p>
<ol>
<li>Organizar TODAS as pendências num mapa mental para você ter uma visão macro de tudo o que você tem de pendente, de preferência organizando em grupos e subgrupos as pendências co-relacionadas;</li>
<li>Pegar cada pendência e tentar decompor em várias pequenas tarefas que possam ser concluídas em momentos separados, tornando assim a possibilidade de conclusão da tarefa menos penosa quando você tem um zilhão de coisas pra fazer ao mesmo tempo;</li>
<li>Com as tarefas separadas, cataloga-las num gerenciador de tarefas de forma que você possa agrupar essas tarefas por dia, prioridade e tags.</li>
<li>Escolher quais as tarefas serão feitas na próxima semana, priorizando contas, ligações e problemas que tem datas de &#8220;vencimento&#8221;, em segundo lugar o que se tem de trabalho normal e em último lugar os extras como leituras avulsas, visitas à sites esquisitos, pesquisa de coisas novas e tudo relacionado ao seu ócio criativo.</li>
<li>Manter o foco nas tarefas de forma individual e concentrada. Para quem tem problemas com isso, usar a Pomodoro Technique pode ajudar pra caramba.</li>
</ol>
<p><strong>Ufa!</strong> O post ficou meio longo mas espero que para quem chegou até essa linha curta um pouco. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Simbora!</p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/11/organizando-o-dia-de-trabalho/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Cursos Java de Verão na Giran</title>
		<link>http://www.leohackin.com.br/2009/11/cursos-java-de-verao-na-giran/</link>
		<comments>http://www.leohackin.com.br/2009/11/cursos-java-de-verao-na-giran/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 00:55:59 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[giran]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=228</guid>
		<description><![CDATA[
[ Momento jabá ]
Verão é praia, cerveja, sombra, água fresca e …&#160;JAVA!
A partir do dia&#160;07/12&#160;vamos iniciar as turmas de verão da&#160;Formação Java Profissional, curso da&#160;Caelum&#160;já famoso no Brasil e agora oferecido no estado pela Giran. Durante esse período ofereceremos a formação mais básica da plataforma, bastante requisitada pelo público local.
Os cursos oferecidos serão:
FJ-11 &#124; Java [...]]]></description>
			<content:encoded><![CDATA[
<p>[ Momento jabá ]</p>
<p>Verão é praia, cerveja, sombra, água fresca e …&nbsp;<strong>JAVA!</strong></p>
<p>A partir do dia&nbsp;<strong>07/12</strong>&nbsp;vamos iniciar as turmas de verão da&nbsp;<strong>Formação Java Profissional</strong>, curso da&nbsp;<a style="color: #b85b5a; text-decoration: none;" href="http://www.caelum.com.br/">Caelum</a>&nbsp;já famoso no Brasil e agora oferecido no estado pela Giran. Durante esse período ofereceremos a formação mais básica da plataforma, bastante requisitada pelo público local.<span id="more-228"></span></p>
<p>Os cursos oferecidos serão:</p>
<p><strong>FJ-11 | Java e Orientação à Objetos</strong><br />
O intuito do curso é quebrar o paradigma procedural, apresentando aos poucos seus problemas e encontrar suas soluções mediante a orientação a objetos com a linguagem Java e suas principais bibliotecas. Da leitura de arquivos a conexões TCP.<br />
<a style="color: #b85b5a; text-decoration: none;" href="http://www.caelum.com.br/curso/fj-11-java-orientacao-objetos/" target="_blank">Clique aqui para mais detalhes sobre o curso</a></p>
<p><strong>FJ-21 | Java para desenvolvimento Web</strong><br />
Diante do tamanho do mercado de desenvolvimento web em Java, este curso não visa apenas mostrar os conceitos básicos de uma web application, mas também apresentar frameworks conhecidos para aplicar o padrão arquitetural Model View Controller, de hibernate e struts a JSP com JSTL e EL.<br />
<a style="color: #b85b5a; text-decoration: none;" href="http://www.caelum.com.br/curso/fj-21-java-web/" target="_blank">Clique aqui para mais detalhes sobre o curso</a></p>
<p><strong>FJ-16 | Laboratório Java com Testes, XML e Design Patterns</strong><br />
Um laboratório para aplicar as boas práticas da Orientação a Objetos em um projeto Desktop com Swing, XML, JFreeChart, Testes Unitários com JUnit, Ant, Maven, Refactoring e mais.<br />
<a style="color: #b85b5a; text-decoration: none;" href="http://www.caelum.com.br/curso/fj-16-laboratorio-java-testes-xml-design-patterns/" target="_blank">Clique aqui para mais detalhes sobre o curso</a></p>
<p>Teremos&nbsp;<strong><span style="color: #0000ff;">turmas pela manhã, a tarde e à noite&nbsp;</span></strong>para atender tanto estudantes como profissionais que trabalham durante o dia inteiro. Por se tratar da inauguração oficial de nossa nova sala de treinamento, teremos descontos especiais para as turmas do dia para compensar a praia, as cervejas e gratificar pela vontade de aprender mais.</p>
<p><strong><span style="color: #ff0000;">Sobre o treinamento em si</span></strong>, o material será composto por&nbsp;<strong>apostila, pasta, caneta e bloco de anotações</strong>. O inscrito, ao final do curso, ganha um<strong>cer</strong><strong>tificado Giran/Caelum reconhecido nacionalmente.</strong></p>
<p>Para quem não nos conhece ainda, a Giran é uma empresa especializada em consultoria e treinamentos localizada em Jardim da Penha e conta com uma sala de treinamento nova em folha, com laptops Dell de ponta, ar condicionado e sala de descanso com TV, video-game, balas, água e café. Nos intervalos do curso, é oferecido um coffee break bem bacana para acompanhar o bate-papo.</p>
<p><img class="alignnone size-full wp-image-229" title="IMG_0246" src="http://www.leohackin.com.br/wp-content/uploads/2009/11/IMG_0246.JPG" alt="IMG_0246" width="442" height="332" /></p>
<p>O treinamento será&nbsp;<strong>ministrado por profissionais com bastante experiência</strong>&nbsp;não apenas em Java, mas também no mercado de software capixaba e brasileiro. Isso significa que além do que há na apostila, um monte de informação sobre o dia-a-dia e cotidiano de um desenvolvedor/analista/arquiteto de soluções é passado, discutido e ensinado em nossas aulas.</p>
<p>Então, deixe seu guarda-sol e protetor solar na gaveta e venha para a Giran passar algumas horas descontraídas de muito Java, programação e conhecimento.&nbsp;<span style="color: #ff0000;"><strong>Ligue para 3026-0264 e informe-se sobre datas, valores e formas de pagamento.</strong></span></p>
<p><strong>Atenção estudantes</strong>: não faremos “meia” mas daremos um desconto no preço final do curso para alunos de algumas faculdades parceiras. Consulte-nos!&nbsp;<img style="max-width: 100%; padding: 0px;" src="http://blog.giran.com.br/wp-includes/images/smilies/icon_smile.gif" alt=":)" /></p>
<p>E para quem quiser ajudar na divulgação, segue o flyer virtual abaixo:</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><img class="alignnone" title="Cartaz" src="http://blog.giran.com.br/wp-content/uploads/2009/11/cursos_verao_giran.jpg" alt="" width="494" height="700" /></p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/11/cursos-java-de-verao-na-giran/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Problema com IDs alfanuméricos no form-&gt;input (select) do CakePHP</title>
		<link>http://www.leohackin.com.br/2009/11/problema-com-ids-alfanumericos-no-form-input-select-do-cakephp/</link>
		<comments>http://www.leohackin.com.br/2009/11/problema-com-ids-alfanumericos-no-form-input-select-do-cakephp/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 05:42:58 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=211</guid>
		<description><![CDATA[
Para quem já está mexendo com CakePHP a algum tempo, algumas limitações de funcionalidades podem tirar um pouco o sono de quem está muito mal acostumado com a produtividade da framework. Em geral, toda framework tem seus pontos fracos.
A algum tempo, tive um problema curioso: a chave primária de uma tabela teria valores alfanuméricos. Ou [...]]]></description>
			<content:encoded><![CDATA[
<p>Para quem já está mexendo com CakePHP a algum tempo, algumas limitações de funcionalidades podem tirar um pouco o sono de quem está muito mal acostumado com a produtividade da framework. Em geral, toda framework tem seus pontos fracos.</p>
<p>A algum tempo, tive um problema curioso: a chave primária de uma tabela teria valores alfanuméricos. Ou seja: valores como &#8220;205-A&#8221;, &#8220;JB02&#8243; e outros bizarros seriam possíveis. Regra de negócio definida, modificação do modelo para o nome de chave fora da convenção e tudo corria bem até que populei um select.<br />
 <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Qual não foi minha surpresa em ver que o CakePHP, além de não marcar o valor correto, em certos casos ainda selecionava mais de um valor no select. #fail total.</p>
<p><span id="more-211"></span></p>
<p>Pesquisa na internet, perguntas na lista de discussão oficial do CakePHP e as respostas eram:</p>
<ul>
<li>Coisas que não tinha nada haver com o problema</li>
<li>Sugestões pra mudar a estratégia para resolver o problema</li>
<li>Gente falando que o CakePHP só trampa com valores numérico (o que de fato acontece <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</li>
</ul>
<h2>O problema</h2>
<p>Então, mexendo no código pra cima e pra baixo (sem conotações sexuais por favor) consegui achar o problema.</p>
<p>No arquivo &nbsp;cake/libs/views/helpers/form.php (cakephp 1.2.5), na linha 1710:</p>
<pre class="brush: php;">if ((!$selectedIsEmpty &amp;&amp; $selected == $name) || ($selectedIsArray &amp;&amp; in_array($name, $selected))) {</pre>
<p>Depois de fuçar e testar um pouco, vi que o problema principal na verdade é um problema com o próprio operador == do PHP: ele trata as operações entre strings e numéricos (<a href="http://php.net/manual/en/language.operators.comparison.php" target="_blank">http://php.net/manual/en/language.operators.comparison.php</a>)&nbsp;de uma forma que gera os seguintes resultados:</p>
<ul>
<li>um valor como 206-1 por exemplo, o helper casava tanto o valor 206-1 (o correto) quanto 206 (string == integer).</li>
<li>um valor como JB01 por exemplo, o helper casava tanto o valor JB01 (o correto) quanto 0 (string == integer).</li>
</ul>
<p>Devido à característica do PHP de resolver qual o tipo da variável em tempo real, ele tenta fazer o casting da variável sempre e acaba gerando resultados não esperados pra gente.</p>
<h2>Solução</h2>
<p>A solução então foi forçar (type casting) as variáveis para serem tratadas como strings. Assim, evitamos que o PHP transforme nossas variáveis em tipos distintos (no nosso caso string e integer) e consequentemente faça a comparação de valores do jeito que precisamos.</p>
<p>A linha 1710 (no <em>cakephp 1.2.5</em> ou 1748 no <em>cakephp 1.3-dev</em>) ficou assim:</p>
<pre class="brush: php;">if ((!$selectedIsEmpty &amp;&amp; (string)$selected == (string)$name) || ($selectedIsArray &amp;&amp; in_array($name, $selected))) {</pre>
<p>Note o type casting sendo feito nas variáveis $selected e $name. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Se alguem conseguir uma solução mais bacana ou encontrou outro bug bizarro do CakePHP, compartilhe! <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Simbora!</strong></p>
<p><strong>Update: <span style="font-weight: normal;">Eu tinha reportado esse erro a algum tempo no track de bugs do CakePHP &nbsp;e hoje vi que já corrigiram isso.&nbsp;</span><span style="font-weight: normal;">Então, quando sair a versão stable do cake 1.3, não precisa mais se preocupar com isso. <img src='http://www.leohackin.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </span></strong></p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/11/problema-com-ids-alfanumericos-no-form-input-select-do-cakephp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Layout novo!</title>
		<link>http://www.leohackin.com.br/2009/11/layout-novo/</link>
		<comments>http://www.leohackin.com.br/2009/11/layout-novo/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 01:07:04 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Pessoal]]></category>

		<guid isPermaLink="false">http://www.leohackin.com.br/?p=200</guid>
		<description><![CDATA[
Vamo lá pessoal! Layout novo, posts novos!
Estou devendo vários posts sobre o SimpletTest, CakePHP, PHP e blablablabla. Esse lance de twitter realmente me afastou no blogging mas o mundo não para e nem a gente!
Amanhã é nóis! Keep blogging! \\//

]]></description>
			<content:encoded><![CDATA[
<p>Vamo lá pessoal! Layout novo, posts novos!</p>
<p>Estou devendo vários posts sobre o SimpletTest, CakePHP, PHP e blablablabla. Esse lance de twitter realmente me afastou no blogging mas o mundo não para e nem a gente!</p>
<p><strong>Amanhã é nóis! Keep blogging! \\//</strong></p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/11/layout-novo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IV Encontro de Java do Espírito Santo &#8211; IV EJES</title>
		<link>http://www.leohackin.com.br/2009/10/iv-encontro-de-java-do-espirito-santo-iv-ejes/</link>
		<comments>http://www.leohackin.com.br/2009/10/iv-encontro-de-java-do-espirito-santo-iv-ejes/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 11:35:59 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Ahn?]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/2009/10/iv-encontro-de-java-do-espirito-santo-iv-ejes/</guid>
		<description><![CDATA[
Olá pessoal,
No próximo sábado (17/10) será realizado em Vila Velha o IV Encontro de Java do Espírito Santo &#8211; IV EJES.
O EJES é um evento anual realizado pelo ESJUG (Grupo de Usuários Java do Espírito Santo &#8211; esjug.org) e já está em sua quarta edição. Este ano o evento será realizado no Cineteatro da UVV [...]]]></description>
			<content:encoded><![CDATA[
<p>Olá pessoal,</p>
<p>No próximo sábado (17/10) será realizado em Vila Velha o IV Encontro de Java do Espírito Santo &#8211; IV EJES.</p>
<p>O EJES é um evento anual realizado pelo ESJUG (Grupo de Usuários Java do Espírito Santo &#8211; esjug.org) e já está em sua quarta edição. Este ano o evento será realizado no Cineteatro da UVV das 08:00h às 18:00h.</p>
<p>Este ano, assim como nas outras edições, o evento foi pensado e organizado de modo a trazer assuntos quentes e atuais, colocados em pauta por palestrantes capixabas e de fora do estado, que são referências na comunidade Java. Esta é, com certeza, uma oportunidade rara para conhecer as novidades do mundo Java e se aprofundar em conceitos e ferramentas já consagradas. E por último mas não menos importante: O Networking! Encontrar pessoas da sua área, rever antigos amigos de trabalho e fazer muitos novos contatos são coisas que só um evento como este podem te proporcionar.</p>
<p>Participe, não fique de fora. A próxima edição agora só em 2010 =)</p>
<p>Mais informações e inscrições: http://ejes.esjug.org</p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/10/iv-encontro-de-java-do-espirito-santo-iv-ejes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Voltemos!</title>
		<link>http://www.leohackin.com.br/2009/08/voltemos/</link>
		<comments>http://www.leohackin.com.br/2009/08/voltemos/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 14:59:05 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Ahn?]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=192</guid>
		<description><![CDATA[
Salve pessoal,
Sumida boa a que rolou, mas foi por bons motivos.
A Giran, empresa minha com meu sócio-irmão Paulo Jeveaux, está em franco crescimento e o último mês foi &#8220;frenético&#8221;: muitos projetos, pessoas e oportunidades novas e bacanas. Então, tive que pisar no freio com o blog. Agora vamos voltar com os posts semanais.
A novidade agora [...]]]></description>
			<content:encoded><![CDATA[
<p><img class="size-medium wp-image-193 alignright" title="IMG_0006" src="http://leohackin.com.br/wp-content/uploads/2009/08/IMG_0006-300x225.jpg" alt="IMG_0006" width="300" height="225" />Salve pessoal,</p>
<p>Sumida boa a que rolou, mas foi por bons motivos.</p>
<p>A Giran, empresa minha com meu sócio-irmão Paulo Jeveaux, está em franco crescimento e o último mês foi &#8220;frenético&#8221;: muitos projetos, pessoas e oportunidades novas e bacanas. Então, tive que pisar no freio com o blog. Agora vamos voltar com os posts semanais.</p>
<p>A novidade agora é que adquiri um Macbook Pro 13&#8243; e um iPhone 3GS: sim, sou tarado na maçã.</p>
<p>Voltando aos artigos técnicos, vamos ter Mock Objects no Simple Test essa semana e provavelmente mais dois que estou rascunhando. =)</p>
<p>Simbora!</p>

]]></content:encoded>
			<wfw:commentRss>http://www.leohackin.com.br/2009/08/voltemos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
