<?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>Saga do programador</title>
	<atom:link href="http://www.sagadoprogramador.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sagadoprogramador.com.br</link>
	<description></description>
	<lastBuildDate>Thu, 22 Sep 2011 04:20:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Um feedback sobre o Agile Brazil 2011 &#8211; Parte III</title>
		<link>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-o-agile-brazi-2011-parte-iii/</link>
		<comments>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-o-agile-brazi-2011-parte-iii/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 05:05:38 +0000</pubDate>
		<dc:creator>Luciano Castilhos</dc:creator>
				<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[AGILE BRAZIL]]></category>
		<category><![CDATA[Kaban]]></category>
		<category><![CDATA[LEAN]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=901</guid>
		<description><![CDATA[Nesta última parte deixarei minha conclusão sobre o evento e sugestões para próxima edição. Antes disso gostaria de falar um pouco sobre o open space de Lean Startup que ocorreu lá. Lean Startup é um paradigma (se que podemos chamar dessa forma) onde o objetivo principal é a criação de um produto da forma mais [...]]]></description>
			<content:encoded><![CDATA[<p>Nesta última parte deixarei minha conclusão sobre o evento e sugestões para próxima edição. Antes disso gostaria de falar um pouco sobre o open space de Lean Startup que ocorreu lá. Lean Startup é um paradigma (se que podemos chamar dessa forma) onde o objetivo principal é a criação de um produto da forma mais rápida e barata possível, porém usando o feedback de um usuário real deste produto. Em relação ao custo, recomenda-se usar sempre que possível ferramentas e serviços open source. Já a questão da velocidade pode-se combinar metodologias ágeis com o pensamento Lean. Usar Continuous Delivery pode ser útil para aumentar melhorar o feedback do cliente. A idéia é criar protótipos o mais rápido possível e evoluir o produto a partir da experiência do usuário. O que parece ser mais desafiante é a questão de descobrir o que o usuário realmente precisa. Não existe uma receita de bolo para fazer isso. O que deve ser sempre evitado é tentar adivinhar o que o mercado precisa. Parece existir um consenso nestas mesas redondas de que tentar descobrir por conta própria uma necessidade antes de conceber um novo produto não é eficiente. Em vez disso, deve-se encontrar uma forma de fazer o próprio cliente (ou usuário) passar esta informação. O debate no open space foi focado nesta questão de descobrir a necessidade do cliente. Foi uma discussão muito interessante, porque muitos participantes contaram suas próprias experiências. Uns usaram questionários, outros fake features, mas parece que havia um consenso de que uma rápida entrevista presencial com os reais usuários parece ser o método mais eficiente. Outro ponto interessante foi ver o Joshua participando. Um dos participantes fez uma &#8220;tradução simultânea&#8221; para ele, e quando ele precisou falar, o pessoal se virou para entender.</p>
<p><span id="more-901"></span></p>
<p>Em relação as minhas impressões finais, conforme falei na primeira parte, o fato de terem introduzido muitas novidades no formato do evento foi essencial para não parecer uma repetição da edição do ano passado. O legal também foi ver que eles preocupados em colher o feedback do usuário e prover mudanças o mais rápido possível. No primeiro dia deixei no quadro &#8220;Não gostei&#8221; o fato de não ter café durante as palestras e deixei como sugestão o &#8220;Continuous Coffee&#8221;. E não é que a partir do segundo dia eles colocaram mesas com garrafas térmicas com café ao lado de cada sala! O mesmo ocorreu com água. No segundo dia teve também uma pessoa distribuindo a grade do dia impressa.</p>
<p>Em relação ao conteúdo, o nível dos keynotes foi excelente. Teve bastante palestra gringa também. Vi muitas pessoas reportando, no quadro &#8220;Gostei&#8221;, que a tradução simultânea estava bem legal também. Outro ponto positivo é que não houve apenas palestras. Teve workshops, tutoriais e os Lightning Talks que conforme já disse foi a novidade que mais gostei. Ao final do último dia teve sorteio de brindes e uma surpresa, um show de humor com o comediante Zé Modesto que animou bastante o pessoal.</p>
<p>Vou deixar aqui uma espécie de &#8220;Inicia-Para-Continua&#8221; para a próxima edição:</p>
<p><strong>Inicia:</strong></p>
<p>- Gravação de todas as palestras e disponibilização em um canal único.<br />
- Stand para venda de livros.<br />
- Mais spots para uso de notebooks.<br />
- Continuous Coffee sempre! <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
- Resumo das palestras do dia.<br />
- Mecanismo mais eficiente de confirmação de inscrição. A minha (e de outras pessoas) não foi confirmada. Precisei falar diretamente com um dos organizadores e mesmo assim no dia do credenciamento meu nome não estava no sistema.<br />
- Keynote com Luca Bastos. <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Para:</strong></p>
<p>- Stands gigantes no meio do salão, dificulta muito a circulação.<br />
- Mesa do coffee break em lugar quase inacessível.<br />
- Muitas palestras sobre um mesmo tema (TDD). Talvez tenha sido uma melhoria do evento passado, pois ano passado teve poucas palestras sobre o tema.</p>
<p><strong>Continua:</strong></p>
<p>- Achados e perdidos.<br />
- Stand de atendimento.<br />
- Atualização das informações via Twitter, inclusive sobre pertences perdidos.<br />
- Open spaces, lightning talks, palestras gringas.<br />
- Tomadas e extensões para carregar o notebook em todas as salas.<br />
- Diminuir a luz durante as palestras!<br />
- &#8220;Auxiliar técnico&#8221; para os palestrantes.<br />
- Tradução simultânea.<br />
- Excelente qualidade do sistema de áudio.<br />
- Coffee break sem miséria. <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
- Continuous Coffee.<br />
- Folha com programação do dia.<br />
- Internet rápida.<br />
- Quadro para deixar o feedback.<br />
- Sistema on-line para feedback de cada palestra.<br />
- O valor da inscrição acessível.</p>
<p>Bem é isso. Recomendo a todos irem na próxima edição que será em São Paulo. Não sou bom nisso, mas creio que o número de participantes tenha sido parecido com a edição passada (cerca de 900 pessoas). Vamos aguardar o Agile Brazil 2012!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-o-agile-brazi-2011-parte-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Um feedback sobre Agile Brazil 2011 – Parte II</title>
		<link>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-agile-brazil-2011-%e2%80%93-parte-ii/</link>
		<comments>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-agile-brazil-2011-%e2%80%93-parte-ii/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 15:15:26 +0000</pubDate>
		<dc:creator>Luciano Castilhos</dc:creator>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Inspection]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Kaban]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[AGILE BRAZIL]]></category>
		<category><![CDATA[METODOS ÁGEIS]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=837</guid>
		<description><![CDATA[Nessa parte, abordarei as palestras e os lightnings talks que assisti no Agile Brazil 2011. A leitura deste post ficaria muito densa se eu colocasse tudo o que vi no evento. Sendo assim, a ideia é fazer uma espécie de &#8220;show do intervalo&#8221; apresentando os &#8220;melhores momentos&#8221; do evento. Continuous Inspection &#8211; An effective approch [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa parte, abordarei as palestras e os lightnings talks que assisti no Agile Brazil 2011. A leitura deste post ficaria muito densa se eu colocasse tudo o que vi no evento. Sendo assim, a ideia é fazer uma espécie de &#8220;show do intervalo&#8221; apresentando os &#8220;melhores momentos&#8221; do evento.</p>
<h2>Continuous Inspection &#8211; An effective approch towards Software Quality Product Improvement</h2>
<p>Como saber como anda a &#8220;saúde&#8221; de nosso código? Usei o termo &#8220;saúde&#8221; de propósito, pois foi a mesma analogia que <a href="http://www.twitter.com/gspmoreira">Gabriel Moreira</a> e <a href="http://www.twitter.com/rpepato">Roberto Pepato</a> usaram. Em um CTI, por exemplo, cada paciente possui um aparelho ligado ao seu corpo que fica o tempo inteiro monitorando suas funções vitais, tais como: pressão arterial, batimentos cardíacos, etc. Se o valor de qualquer um desses parâmetros entrarem em uma faixa não desejada, o monitor irá alertar. Será que existe alguma forma de usar esta abordagem para monitorarmos a qualidade do nosso código? Sim, existe. Existem diversas ferramentas capazes de fazer isso. Continous Inspection é o nome desta técnica. Entretanto, o importante aqui não são as ferramentas e nem os nomes. É interessante saber qual a motivação para tudo isso. Primeiramente é receber um feedback de nosso código o quanto antes. Reparem como os mesmos valores ágeis aparecem o tempo todo! Porém, neste caso o principal objetivo é conter o <strong>débito técnico</strong>.</p>
<div id="attachment_853" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/predador.jpg"><img class="size-medium wp-image-853" title="Predador" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/predador-300x206.jpg" alt="" width="300" height="206" /></a><p class="wp-caption-text">Querendo ou não, o débito técnico está sempre presente.</p></div><br />
<span id="more-837"></span><br />
Segundo os palestrantes, o débito técnico é como o predador do filme, ou seja, mesmo sendo difícil de ser visualizado, está sempre ali pronto para fazer um estrago. Como falei na primeira parte, o débito técnico reduz a capacidade do software de responder às mudanças diminuindo, assim, a agilidade da empresa. Outro ponto que vale a pena ressaltar é que o débito técnico pode chegar em um nível tão crítico que pode fazer com que o time precise passar muito mais tempo corrigindo defeitos e ajustando a arquitetura, do que efetivamente desenvolvendo novas funcionalidades, que é o que nós desenvolvedores gostamos de fazer, não é verdade? Isso acaba criando um círculo vicioso, pois começam a surgir &#8220;casas de marimbondo&#8221; pelo código que ninguém tem coragem de mexer. Eu recomendo todo desenvolvedor a ler um estudo realizado em 2002 pelo NIST chamado &#8220;The Economic Impacts of Inadequate Infrastructure for Software Testing&#8221;. Tem uma série de dados interessantes neste estudo. Destaco dois em especial: a) Bugs custaram à economia americana 60 bilhões (é bilhão mesmo e não milhão) de dólares e b) Em muitas organizações os desenvolvedores passam mais de 80% do tempo corrigindo defeitos.</p>
<p><div id="attachment_895" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/Capture.jpg"><img src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/Capture-300x208.jpg" alt="" title="Tiro no pé." width="300" height="208" class="size-medium wp-image-895" /></a><p class="wp-caption-text">Não cometa o mesmo erro.</p></div>
<p>Mas agora é que vem o problema. Manter o código manutenível e escalável é um desafio muito grande. Para agravar ainda mais, metodologias ágeis pregam pelo pragmatismo e desencoraja o foco na arquitetura. A grande questão aqui é não ser radical. A ideia é controlar o débito técnico e não eliminá-lo por completo. Controlar o débito técnico significa não apenas mantê-lo baixo, mas sim ser capaz de rastreá-lo também. Em muitos momentos no desevolvimento de um software, inevitavelmente, você terá que abrir mão do capricho no código em função do pragmatismo. Isto é perfeitamente aceitável. O problema é que quando não há um mecanismo de monitoramento, você acaba perdendo a rastreabilidade dos pontos que precisam ser melhorados no seu código. Além disso, conforme mostrado na palestra, muitas ferramentas de Continous Inspection podêm ajudá-lo a priorizar o seu trabalho identificado problemas no código das partes mais críticas do sistema. Por exemplo, refatorar uma classe que é alterada com maior frequência tem maior prioridade do que outra classe que é pouco alterada.</p>
<div id="attachment_856" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/bolaDebTec.jpg"><img class="size-medium wp-image-856" title="Débito Técnico" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/bolaDebTec-300x244.jpg" alt="" width="300" height="244" /></a><p class="wp-caption-text">Ninguém quer carregar este fardo.</p></div>
<p>Esta foi a palestra mais útil para mim, pois tem tudo a ver com os problemas que enfrento hoje. Todas as imagens acima foram retiradas da <a href="http://goo.gl/9ALSi">apresentação</a> dos palestrantes. Vale a pena conferir.</p>
<h2>A sociedade do Dojo e os grupos de capoeira.</h2>
<p>Confesso que não fazia a menor ideia de estava por vir nessa palestra. Entretanto, como sou entusiasta dessas analogias desconexas, acabei arriscando. E valeu o risco. Bruno Pedroso trouxe à tona um problema que é realidade em nossa comunidade: a dificuldade de organizar Coding Dojos. O problema parece o mesmo em todas as regiões do Brasil. Todo mundo gosta e está convencido que vale a pena, mas ninguém aparece nos dojo&#8217;s. Conforme Bruno mostrou, os grupos de capoeira passaram por esse mesmo problema no passado. Para resolvê-lo, foi criado o sistema de cordel que tem a ver com o reconhecimento que um capoeirista tem dentro do seu grupo. Bruno apresentou uma iniciativa do pessoal de Brasília que seria algo como um ambiente de pontuação inspirado (mas diferente) do sistema do stackoverflow. O bacana dessa palestra é que o autor trouxe não apenas um problema, mas sim uma proposta inicial de solução. Além disso, a parte final da apresentação virou quase uma mesa redonda onde muitos participantes mostraram ideias interessantes. Chegaram a propor incentivos financeiros. Eu sou um pouco contra esta ideia, pois as pessoas podem esquecer da real motivação dos dojo´s. Vou deixar registrado aqui uma ideia que me ocorreu durante a escrita deste post. Poderia-se pensar em uma espécie de incentivo por parte das empresas. Em vez de apoio financeiro, as empresas poderiam apoiar com horas de trabalho e/ou oferecendo o espaço/estrutura para realização dos dojos. Na minha opinião, o custo disto é bem inferior ao de um treinamento tradicional e a eficiência pode ser maior também. Creio que uma abordagem como esta, iria otimizar a capacitação do time a médio/longo prazo. Nessa história todos saem ganhando.</p>
<h2>Como formar um programador 10x</h2>
<div id="attachment_865" class="wp-caption aligncenter" style="width: 235px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2717.jpg"><img class="size-medium wp-image-865" title="Luca Bastos" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2717-225x300.jpg" alt="" width="225" height="300" /></a><p class="wp-caption-text">Crédito: @cghenriques</p></div>
<p>Esta é o tipo de palestra que é impossível expressar com palavras o quão boa foi. Luca Bastos, sem papas na língua e com um vocabulário jovem, cativou toda a audiência. A sala ficou literalmente pequena para Luca. Muitas pessoas assistiram em pé, pois não havia cadeiras suficiente para todos. Luca apresentou ideias já conhecidas para aumentar o nível de conhecimento de programadores iniciantes. Ele discutiu, com muito bom humor, técnicas como pair programming, revisão de código e etc. Um dos momentos mais interessantes foi quando ele mostrou um slide com uma foto dele praticando pair programming com uma desenvolvedor que tinha um terço da idade dele. É uma pena que não lembrei na hora de fotografar esse slide para compartilhar aqui com vocês. O carisma do Luca é impressionante. Um fato curioso: durante a palestra eu postei no Twitter pedindo um keynote para o Luca Bastos no próximo Agile Brazil e em poucos segundos foi &#8220;retuitado&#8221; por dezenas de pessoas. A apresentação foi recheada de tiradas engraçadas, foi deixar algumas aqui:</p>
<ul>
<li>&#8220;Planning poker? Eu chuto tudo!&#8221;</li>
<li>&#8220;Pair programming funciona, porque o desenvolvedor tem vergonha de fazer bacalhau ao lado do colega.&#8221;</li>
<li>&#8220;Programar é do c@#$. Quando o teste passa você é f@#$, quando o teste falha você é um m@#$%.&#8221;</li>
<li>&#8220;Sou contra pair programming 100% do tempo, porque o desenvolvedor precisa ter um momento de intimidade com seu código&#8221;.</li>
</ul>
<h2>Ciclos de Avaliação de Pressupostos: Entendendo Lean, Kanban e Agilidade sob uma nova perspectiva</h2>
<p>Nesta palestra, Alisson Vale apresentou sua ideia sobre avaliação de pressupostos. A ideais de Alisson soam para mim como uma camada mais alta de abstração do conceito de feedback. Outro ponto que ele destaca é que avaliação de pressupostos é uma oportunidade de aprendizado e uma forma de avançar em um cenário repleto de incertezas. No entanto, existe uma variável importante neste sistema que não pode ser ignorada: o tempo. A proposta de Alisson é minimizar o tempo entre a criação de um pressuposto e sua avaliação. Para representar esse conceito foi proposta a seguinte expressão:</p>
<p>? &#8211; min(t) =&gt; !</p>
<p>onde, ? representa a criação de um pressuposto, ! representa a avaliação de um pressuposto e min(t) representa o objetivo em diminuir esse tempo.</p>
<p>Isso parece muito familiar, não ? Quem pensou em TDD acertou em cheio. O que torna o TDD tão poderoso é exatamente essa capacidade em minimizar o tempo em que um pressuposto surge e o tempo no qual ele foi avaliado. E o interessante é que isso ocorre em diversos aspectos do TDD. O primeira deles é o próprio resultado do teste. Quando um teste falha significa que sua nova especificação não está sendo atendida pelo código. Neste ponto, você acabou de minimizar o tempo t. O segundo aspecto que merece destaque é o tempo de identificação de uma regressão. Executar todos os testes após alterarmos nosso código é equivalente a validar o seguinte pressuposto: &#8220;Minha alteração regrediu o sistema?&#8221;. Reparem como estamos minimizando o t (em geral os test runners executam centenas de testes de unidade em um único minuto). Um terceiro, e não menos importante, aspecto é o constante feedback que o teste te dá a respeito da saúde do seu código, os tão comentados &#8220;code smells&#8221;. Interessante como o ato de escrever um único teste permite a avaliação de diversos pressupostos em um tempo mínimo! Para ilustrar o conceito, Alisson usou outros exemplos. Um deles foi relativo a avaliação de pressupostos durante a entrega de um produto. O gráfico abaixo mostra que quanto maior a frequência de releases, menor será o tempo de avaliação de alguns pressupostos tal como o feedback do cliente em relação a uma nova feature:</p>
<div id="attachment_881" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2719.jpg"><img class="size-medium wp-image-881" title="Entrega" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2719-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Para minimizar o tempo de avaliação de pressupostos devemos aumentar a frequência de release do produto.</p></div>
<p>Esse gráfico reforça a ideia de que Continous Delivery (entrega contínua) é o caminho a ser perseguido.</p>
<h2>Lightning Talks</h2>
<p>Conforme já falei, esta foi a novidade que mais apreciei nesta edição do Agile Brazil. Vou destacar alguns aqui e tentar escrever em poucas linhas o que achei:</p>
<h4>TDD &#8211; Está na hora de aplicar no seu trabalho!</h4>
<p><a href="http://www.twitter.com/dwildt">Daniel Wildt</a> trouxe à tona uma dificuldade que acredito ser muito comum no desenvolvimento de software em nosso país: convencer outros desenvolvedores dos reais valores do TDD. Pelo incrível que apareça, ainda existe muito desenvolvedor que acredita que o objetivo do TDD é testar. A palestra não foi para apresentar nenhum processo ou ferramenta para disseminar o TDD, foi apenas uma injeção de motivação para não desistirmos da ideia.  </p>
<h4>Conhecendo Domain Driven Design</h4>
<p>A tarefa de condensar um assunto sem perda de informações importantes é algo extremamente difícil (pelo menos para mim). Falando de DDD, pior ainda. É assunto denso e extenso, cheio de detalhes. Felipe Rodrigues conseguiu uma façanha: falar de DDD, de maneira consistente, em 10 minutos. Não foi útil para mim, mas para quem não conhece nada sobre o assunto, o talk parece ter sido excelente.</p>
<h4>Ramones ou Jazz? Ou os dois? Buscando produtividade com músicas.</h4>
<p>Embarcados na filosofia do <a href="http://www.pomodorotechnique.com/">Pomodoro</a>, <a href="http://www.twitter.com/dwildt">Daniel Wildt</a> e <a href="http://www.twitter.com/helmedeiros">Hélio Medeiros</a> apresentaram o SongDoro. Uma proposta para maximizar a produtividade com músicas que estimulem o desenvolvedor usando os mesmos conceitos básicos da técnica Pomodoro. O bacana é que eles apresentaram a possibilidade de um ambiente colaborativo onde é possível obter recomendações (ou recomendar) de músicas por outros desenvolvedores.</p>
<h4>Domain Game: Disseminando conhecimento através de diversão.</h4>
<p>Rafael Camargo apresentou um jogo interessante para aumentar o conhecimento do time em relação ao domínio do software que estão desenvolvendo. O Domain Game é um jogo onde os membros do time deverão responder perguntas, geralmente feitas pelo PO, sobre questões do domínio. Se ele acertar, ganha algum &#8220;brinde&#8221; (Rafael usou bombons como exemplo). Caso erre, o membro do time deve &#8220;pagar&#8221; o PO com um bombom. Então, quem fica com mais bombons ao final do jogo é o vencedor? Não! O objetivo do jogo não é descobrir quem sabe mais sobre o domínio, mas sim nivelar o conhecimento de todo o time de forma divertida. Então se não há disputa não é jogo? Alguém aqui já venceu ou perdeu num jogo de frescoball ? <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h4>UI-TDD : Quem disse que não é possível?</h4>
<p>Bruno Pedroso (o mesmo da palestra da capoeira) fez algo que parecia impossível: um LT prático. Ele extraiu alguns pontos do TDD que são aplicáveis no desenvolvimento de interfaces web. Usando um editor de textos, ele escreveu a especificação de um gráfico de radar como se fosse um teste unitário assumindo inicialmente que o teste estava quebrado. Em seguida, escreveu um código inicial em JS e o teste passou. Daí em diante, ele fez os passos comuns do desenvolvimento orientado a testes, evoluiu a especificação, refatorou o código até chegar ao ponto em que julgou que a especificação foi atendida. Dessa forma, Bruno conseguiu quebrar o mito de que não tem como aplicar TDD quanto estamos colocando funcionalidade na interface gráfica. É claro que não há o benefício da automação, mas pelo menos é possível criar um código com maior qualidade com essa abordagem.</p>
<p>That´s it. Aguardem o terceiro e último post sobre este feedback!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-agile-brazil-2011-%e2%80%93-parte-ii/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Um feedback sobre Agile Brazil 2011 &#8211; Parte I</title>
		<link>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-agile-brazil-2011-parte-i/</link>
		<comments>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-agile-brazil-2011-parte-i/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 19:38:49 +0000</pubDate>
		<dc:creator>Luciano Castilhos</dc:creator>
				<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Inspection]]></category>
		<category><![CDATA[Kaban]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testes]]></category>
		<category><![CDATA[AGILE]]></category>
		<category><![CDATA[LEAN]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=761</guid>
		<description><![CDATA[O Evento Eu tenho frequentado eventos sobre agilidade desde 2007, participando de pelo menos dois eventos por ano. O último que participei foi o Agile Brazil 2010 ocorrido em Porto Alegre. Apesar deste ter sido um evento excelente, confesso que este ano não estava com a mesma empolgação para encarar mais um evento sobre agilidade, [...]]]></description>
			<content:encoded><![CDATA[<h3>O Evento</h3>
<div id="attachment_814" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/logo-trans.png"><img class="size-medium wp-image-814" title="ab2011" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/logo-trans-300x102.png" alt="" width="300" height="102" /></a><p class="wp-caption-text">Crédito: agilebrazil.com</p></div>
<p>Eu tenho frequentado eventos sobre agilidade desde 2007, participando de pelo menos dois eventos por ano. O último que participei foi o Agile Brazil 2010 ocorrido em Porto Alegre. Apesar deste ter sido um evento excelente, confesso que este ano não estava com a mesma empolgação para encarar mais um evento sobre agilidade, pois achava que seria &#8220;mais do mesmo&#8221;. Entretanto, como os organizadores são bom agilistas, não esqueceram de um dos valores mais importantes de qualquer metodologia ágil: melhoria contínua.</p>
<p>O evento deste ano ocorreu na maravilhosa Fortaleza de 27/06 à 01/07.  Como no ano passado, os dois primeiros dias foram reservados a cursos. As palestras começaram no dia 29/06. O evento ofereceu 3 keynotes sensacionais (um em cada dia), diversas palestras, workshops, tutoriais, lightning talks e alguns open spaces. Houve mais expositores nesta edição. Destaque para os stands da ThoughtWorks e da Microsoft. O kinect foi a sensação em diversos stands. Senti falta apenas de stands com venda de livros.</p>
<div id="attachment_813" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/2011-06-30_08-15-26_642.jpg"><img class="size-medium wp-image-813" title="Fortaleza" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/2011-06-30_08-15-26_642-300x168.jpg" alt="" width="300" height="168" /></a><p class="wp-caption-text">Crédito: twitter.com/cghenriques</p></div>
<p>A estrutura do evento estava ótima. Bom coffee-break, spots para notebooks, uma &#8220;mini-central&#8221; de atendimento, achados e perdidos, etc. A organização registrava regularmente informações úteis e novidades via Twitter . Único ponto negativo ficou por conta dos dois stands maiores que ficaram bem no centro do salão principal dificultando, e muito, a circulação dos participantes. As salas das palestras eram ótimas. Todo palestrante tinha uma espécie de auxiliar para resolver eventuais problemas técnicos. Achei bastante interessante, não lembro de ter visto algo semelhante no evento de 2010.</p>
<p>Sem dúvida, a novidade que mais gostei foi a introdução de Lightning Talks (LT). LT é uma sessão divida em curtas apresentações de diversos temas. No Agile Brazil 2011, as sessões tinham mais ou menos 5 apresentações de 10 minutos. Em uma palestra tradicional, se esta não atender sua expectativa, você acaba perdendo aquele tempo. Tudo bem que você pode sair da palestra que não está gostando e ir para outra, mas não é bacana porque você acaba perdendo parte da palestra que entrou depois. Em um mesmo LT não existe, necessariamente, conexão entre os assuntos. Além disso, geralmente cada apresentação é feita por um palestrante diferente. Com isso, dificilmente você terá a sensação de tempo perdido em um LT. Além disso, em um evento como este, o que busco são pequenos insights para aplicar no meu dia-a-dia ou, então, saber como as pessoas resolvem um determinado problema. Não tenho a pretensão de sair de uma palestra dominando um tema. Neste contexto, penso que os LTs são mais eficientes. Então, a programação deveria ser composta apenas de LTs ? Não! Alguns assuntos merecem mais do que 10 minutos, porém poderia-se ter mais LTs o quê permitiria uma seleção melhor das palestras.</p>
<p>O que não gostei muito foi o excesso de palestras sobre TDD. Apesar deste ser um dos assuntos que mais aprecio, penso que deveria-se ter dado mais espaço a outros temas, até porque das 3 palestras que eu fui, duas estavam bem fracas. Por outro lado, não é de todo ruim, visto que TDD é essencial neste modelo de desenvolvimento de software e aqui no Brasil ainda existem dúvidas e muita resistência a este paradigma de programação.</p>
<p>Este post será dividido em três partes. Nesta primeira parte, falarei sobre os keynotes. Na segunda parte, abordarei as palestras e os lightning talks que assisti. Na terceira, e última parte, compartilharei minhas conclusões e sugestões para próxima edição.</p>
<p><span id="more-761"></span></p>
<h2>Keynotes</h2>
<p><br/></p>
<h3>Jim Highsmith</h3>
<p>Ele é colaborador da Thought Works e possui diversos livros publicados. É também um dos autores do Manifesto Ágil e co-fundador da Agile Alliance. Trazer um nome desse peso dá bastante credibilidade ao evento. Jim baseou-se em um estudo da IBM que revelou que 80% dos executivos desejam que seu ambiente cresça consideravelmente mais complexo, mas menos da metade sabe como lidar com isso. Outro número importante apresentado por Jim, foi o de que organizações ágeis conseguem ganhos 30% maiores por ação do que empresas não-ágeis . Neste momento, os executivos presentes no local devem ter aberto um sorriso de orelha a orelha e eu me lamentando pelos executivos da empresa na qual trabalho não estarem lá. Entretanto, para atingir tal feito não basta tornar ágil apenas a área de desenvolvimento da organização. É necessário que toda a companhia esteja alinhada com os valores ágeis.<strong> </strong>Se pararmos para pensar isso faz todo o sentido. O principal objetivo de qualquer método ágil é responder o mais rápido possível às mudanças. Uma vez que as mudanças são motivadas pelo ambiente externo (riscos positivos, tendências de mercado, etc.), não faz sentido que os setores estratégicos da empresa não estejam alinhados com este pensamento. Para promover a agilidade além da área de desenvolvimento, Jim apresentou o conceito de <strong>liderança adaptável </strong>que nada mais é que &#8220;implementar&#8221; os valores ágeis na esfera do negócio. Ele chamou este processo de <strong>agilidade estratégica</strong>. Ao meu ver o &#8220;climáx&#8221; da apresentação de Jim foi quando ele colocou o seguinte gráfico:</p>
<div id="attachment_766" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/333583325.jpg"><img class="size-medium wp-image-766   " title="Como o débito técnico afeta a agilidade em uma empresa." src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/333583325-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Crédito: twitter.com/luty81</p></div>
<p style="text-align: left;">Em suma, o que esse gráfico diz é que o débito técnico aumenta o custo de mudança, este por sua vez afeta negativamente a velocidade de entrega (do produto) que se reflete em uma diminuição da capacidade de resposta de uma empresa (a seus clientes). Em outras palavras, o débito técnico diminui a agilidade da empresa. Percebam o poder destas informações. Nós conhecemos uma poderosa arma  para conter o crescimento do débito técnico: <strong>refactoring</strong>. Por mais que tenhamos boa cobertura de código e mesmo usando os melhores padrões de design, sem refactoring constante o débito técnico vai crescer, isto é fato. Como costumo dizer, código é como um jardim: mesmo usando uma boa terra com os melhores fertilizantes, se não regarmos todo dia, o jardim resistirá. Este gráfico, é um ótimo argumento para convencermos gestores e os executivos de nossas as empresas de que devemos colocar o pé no freio na hora de empurrar toneladas de novas funcionalidades em nosso produto (muitas vezes inúteis como veremos no keynote do Joshua logo adiante) . Em vez disso, devemos priorizar a &#8220;ordem na casa&#8221;. É o que Jim chamou de &#8220;Do Less&#8221; (faça menos) que na visão dele é um dos quatro elementos-chave da dimensão &#8220;Do Agile&#8221; da liderança adaptativa. Entretanto, estas informações não servem apenas para nossos executivos. Ela também deve ser usada por nós desenvolvedores para refletirmos a cerca do que andamos fazendo por aí. Antes de lançarmos aquele bacalhau &#8220;inofensivo&#8221; no código e sempre que negligenciarmos o refactoring, estamos assumindo que iremos diminuir a capacidade de resposta da empresa. Em outras palavras, estamos &#8220;assinando um contrato&#8221; onde concordamos que reagiremos mais lentos às mudanças externas e seremos menos ágeis em atender as novas necessidades de nossos clientes.</p>
<p style="text-align: left;">
<div id="attachment_817" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_26701.jpg"><img class="size-medium wp-image-817  " title="Do Less" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_26701-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Crédito: twitter.com/cghenriques</p></div><br />
<br/></p>
<div>
<h3>Joshua Kerievsky</h3>
<p><div id="attachment_820" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2679.jpg"><img class="size-medium wp-image-820 " title="Joshua Kerievsky" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2679-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Crédito: twitter.com/cghenriques</p></div>
<p>Autor do livro &#8220;Refactoring to Patterns&#8221; e dono da Industrial Logic, uma empresa que vende treinamentos sob o formato e-Learning, Joshua parecia mesmo obstinado a cativar o público brasileiro: iniciou a palestra com um &#8220;Bom dia&#8221; com aquele sotaque gringo e depois falou alguma coisa que não entendi, mas que tinha a palavra &#8220;caipirinha&#8221; no meio, arrancando risos da plateira <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . A palestra de Joshua foi baseada na <strong>felicidade.</strong> Segundo ele, devemos focar nosso trabalho priorizando a felicidade, mas não apenas de quem desenvolve o produto, e sim de todos os indivíduos envolvidos no processo de desenvolvimento e entrega do software. Em última instância, estes indíviduos são representados pelos nossos clientes ou usuários do produto. Para mostrar como tornar seus clientes mais felizes, Joshua citou alguns valores do pensamento <strong>Lean </strong>e trouxe um número já conhecido por nós: <strong>mais de 60% de todas as funcionalidades da maioria dos softwares nunca foram utilizadas</strong>. Então, para fazer nosso cliente mais feliz, precisamos descobrir que funcionalidades ele espera ou deseja que o software possua. Para fazer isto, Joshua usou o conceito de &#8220;Fake Feature&#8221;.</p>
<div id="attachment_818" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2681.jpg"><img class="size-medium wp-image-818" title="IMG_2681" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2681-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Crédito: twitter.com/cghenriques</p></div>
<p>Ele e seu time colocaram na interface gráfica de seu produto, botões e links que representariam uma funcionalidade hipotética. Entretanto, quando o usuário tentava utilizá-la, o sistema informava que aquela funcionalidade não estava disponível e, em seguida, questionava se o usuário gostaria de ter essa funcionalidade no sistema. Joshua não entrou no mérito de como ele usou essas informações coletadas. Entretanto, é bem fácil imaginar que esse dado poderia compor (ou até mesmo representar por completo) o <em>business value </em> das <em>user stories</em> de um produto, permitindo assim, uma priorização mais eficiente do <em>product backlog</em>. Em linhas gerais, a mensagem que Joshsua tentou nos passar é que pessoas mais felizes trazem mais resultados para empresa. Um membro do time mais feliz vai produzir com mais qualidade, e um cliente mais feliz vai, não apenas comprar mais, mas colaborar com o desenvolvimento do produto (com sugestões, feedbacks, etc).</p>
<div id="attachment_819" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2682.jpg"><img class="size-medium wp-image-819 " title="Métricas do Amor." src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2682-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Crédito: twitter.com/cghenriques</p></div>
<p>Uma prova de que ele realmente se preocupa com isso, ele pediu para traduzir sua apresentação para Português! Toda sua apresentação, exceto as imagens, estavam em nosso idioma. Além disso, ele participou de um <em>open space</em> que irei falar mais na segunda parte deste post.
</div>
<p><br/></p>
<div>
<h3>Vinicius Teles</h3>
<p>O keynote do Vinícius pode ser resumido em um choque de realidade carregado de bom humor, como de praxe. Ele iniciou citando aquela &#8220;profecia&#8221; de que o mundo acabará em 2012. Mas, segundo ele, não será um cometa ou coisa parecida que detonará a Terra, mas sim uma grande tela azul. Para mostrar isso, Vinícius coletou alguns depoimentos em vídeo durante o próprio evento. Os depoimentos eram experiências de participantes do evento ao utilizarem sistemas on-line de empresas grandes empresas públicas, bancos e de telecomunicações. De problemas de usabilidade, passando por bugs, até questões sobre performance, Vinícius nos mostrou o quanto um software defeituoso atrasa nossa vida.</p>
<div id="attachment_822" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2712.jpg"><img class="size-medium wp-image-822  " title="Vinícius Teles" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2011/07/IMG_2712-300x225.jpg" alt="" width="300" height="225" /></a><p class="wp-caption-text">Crédito: twitter.com/cghenriques</p></div>
<p>De acordo com ele, só existe um culpado por isso: nós desenvolvedores. Em outras palavras, ele mostrou como nós, às vezes, atrasamos o mundo. Esse foi o choque de realidade da apresentação. É muito legal quando alguém influente na comunidade menciona algo que reflete o que você pensa. Vinícius falou de uma coisa que já conversei com alguns colegas de profissão: Temos que parar! Parar no sentido de querer absorver toda novidade (tecnologia, linguagens e etc) que aparece pela frente. Às vezes, nós parecemos poodle de apartamento quando vai à rua: corri para todo o lado, mas sem objetivo nenhum. De nada adianta aprender a linguagem do momento, se a gente continua entregando software de péssima qualidade. Faz muito mais sentido revermos como estamos desenvolvendo software do que aprender uma nova tecnologia. Outro momento marcante e polêmico do keynote foi um slide com a seguinte frase: <strong>&#8220;Talking is cheap. Show me the code.&#8221;</strong>.  Muitas pessoas levaram para um lado de que tudo o que importa é o código e resto que &#8220;se exploda&#8221;. Vi algumas pessoas postando no twitter que outras áreas também são importantes, outras falando que não apenas o código é importante, que a interface gráfica, por exemplo, tem importância também e coisas do gênero. Eu acho que não foi essa a mensagem que o Vinícius tentou passar. Antes de mostrar este &#8220;polêmico&#8221; slide, ele estava questionando as certificações. Mostrou o perfil de vários desenvolvedores sem certificação que são reconhecidos, pela nossa comunidade, como excelentes programadores . Ele também fez a seguinte indagação: &#8220;Quem te certifica desenvolve software?&#8221;. Quem assina seu certificado, sabe o que é programação? Logo em seguida, ele mostrou o slide em questão. Ao meu ver, ele quis passar a mensagem de que certificados não possuem tanto valor, uma vez que não é possível transformar papel (certificado) em código. Por exemplo, é como se ele dissesse: &#8220;Em vez de você falar que é certificado em Java, mostre o código Java que você é capaz de desenvolver.&#8221;. Se eu não me engano ele comentou em seguida que só código importa, mas isso foi somente em relação a certificação ao meu entender. Em outras palavras, não me diga o que você sabe e nem os certificados que possui, mostre o código que você é capaz de escrever. Pelo menos, essa foi a forma que eu entendi.</p>
</div>
<p>Aguardem a segunda parte onde irei falar sobre as palestras e os lightning talks que assisti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2011/07/um-feedback-sobre-agile-brazil-2011-parte-i/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Publicando uma aplicação Rails3 com Ruby 1.9.2 no heroku</title>
		<link>http://www.sagadoprogramador.com.br/2011/02/publicando-uma-aplicacao-rails3-com-ruby-1-9-2-no-heroku/</link>
		<comments>http://www.sagadoprogramador.com.br/2011/02/publicando-uma-aplicacao-rails3-com-ruby-1-9-2-no-heroku/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 22:31:51 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[Deploy]]></category>
		<category><![CDATA[Heroku]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Rails3]]></category>
		<category><![CDATA[Ruby 1.9.2]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=724</guid>
		<description><![CDATA[A configuração default do Heroku ainda é ruby 1.8.7 e como eu percisava publicar uma app Ruby 1.9.2 encontrei uma pedra no caminho, consegui resolver e então resolvi escrever esse post, explicando como publicar uma app Rails 3 com Ruby 1.9.2 no Heroku. Um lance bem legal do heroku é que ele faz uso de [...]]]></description>
			<content:encoded><![CDATA[<p>A configuração default do <a href="http://heroku.com/">Heroku</a> ainda é ruby 1.8.7 e como eu percisava publicar uma app Ruby 1.9.2 encontrei uma pedra no caminho, consegui resolver e então resolvi escrever esse post, explicando como publicar uma app Rails 3 com Ruby 1.9.2 no Heroku.</p>
<p>Um lance bem legal do heroku é que ele faz uso de uma gem e de um hook do github para facilitar a sua vida na hora de fazer deploy. </p>
<p>Sendo assim, você consegue fazer deploy de uma aplicação ruby com poucos passos:</p>
<p>1) Instale a gem do heroku</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">   sudo gem install heroku</pre></div></div>

<p>2) Criar uma app</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">   heroku create nome_da_sua_app</pre></div></div>

<p>3) Deploy</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  git push heroku master 
  heroku rake db:migrate</pre></div></div>

<p><b> Dificil né? <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </b></p>
<p> Até aqui tudo são flores, o problema é como eu falei anteriormente, o default é Ruby 1.8.7 e particulamente eu prefiro rodar uma app Rails3 com Ruby 1.9.2 apesar de que no site oficial do Rails é recomendado tanto a 1.8.7 quanto a 1.9.2</p>
<p>Agora só precisamos de mais dois passos<br />
1) Executar um migrate para nossa app passar a usar a mri-19.2</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">heroku stack:migrate bamboo<span style="color:#006600; font-weight:bold;">-</span>mri<span style="color:#006600; font-weight:bold;">-</span>1.9.2</pre></div></div>

<p>2) Em seguida preciamos fazer um novo deploy para relaizar essas alterações, o problema é que se você não tiver nenhuma alteração para subir o deploy não vai ser feito, então edite o seu arquivo README por exemplo, é em seguida rode os seguintes comandos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">git commit <span style="color:#006600; font-weight:bold;">-</span>am <span style="color:#996600;">&quot;Migrando MRI para 1.9.2&quot;</span>
git push heroku master</pre></div></div>

<p>E pronto!! temos uma app publicada no Heroku, rodando no Ruby 1.9.2</p>
<p>Abraços! <br/> até a próxima! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2011/02/publicando-uma-aplicacao-rails3-com-ruby-1-9-2-no-heroku/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Por que usar Test Driven Development?</title>
		<link>http://www.sagadoprogramador.com.br/2010/09/porque-usar-test-driven-development/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/09/porque-usar-test-driven-development/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 17:34:57 +0000</pubDate>
		<dc:creator>Luciano Castilhos</dc:creator>
				<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[testes]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=671</guid>
		<description><![CDATA[Sempre que escrevo ou introduzo algum assunto, gosto de começar falando das motivações para estudar tal tópico. É muito comum em nós desenvolvedores, achar que novas idéias são viagens, ou então que são muito bonitas na teoria, porém difíceis de aplicar na prática, e coisas do gênero. Por isso, antes de falar qualquer coisa sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Sempre que escrevo ou introduzo algum assunto, gosto de começar falando das motivações para estudar tal tópico. É muito comum em nós desenvolvedores, achar que novas idéias são viagens, ou então que são muito bonitas na teoria, porém difíceis de aplicar na prática, e coisas do gênero. Por isso, antes de falar qualquer coisa sobre TDD, falarei das motivações &#8211; que diga-se de passagem não são poucas &#8211; para estudar tal paradigma.<br />
O objetivo deste post é listar, com uma breve explicação, as principais vantagens, ou motivadores, em usar o TDD no desenvolvimento de Software. O grau de importância de cada uma das vantagens é um tanto subjetivo e complicado de ser mensurado. Sendo assim, o leitor não deve ser preocupar com a ordem em que as mesmas serão apresentadas.<br />
Em última instância, estamos sempre interessados em entregar código de qualidade. Quando falamos em qualidade, a primeira coisa que nos vem à cabeça é a quantidade de bugs. De fato, como veremos mais adiante, o TDD nos auxilia a entregar Software com menos defeitos, porém existem outras características importantes em relação à qualidade de código, tais como: acoplamento, coesão, escalabidade, entre outras. Neste post veremos como o TDD pode nos auxiliar a criar código com baixo acoplamento, alta coesão, logo escalável.<br />
Em linhas gerais e de forma muito resumida, nossa missão é entregar código robusto e com alta qualidade. Então, sem mais delongas, vamos ver a seguir o porquê do TDD ser bastante útil nesta missão.</p>
<h2>Reduz o GAP entre a introdução, identificação e correção de bugs.</h2>
<p>O National Institute of Standards and Technology (NIST), realizou um estudo em 2002 chamado &#8220;The Economic Impacts of Inadequate Infrastructure for Software Testing&#8221; que constatou que defeitos em Software custaram aos EUA, nada mais nada menos que, 60 BILHÕES de Dólares. O estudo foi realizado em empresas de tamanho e domínio variados. Uma das mais importantes conclusões do estudo foi que este elevado custo ocorre não apenas pela enorme quantidade de defeitos, mas também pelo elevado tempo que um defeito leva para ser identificado e corrigido. Como assim? Felizmente, o mesmo estudo concluiu que o custo de correção de um defeito cresce de forma exponencial ao intervalo de tempo entre a introdução e correção do mesmo. Ora, se o problema é este GAP, só temos uma solução: reduzí-lo o máximo possível. E se pudéssemos reduzí-lo de tal forma que os bugs fossem identificados no ato da codificação? É aí que entra o TDD, pois ele permite que a maioria dos bugs sejam identificados imediatamente após terem sido introduzidos. Esta detecção &#8220;real-time&#8221; vai lhe poupar de um generoso tempo de depuração e compreensão do código defeituoso. É claro que, mesmo usando TDD, você não tem garantias de que todos os bugs serão identificados. É imporante ressaltar também que as vantagens do TDD podem ser potencializadas com o uso de outras práticas do eXtreme Programming, tais como programação em pares, integração contínua, entre outras.</p>
<p>Segue abaixo o gráfico proposto por Scott Ambler que ilustra bem isto:</p>
<p><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/09/ScottAmblerCurve.jpg"><img class="alignnone size-medium wp-image-688" title="Scott Ambler Curve" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/09/ScottAmblerCurve-300x232.jpg" alt="" width="300" height="232" /></a></p>
<p>A tabela abaixo foi retirada do estudo acima citado e faz um cruzamento entre a fase onde o bug foi introduzido com a fase onde foi identificado e o custo médio em horas de correção deste bug:</p>
<p><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/09/NistTableBugFixCost.bmp"><img class="alignnone size-full wp-image-689" title="HH de correção de bugs baseado na fase de introdução" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/09/NistTableBugFixCost.bmp" alt="" /></a></p>
<p>Para ilustrar, uma das leituras que podemos fazer a partir da tabela acima é que o custo (em tempo) de correção de um bug que foi introduzido na fase de codificação será três vezes maior caso o mesmo seja identificado após esta fase, podendo chegar a ser cinco vezes maior caso o mesmo seja identificado apenas após o lançamento do produto.</p>
<p>Abaixo segue algumas outras conclusões interessantes publicadas neste trabalho do NIST:</p>
<ul>
<li>80% do tempo de um desenvolvedor é dedicado à identificação e correção de bugs.</li>
<li>Mais de 50% dos bugs não são detectados até a fase de homologação.</li>
<li>Aproximadamente 50% dos bugs são introduzidos na fase implementação.</li>
<li>Cerca de 50% do orçamento total de um projeto de software é gasto em correção de bugs.</li>
</ul>
<h2>Facilita a criação de código com alta coesão e baixo acoplamento.</h2>
<p>Imagine que lhe passem a tarefa de fazer um desenho composto de polígonos regulares. O seu desenho será avaliado em relação a sua semântica e o quão preciso estão os lados e ângulos dos polígonos. Não vamos entrar em detalhes do que seria a semântica (ou harmonia), mas considere que a criação de uma boa semântica seja tão complexa que vai consumir quase todo o tempo que você tem para construir o desenho. Além disso, você não pode utilizar uma régua. Qual o problema desta tarefa? Por melhor desenhista que você possa ser, você vai precisar gastar um bom tempo desenhando e validando se cada figura é um polígono regular. Com isso, você vai ter menos tempo para pensar na parte mais complexa do tarefa. Se você pudesse usar uma régua, você poderia gastar quase todo o tempo da tarefa pensando na &#8220;semântica&#8221; do desenho, uma vez que a régua lhe auxiliaria a desenhar os polígonos de forma muito mais rápida e precisa. É exatamente assim que ocorre na codificação. Sempre que começamos a codificar um novo pedaço de um sistema (tarefa de desenhar), temos o desejo de criar o melhor código (ou arquitetura) possível (assim como o desenhista deseja construir os polígonos regulares com &#8220;boa semântica&#8221;). Entretanto, para criar um bom código (ou arquitetura), você precisa a cada novo passo, validar a evolução do mesmo. Essa validação só pode ser feita forçando a execução do seu código. Sem TDD, a única maneira de fazer isso é testar funcionalmente seu código. O problema disto é que, por ser um processo manual, é lento e improdutivo. Além disso, você precisa a cada novo passo na codificação, re-testar tudo o que já fora testado e isso recai sobre o problema de ser um processo manual. E um último problema é que não é tarefa do desenvolvedor gastar muito tempo na execução de testes funcionais (e tão pouco gostamos de fazer isso). Mas como somos espertos, o que fazemos? Simples, codificamos toda a arquitetura num passo só e validamos tudo num único teste funcional. Estratégia pouco inteligente. É como se o desenhista tentasse construir todo o seu desenho e validar a &#8220;semântica&#8221; apenas após desenhar o último polígono. A chance da &#8220;semântica&#8221; não ficar boa é grande. Além disso, ao detectar os polígonos culpados pela &#8220;semântica&#8221; ruim, a correção isolada dos mesmos provavelmente vai causar um efeito colateral na harmonia geral do desenho.</p>
<h2>Reduz o tempo gasto em depuração e em correção de bugs.</h2>
<p>Quando iniciamos o processo de correção de um bug, a primeira coisa que geralmente fazemos é tentar reproduzir o erro, para em seguida depurar o fluxo onde ocorre o bug para enfim analisar o estado dos objetos em busca da raíz do problema. Quando você não possui testes, você precisa mais uma vez realizar os passos de um teste funcional para depurar. Se você escrever um teste unitário que &#8220;estimule&#8221; o sistema a passar pelo código defeituoso, você estará &#8220;reproduzindo&#8221; o erro sem necessidade de executar a aplicação que, como vimos, é bem mais produtivo do que testar funcionalmente o código.</p>
<h2>Serve de suporte para testes de regressão.</h2>
<p>É comum, ao corrigir um bug, introduzir um novo bug. Em outras palavras, a correção de um bug pode ter como efeito colateral que uma parte do software que antes funcionava deixe de funcionar. Quando isto ocorre, dizemos que o software regrediu. Chamam-se &#8220;teste de regressão&#8221; os testes que visam verificar a integridade geral do sistema quando um bug é corrigido, ou até mesmo quando uma nova funcionalidade é implementada no sistema. O uso do TDD vai reduzir a introdução de efeito colaterais junto com alterações no código. É claro que apenas na parte do código que seja coberta pelo testes unitários. Além disso, quando um teste passa a falhar após sua alteração, você acabou de identificar o bug num momento muito próximo de sua introdução, o que é uma enorme vantagem como vimos acima.</p>
<h2>Encoraja o refactoring.</h2>
<p>O refactoring é uma atividade bastante importante dentro do processo de desenvolvimento de software. É através dele que mantemos o código legível e escalável. Quanto mais tempo ficamos sem refatorar o código, mas ele vai &#8220;perecendo&#8221;. Em outras palavras, quanto mais tempo ficamos sem refatorar, mais custoso e arriscado será mudá-lo. Entretanto, inúmeras vezes em nossa carreira temos medo de alterar um código. Esse medo muitas vezes ainda é ratificado por um colega que diz: &#8220;Não mexe aí que está funcionando!&#8221;. Esse medo vem do fato de termos ciência de que ao alterar um código que funciona, a chance de não testar todos os casos onde código é estimulado é muito grande. Além disso, algumas mudanças requerem testes exaustivos que muitas vezes não temos tempo hábil para realizar. Quando usa-se TDD, a execução dos testes é automatizada e temos garantia que todos os casos onde temos cobertura serão testados. Realizando TDD e refactoring com frequência acaba tendo como resultado um ciclo vicioso positivo na qualidade do código, pois uma vez que o processo lhe permite refatorar de forma mais constante, o código apresenta uma melhoria continua o quê o torna cada vez mais testável, ou seja, &#8220;realimentando&#8221; a coragem em refatorá-lo.</p>
<h2>Serve como documentação.</h2>
<p>Testes unitários, se bem escritos, podem servir como forma de documentação do sistema, onde o comportamento do sistema é descrito pelos testes. Além disso, os testes também podem servir como forma de documentação de uso de alguma API, ou framework do qual o sistema dependa.</p>
<h2>Referências.</h2>
<div id="_mcePaste">1) &#8220;The Economic Impacts of Inadequate Infrastructure for Software Testing&#8221;, National Institute of Standards &amp; Technology (NIST), US, 2002</div>
<div id="_mcePaste">2) &#8220;Introduction to Test Driven Design (TDD)&#8221;, http://www.agiledata.org/essays/tdd.html, acessado em 2010</div>
<p><span id="more-671"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/09/porque-usar-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Especificações, código e como mantê-los unidos?</title>
		<link>http://www.sagadoprogramador.com.br/2010/08/especificacoes-codigo-e-como-mante-los-unidos/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/08/especificacoes-codigo-e-como-mante-los-unidos/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 04:30:07 +0000</pubDate>
		<dc:creator>Sergio Azevedo</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[testes]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[documentacao executavel]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=556</guid>
		<description><![CDATA[Já faz algum tempo que testes de unidade, ou unitários, tem sido assunto frequente, e as vezes acalorado, em listas de discussões. Apesar de fazer tempo que este assunto é discutido o argumento mais famoso para não adoção da técnica continua sendo o curto prazo dos projetos. Alega-se que se os desenvolvedores começarem a escrever [...]]]></description>
			<content:encoded><![CDATA[<p>Já faz algum tempo que testes de unidade, ou unitários, tem sido assunto frequente, e as vezes acalorado, em listas de discussões. Apesar de fazer tempo que este assunto é discutido o argumento mais famoso para não adoção da técnica continua sendo o curto prazo dos projetos. Alega-se que se os desenvolvedores começarem a escrever testes, os prazos para realizações das tarefas serão aumentados, o que consequentemente aumentaria o prazo final do projeto.</p>
<h2>Aquela velha historia</h2>
<p>A maioria dos projetos, tem uma documentação inicial, onde são colocadas as necessidades do cliente. Num projeto tradicional, ou não, esta documentação será entregue aos desenvolvedores para fazer o milgre de transformar texto impresso no papel, em software. Até agora não contei novidade alguma, mas a coisa vai ficar mais interessante a partir de agora.</p>
<p>Os desenvolvedores começam então, a escrever o software baseado nas informações contidas na documentação entregue a eles. Agora imagine que boa parte do software já está implementada e o gerente de proejetos está super feliz em ver o gráfico do project bonitinho, mostrando que o projeto está até adiantado. Quando&#8230; acontece o que sempre acontece em projetos de software. Uma grande mudança, uma alteração tão radical que afetará varios pontos do sistema. Vocês já viram este filme, e sabem que numa situação dessas é comum ter que fazer tudo pra ontem e sem prejuizo ao cronograma. O que se traduz em horas extras e trabalho nos finais de semana. O ambiente de trabalho legal para os desenvolvedores costuma acabar neste ponto. Como as alterações são todas urgentes, é muito comum que a equipe concentre forças na alteração do código fonte, enquanto a alteração da documentação fica pra depois. Um depois que geralmente nunca acontece.</p>
<h2>TDD e Documentos&#8230; onde você quer chegar?</h2>
<p>Pronto agora cheguei onde queria =). Comecei falando de TDD e no paragrafo anterior falei de documentação desatualizada. Que relação essas coisas podem ter?</p>
<p>Bem, a documentação incial do projeto, em papel, descreve o que o software deve fazer (comportamento), os métodos das classes escritas pelos desenvolvedores são responsáveis por realizar este comportamento. Em um cenário, como posso dizer, &#8220;mais comum&#8221; depois do desenvolvedor implementar o software, uma pessoa seria encarregada de testar o comportamento do software, para isso ela precisaria recorrer a documentação do projeto. Mas depois da mudança a documentação vai estar desatualizada o que abre margem para problemas maiores.</p>
<p>Uma maneira de resolver este problema seria automatizando os testes, e neste ponto entram os testes de unidade. Imagine que nossos desenvolvedores escreveram testes de unidade automatizados para checar o compotamento de cada um dos métodos implemetados por eles. Agora não precisarimos de mais uma pessoa para testar, e o mais importante, agora temos uma <strong>documentação executável</strong>. Isso mesmo pense nos testes de unidade como sendo uma documentação executável, uma documentação que <strong>quebra</strong> se não for atualizada.</p>
<h2>Documentação Executável</h2>
<p>Como todos sabem a documentação mais atualizada de um software é o código fonte. O problema é que ele não é &#8220;amigavel e legivel&#8221; para todos.  Pode ser pouco agradavel ter de ficar olhando varios arquivos, classes e métodos para entender o que eles fazem realmente. Na tentativa de melhorar, esse cenário pessoas passaram a utilizar uma técnica para escrita de testes que tenta expressar mais a intenção daquele comportamento. Esta técnica é conhecida como Behaviour Driven Development (BDD), foi um termo cunhado por Dan North mais informações <a href="http://blog.dannorth.net/introducing-bdd/">aqui</a>. Mas continua sendo muito código, e fica ainda complicado identificar o que é uma pré-condição, o que realmente está sendo testado é o que é a pós-condição. No JUnit por exemplo, a responsabilidade de descrever o comportamento testado fica no nome do método, que pode ficar quilometrico (nada contra), como por exemplo: <em>deveSerCapazDeCriarUmaListaDePedidosAPartirDoXML</em>.</p>
<p>Na tentativa de tornar os comportamentos mais evidentes, sugriam framework&#8217;s como RSpec utilizado por desenvolvedores ruby.<br />
Veja abaixo um exemplo de código do RSpec</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">describe <span style="color:#996600;">&quot;Uma Conta&quot;</span>
it <span style="color:#996600;">&quot;nao deve permitir saques superiores ao valor de seu saldo&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
   conta = Conta.<span style="color:#9900CC;">new</span>
   conta.<span style="color:#9900CC;">deposita</span> <span style="color:#006666;">100</span>
   <span style="color:#CC0066; font-weight:bold;">lambda</span><span style="color:#006600; font-weight:bold;">&#123;</span> conta.<span style="color:#9900CC;">saca</span> <span style="color:#006666;">200</span><span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">should</span> raise_error <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Apesar de ter menos &#8220;ruido&#8221;, muito também devido a linguagem ruby,  este código ainda tem muito apelo programático. Fica dificil usar um negocio desses com seu cliente, ou especialista de negocios. Então o bacana mesmo seria escrever especificações/documentação, usando o bom e velho português, e ter algum vodoo que tornasse essa documentação executável.</p>
<h2>E esse Vodoo existe?</h2>
<p>Sim esse vodoo existe e se chama <a href="http://cukes.info/">Cucumber</a>.<br />
O Cucumber é um framework que permite a escrita de funcionalidades, no estilo user story, uma especie de caso de uso. Vejamos um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#language: pt</span>
Funcionalidade: Saque de conta
   Para retirar dinheiro <span style="color:#9966CC; font-weight:bold;">do</span> banco
   Como um correntista <span style="color:#9966CC; font-weight:bold;">do</span> banco
   Devo realizar um saque
&nbsp;
Cenario: Saque com sucesso
   Dado que a <span style="color:#996600;">&quot;minha conta&quot;</span> possui <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;100&quot;</span> reais
   Quando eu sacar <span style="color:#996600;">&quot;70&quot;</span> reais da <span style="color:#996600;">&quot;minha conta&quot;</span>
   Entao <span style="color:#996600;">&quot;minha conta&quot;</span> devera ter <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;30&quot;</span> reais
&nbsp;
Cenario: Saldo Insuficiente para Saque
   Dado que a <span style="color:#996600;">&quot;minha conta&quot;</span> possui <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;100&quot;</span> reais
   Quando eu sacar <span style="color:#996600;">&quot;200&quot;</span> reais da <span style="color:#996600;">&quot;minha conta&quot;</span>
   Entao um erro de <span style="color:#996600;">&quot;Saldo Insuficiente&quot;</span> deve ser exibido</pre></div></div>

<p>Pra começar as historias descrevem funcionalidades (features), e é comum se apresentarem neste formato:<br />
   <strong>Para</strong> alguma coisa<br />
   <strong>Como</strong> um papel,<br />
   <strong>Devo</strong> fazer alguma coisa.<br />
Logo depois definimos os cenários, nosso exemplo tem dois cenários um de sucesso e outro de falha, você pode escrever quantos cenários quiser.</p>
<h2>Aham Cláudia senta lá&#8230;</h2>
<p>Então agora eu escrevo a especificação que eu quiser usando português e pronto vai funcionar? Quase isso, o cucumber permite o uso do português para descrevermos a funcionalidade e seus cenários, mas lembre-se que no fundo no fundo tudo isso é um grande teste. A grande diferença é que o apelo programático é retirado, mas a intenção do teste ainda está lá. O JUnit nos fornece os chamados TestCase para que possamos agrupar nossos testes. O cucumber nos fornece o recurso de features (funcionalides) no qual descrevemos uma funcionalidade. Cada funcionalidade do sistema costuma ser descrita por em um arquivo separado que possui a extensão .feature, o exemplo da funcionalide saque de conta ficaria num arquivo chamado: saque_conta.feature. Além disso o cucumber impõe que estes arquivos &#8220;vivam&#8221; dentro de uma pasta que se chame &#8220;features&#8221;. As features podem conter vários cenários. Dá pra fazer um paralelo entre os cenários e os métodos de teste de um TestCase do JUnit. Os cenários descrevem de maneira mais intuitiva os 3 componentes do teste: pré-condição, teste e pós-condição, como podemos ver abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Cenario: Saque com sucesso
   Dado que a <span style="color:#996600;">&quot;minha conta&quot;</span> possui <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;100&quot;</span> reais <span style="color:#008000; font-style:italic;">#pré-condição</span>
   Quando eu sacar <span style="color:#996600;">&quot;70&quot;</span> reais da <span style="color:#996600;">&quot;minha conta&quot;</span>             <span style="color:#008000; font-style:italic;">#teste</span>
   Entao <span style="color:#996600;">&quot;minha conta&quot;</span> devera ter <span style="color:#996600;">&quot;saldo&quot;</span> de <span style="color:#996600;">&quot;30&quot;</span> reais  <span style="color:#008000; font-style:italic;">#pós-condição</span></pre></div></div>

<p>A primeira linha define a pré-condição a segunda deixa claro o que queremos testar e a útlima linha checa a pós-condição, tudo sem apelo programático.</p>
<h2>E cadê o código que faz isso funcionar?</h2>
<p>Bem a gente precisa escrver esse código, não tem jeito. Porém o bacana é que ele fica totalmente separado do texto da funcionalidade e dos cenários. O cucumber espera que você forneça para cada passo dos seus cenários, um bloco de código fonte, para que ele consiga executar os testes. Estes blocos de código são definidos dentro de um arquivo, que geralmente é chamado de &#8220;step.rb&#8221;, e precisa ficar dentro da pasta &#8220;features/step_definitions&#8221;.</p>
<p>Quando o cucumber interpreta o arquivo da feature e identifica  passos &#8220;indefinidos&#8221;, ele gera uma especie de template do passo, para que este possa ser implementado no arquivo de definicao de passos, o step.rb por exemplo. Um exemplo deste template seria:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> possui <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>arg1, arg2, arg3<span style="color:#006600; font-weight:bold;">|</span>
  pending <span style="color:#008000; font-style:italic;"># express the regexp above with the code you wish you had</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Repare que tudo que foi informado entre &#8220;&#8221; foi considerado como parametro pelo cucumber, repare também que o template já abre um bloco de código onde ele nós fornece os argumentos. Entre este &#8220;do&#8221; e &#8220;end&#8221; é que colocamos a implementação do nosso passo. Veja agora um exemplo de implementação:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> possui <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_da_conta, atributo, valor<span style="color:#006600; font-weight:bold;">|</span>
   conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
   atributo = change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
   conta.<span style="color:#9900CC;">instance_variable_set</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;@#{atributo}&quot;</span>, valor.<span style="color:#9900CC;">to_f</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>O bacana é que os steps são reapoveitaveis, repare que o step do exemplo acima também é utilizado no cenário de saque com saldo insuficiente. No início vamos implementar muitos steps, mas depois vamos passar mais tempo escrevendo cenários e novas features do que implementando steps efetivamente. É possivel configurar o cucumber para fazer o output de seus testes em html. O interessante deste formato é que as funcionalidades e cenários ficam com &#8220;cara&#8221; de documentação &#8220;formal&#8221;.</p>
<h2>Conclusão</h2>
<p>É foi isso&#8230; A ideia aqui era focar no teste como forma de documentação. Apesar desta não ser uma ideia nova, vimos que o ruido programático dos testes pode atrapalhar. Terminamos vendo que o Cucumber resolve o problema do ruído na documentação executavel seprando a definicao das funcionalidades e cenários do código que faz tudo funcionar.</p>
<p>Abraços e até a próxima,</p>
<p>Sérgio Junior</p>
<p>Abaixo está a implementação completa da funcionalidade descrita neste post:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'lib/conta/conta'</span>
&nbsp;
Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> possui <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_da_conta, atributo, valor<span style="color:#006600; font-weight:bold;">|</span>
   conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
   atributo = change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
   conta.<span style="color:#9900CC;">instance_variable_set</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;@#{atributo}&quot;</span>, valor.<span style="color:#9900CC;">to_f</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Dado <span style="color:#006600; font-weight:bold;">/</span>^que a <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> esta bloqueada$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_conta<span style="color:#006600; font-weight:bold;">|</span>
   conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
   conta.<span style="color:#9900CC;">bloqueada</span> = <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Quando <span style="color:#006600; font-weight:bold;">/</span>^eu transferir <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais da <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> para <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>valor, origem, destino<span style="color:#006600; font-weight:bold;">|</span>
  conta_origem = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>origem<span style="color:#006600; font-weight:bold;">&#41;</span>
  conta_destino = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>destino<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    conta_origem.<span style="color:#9900CC;">transfere</span> <span style="color:#ff3333; font-weight:bold;">:para</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; conta_destino, <span style="color:#ff3333; font-weight:bold;">:valor</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; valor.<span style="color:#9900CC;">to_f</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; e
    <span style="color:#0066ff; font-weight:bold;">@erro</span> = e
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Quando <span style="color:#006600; font-weight:bold;">/</span>^eu sacar <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais da <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>valor, nome_conta<span style="color:#006600; font-weight:bold;">|</span>
  conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    conta.<span style="color:#9900CC;">saca</span> valor.<span style="color:#9900CC;">to_f</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; e
    <span style="color:#0066ff; font-weight:bold;">@erro</span> = e
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Quando <span style="color:#006600; font-weight:bold;">/</span>^eu depositar <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais na <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>valor, nome_conta<span style="color:#006600; font-weight:bold;">|</span>
  conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    conta.<span style="color:#9900CC;">deposita</span> valor.<span style="color:#9900CC;">to_f</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; e
    <span style="color:#0066ff; font-weight:bold;">@erro</span> = e
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Entao <span style="color:#006600; font-weight:bold;">/</span>^<span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> devera ter <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> reais$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>nome_da_conta, atributo, valor<span style="color:#006600; font-weight:bold;">|</span>
  conta = obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
  atributo = change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
  conta.<span style="color:#9900CC;">instance_variable_get</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;@#{atributo}&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> == valor.<span style="color:#9900CC;">to_f</span>
<span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
Entao <span style="color:#006600; font-weight:bold;">/</span>^um erro de <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> deve ser exibido$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>mensagem<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#0066ff; font-weight:bold;">@erro</span>.<span style="color:#9900CC;">message</span>.<span style="color:#9900CC;">should</span> == mensagem
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
private
  <span style="color:#9966CC; font-weight:bold;">def</span> obter_conta_pelo_nome<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
    conta_simbolo = name_to_symbol<span style="color:#006600; font-weight:bold;">&#40;</span>nome_da_conta<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@contas</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@contas</span><span style="color:#006600; font-weight:bold;">&#91;</span>conta_simbolo<span style="color:#006600; font-weight:bold;">&#93;</span>
      conta = <span style="color:#0066ff; font-weight:bold;">@contas</span><span style="color:#006600; font-weight:bold;">&#91;</span>conta_simbolo<span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      conta = Conta.<span style="color:#9900CC;">new</span>
      <span style="color:#0066ff; font-weight:bold;">@contas</span><span style="color:#006600; font-weight:bold;">&#91;</span>conta_simbolo<span style="color:#006600; font-weight:bold;">&#93;</span> = conta
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>
    name.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>\s<span style="color:#006600; font-weight:bold;">/</span>,<span style="color:#996600;">'_'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> name_to_symbol<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>
    change_spaces_for_underlines<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_sym</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/08/especificacoes-codigo-e-como-mante-los-unidos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sobrecarga e argumentos marotos nos métodos Ruby</title>
		<link>http://www.sagadoprogramador.com.br/2010/05/sobrecarga-e-argumentos-marotos-nos-metodos-ruby/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/05/sobrecarga-e-argumentos-marotos-nos-metodos-ruby/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 00:21:51 +0000</pubDate>
		<dc:creator>Sergio Azevedo</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[arguments]]></category>
		<category><![CDATA[default arguments]]></category>
		<category><![CDATA[optional arguments]]></category>
		<category><![CDATA[overload]]></category>
		<category><![CDATA[ruby arguments]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=562</guid>
		<description><![CDATA[Continuando com o assunto de métodos em ruby, vamos falar sobre sobrecarga e argumentos. Para isso imagine um método para fazer uma saudação para alguma pessoa do tipo: Bom Dia Jõao, Boa Tarde Maria, etc&#8230; def seja_educado&#40;saudacao, pessoa&#41; puts &#34;#{saudacao} #{pessoa}&#34; end &#160; seja_educado&#40;&#34;Bom Dia&#34;,&#34;Iuri&#34;&#41; =&#62; Bom Dia Iuri Essa foi muito fácil! Afinal de [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando com o assunto de métodos em ruby, vamos falar sobre sobrecarga e argumentos. Para isso imagine um método para fazer uma saudação para alguma pessoa do tipo: Bom Dia Jõao, Boa Tarde Maria, etc&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao, pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{saudacao} #{pessoa}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom Dia&quot;</span>,<span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Bom Dia Iuri</pre></div></div>

<p>Essa foi muito fácil! Afinal de contas já sabemos &#8220;tudo&#8221; sobre <a href="http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/">criar métodos em ruby</a>.<br />
Então vamos tornar o exemplo mais interessante. Eu quero poder usar o metodo seja_educado das seguintes formas:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Boa Tarde&quot;</span>,<span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Boa Tarde Joao
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Olá Joao</pre></div></div>

<p>Uma típica solução seria usar o velho truque do metodo sobrecarregado então vamos tentar.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao, pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{saudacao} #{cidadao}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Ola #{pessoa}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Olá Joao
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>: wrong number of arguments <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span> <span style="color:#9966CC; font-weight:bold;">for</span> <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<h2>Porque este erro meu Deus? Porque?</h2>
<p>Bem, a triste verdade é que <a href="http://rubylearning.com/satishtalim/ruby_overloading_methods.html">Ruby não da suporte sobrecarga de métodos</a>. Quando escrevemos o metodo pela <em>seja_educado</em> pela segunda vez, na verdade o que fizemos foi redefini-lo e nao criar um outro metodo de mesmo nome. Por isso, quando executamos: seja_educado(&#8220;Boa dia&#8221;,&#8221;Luiz&#8221;) obtivemos o erro relacionado ao numero argumentos.</p>
<h2>Tem algum jeito de resolver isso?</h2>
<p>Sim, a falta de sobrecarga de métodos pode ser compensada se utilizarmos alguns recursos do ruby como por exemplo: o de valor default para argumentos. Vamos fazer com que o argumento saudacao receba a string &#8220;Ola&#8221; sempre que alguem &#8220;se esquecer&#8221; de informar um valor para ele. O código fica assim:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao=<span style="color:#996600;">&quot;Ola&quot;</span>, pessoa<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{saudacao} #{pessoa}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ao colocar o sinal de = e a string &#8220;Ola&#8221; ao lado do argumento saudacao dizemos que se ninguem mandar valor para este argumento, entao ele deverá assumir o valor &#8220;Ola&#8221;. Desta forma as chamadas abaixo fucionarão:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Ola Iuri
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>,<span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> Bom dia Luiz</pre></div></div>

<h2>Incrementando o  Exemplo</h2>
<p>Agora eu quero evoluir ainda mais o nosso metodo <em>seja_educado</em>. Eu quero ser capaz de informar zero, um ou vários nomes de pessoas para cumprimentar, ou seja, as seguintes chamadas de método devem ser suportadas:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span>, <span style="color:#996600;">&quot;Iuri&quot;</span>, <span style="color:#996600;">&quot;Sergio&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Bom como já sabemos apenas as duas primeiras irão funcionar,  já a última chamada vai ocasionar um ArgumentError. O problema agora é que a quantidade de pessoas que devem receber a saudacao pode variar de zero até qualquer número.</p>
<h2>Como resolver isso?</h2>
<p>Para nossa sorte ruby possui um tipo de argumento conhecido como opcional (optional argument), que muito se parece com o varargs do Java. Para usar este tipo de argumento, basta pôr um asterisco (estrela)  na frente do argumento, após fazer isso seu argumento poderá receber zero ou N valores.<br />
Vamos então aplicar o recurso de optional argument e fazer um teste:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span>saudacao=<span style="color:#996600;">&quot;Ola&quot;</span>, <span style="color:#006600; font-weight:bold;">*</span>pessoas<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> pessoas.<span style="color:#9900CC;">empty</span>?
    <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} &quot;</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    pessoas.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} #{p} &quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#008000; font-style:italic;"># Teste com varias pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>, <span style="color:#996600;">&quot;Luiz&quot;</span>, <span style="color:#996600;">&quot;Iuri&quot;</span>, <span style="color:#996600;">&quot;Sergio&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Bom dia Luiz Bom dia Iuri Bom dia Sergio
<span style="color:#008000; font-style:italic;"># Teste com apenas uma pessoa</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span>,<span style="color:#996600;">&quot;Joao&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Bom dia Joao
<span style="color:#008000; font-style:italic;"># Teste sem pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Bom dia&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Bom dia</pre></div></div>

<p>Tivemos que modificar um pouco o método, e acabamos usando o método each que pode receber blocos de código como parâmetro, se você não &#8220;pegou&#8221; bem essa parte de uma olhada <a href="http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/">aqui</a>.<br />
Agora sim hein&#8230;. Podemos usar o método <em>seja_educado</em> com nenhuma ou uma quantidade arbitrária de pessoas, como vimos no exemplo anterior.</p>
<h2>Momento de Reflexão</h2>
<p>Uma ideia me veio a cabeça agora. Repare que no método <em>seja_educado</em>, o argumento saudacao possui um valor default (padrão). O que pode acontecer se utilizarmos este método informando apenas o nome de uma pessoa, ou informando o nome de duas, ou quem sabe com três pessoas? Vamos ver:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#teste com apenas uma pessoa</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Luiz
<span style="color:#008000; font-style:italic;">#teste com duas pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span>,<span style="color:#996600;">&quot;Iuri&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Luiz Iuri
<span style="color:#008000; font-style:italic;">#teste com tres pessoas</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span>,<span style="color:#996600;">&quot;Iuri&quot;</span>,<span style="color:#996600;">&quot;Sergio&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>Luiz Iuri Luiz Sergio</pre></div></div>

<p>Curioso! Em nehuma das chamadas anteriores o valor default do argumento saudacao foi usado. <em>*(1)</em><br />
E se tentarmos inverter a ordem dos argumentos? Vamos ver no que vai dar: <em>*(2)</em</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006600; font-weight:bold;">*</span>pessoas, saudacao=<span style="color:#996600;">&quot;Ola&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> pessoas.<span style="color:#9900CC;">empty</span>?
    <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} &quot;</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    pessoas.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{saudacao} #{p} &quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#008000; font-style:italic;"># Agora nosso novo teste</span>
seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span>syntax error, unexpected tIDENTIFIER, expecting tAMPER <span style="color:#9966CC; font-weight:bold;">or</span> <span style="color:#996600;">'&amp;amp;'</span>
<span style="color:#9966CC; font-weight:bold;">def</span> seja_educado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>pessoas,saudacao=<span style="color:#996600;">&quot;Ola&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Acho que não foi uma boa ideia inverter a ordem dos argumentos no metodo.</p>
<h2>Ruby explica</h2>
<p>Bem vamos com calma, a primeira coisa é que o Ruby tem basciamente 3 tipos de argumentos:</p>
<ul>
<li>Obrigatorios ou requeridos</li>
<li>Com valores padrao ou default</li>
<li>Opcionais</li>
</ul>
<h2>Como ruby associa os valores aos argumentos</h2>
<p>Quando o ruby recebe uma chamada de método ele faz o seguinte divisão dos argumentos:<br />
Primeiro, ele procura todos os argumentos requeridos/obrigatorios e associa valores a estes. Neste ponto se algum argumento obrigatório ficar sem valor, um erro do tipo ArgumentException será exibido.<br />
Depois, se ainda restarem valores, estes serão aplicados aos argumentos default que existirem no método. E por último, ruby aplica os valores &#8220;que sobraram&#8221; ao argumento opcional, isso se ainda restar algum valor.<br />
Pra entender melhor vejamos uns exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> metodo_teste<span style="color:#006600; font-weight:bold;">&#40;</span> a, b=<span style="color:#996600;">&quot;oi&quot;</span>, <span style="color:#006600; font-weight:bold;">*</span>c <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">p</span> <span style="color:#996600;">&quot;a = #{a}, b = #{b}, c = #{c}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
metodo_teste<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = 2, c = 3&quot;</span>
metodo_teste<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = 2, c = 345&quot;</span>
metodo_teste<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006666;">1</span>,<span style="color:#006666;">2</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = 2, c = &quot;</span>
metodo_teste<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006666;">1</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;a = 1, b = oi, c = &quot;</span></pre></div></div>

<p>Além disso, ruby impõe restrições quanto utilizacao dos argumentos dentro de um método.<br />
A tabela abaixo vai nos ajudar a enteder melhor esta ordem, ela lista as possiblidades válidas de combinação e uso dos diferentes tipos de argumentos ruby:</p>
<table>
<tr>
<th>Tipo(s) de Argumento</th>
<th>Exemplo de método</th>
<th>Obs</th>
</tr>
<tr>
<td>Obrigatorio</td>
<td>def teste(a,b,c)</td>
<td></td>
</tr>
<tr>
<td>Default</td>
<td>def teste(a=1,b=2)</td>
<td></td>
</tr>
<tr>
<td>Opcional</td>
<td>def teste(*a)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Opcional</td>
<td>def teste(a,*b)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Default</td>
<td>def teste(a,b=3)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Default/Opcional</td>
<td>def teste(a,b=3,*c)</td>
<td></td>
</tr>
<tr>
<td>Obrigatorio/Default/Opcional/Obrigatorio</td>
<td>def teste(a,b=3,*c,d)</td>
<td>válido apenas a partir da versao 1.9.1</td>
</tr>
</table>
<h2>Então&#8230;</h2>
<p>Conseguimos compreender o que aconteceu nos pontos *(1) e *(2) deste post. No trecho de *(1), vimos que a estratégia ruby para aplicação de valores à argumentos, foi a responsável por aquela &#8220;pegadinha&#8221;. Já no ponto *(2), uma violação cometida por nós, da regra de utlização dos argumentos ruby em métodos foi a causa do erro.<br />
Enfim, conhecer a linguagem é de fundamental importância para o programador, não cair em &#8220;pegadinhas&#8221; como estas.</p>
<p>Abraços, e até a próxima.<br />
Sergio Junior.</p>
<p>Referências:<br />
<a href="http://rubylearning.com/satishtalim/writing_own_ruby_methods.html">Writing own ruby Methods</a><br />
<a href="http://rubylearning.com/satishtalim/ruby_overloading_methods.html">Ruby Overloading  Methods</a><br />
<a href="http://www.manning.com/black2/">The Well-Grounded Rubyist (Book) </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/05/sobrecarga-e-argumentos-marotos-nos-metodos-ruby/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Idéias sobre encapsulamento, linq e delegates em C#</title>
		<link>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/#comments</comments>
		<pubDate>Wed, 05 May 2010 15:21:35 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[boas práticas]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=510</guid>
		<description><![CDATA[Atualmente estou trabalhando em projeto .Net. É a primeira vez que utilizo a plataforma profissionalmente e não dá para negar o quanto a .Net está interessante. Estou bastante impressionado com a linguagem C#. Apesar de todos os recursos interesantes da linguagem, tenho percebido que está acontecendo uma espécie de “relaxamento” em relação as boas práticas, [...]]]></description>
			<content:encoded><![CDATA[<p>Atualmente estou trabalhando em projeto .Net. É a primeira vez que utilizo a plataforma profissionalmente e não dá para negar o quanto a .Net está interessante. Estou bastante impressionado com a linguagem C#. Apesar de todos os <a href="http://code.msdn.microsoft.com/cs2010samples">recursos interesantes</a> da linguagem, tenho percebido que está acontecendo uma espécie de “relaxamento” em relação as boas práticas, principalmente de orientação a objetos. Umas coisas que mais tenho notado é a falta de preocupação com o <a href="http://pt.wikipedia.org/wiki/Encapsulamento">encapsulamento</a>, principalmente quando se usa  <a href="http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx">delegates</a> e <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx">linq</a>.</p>
<p>Neste post vou analisar alguns pontos relacionados a encapsulamento e o uso do Linq.</p>
<p>Vamos começar a analisar um modelo de objetos simples:</p>
<p><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionario.png"><img class="alignnone size-full wp-image-513" title="EmpresaFuncionario" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionario.png" alt="" width="363" height="123" /></a></p>
<p>Como podemos perceber uma empresa tem muitos funcionários e estas classes poderiam ser escritas desta forma:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">class</span> Funcionario
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Nome <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Cargo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">double</span> Salario <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> Ativo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;">class</span> Empresa
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> List Funcionarios <span style="color: #008000;">&#123;</span>get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Aqui um exemplo de como utilizar as classes deste modelo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> Funcionario luiz <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Luiz&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">1000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Desenvolvedor&quot;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario sergio <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Sergim&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">1000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Desenvolvedor&quot;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario iuri <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Iuri&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">1100</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Desenvolvedor&quot;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario luciano <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Luciano&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">2000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Arquiteto&quot;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
 Funcionario eduardo <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Funcionario<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> Ativo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span>, Nome <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Eduardo&quot;</span>, Salario <span style="color: #008000;">=</span> <span style="color: #FF0000;">3000</span>,
    Cargo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Gerente&quot;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
  <span style="color: #008080; font-style: italic;">// adicionando funcionários na empresa.</span>
 Empresa google <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>iuri<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>luciano<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
 google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>sergio<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<h2><strong>Identificando falhas no design</strong></h2>
<p>Mesmo com  um design simples como este um problema básico de design aparece. A classe empresa expõe o atributo Funcionário através de uma <a href="http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx">property</a> e assim viola o encapsulamento. Mas uma property não encapsula o atributo, através de gets e sets? A resposta é que neste caso, o atributo está escondido, mas eu tenho acesso a referência diretamente e o resultado disso é que qualquer “cliente” que usar o objeto do tipo empresa, pode manipular a lista de funcionários diretamente, ignorando quaisquer regras que por ventura existam. Por exemplo imagine a situação onde quisessemos que nunca um Funcionario fosse removido. Do jeito que está qualquer um poderia fazer <strong>google.Funcionarios.Remove(sergio).</strong></p>
<p>Um outro problema que aparece nesse código é que temos um conceito de negócio sendo manipulado, mas não explícito. Quando fazemos <strong>google.Funcionarios.add(luiz)</strong>, isso  representa uma ação no nosso domínio. Na verdade o que queremos fazer é contratar o Luiz. Técnicas como <a href="http://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design</a>, pregam que nosso código deve falar a <a href="http://domaindrivendesign.org/node/132">lingua do negócio</a>. De acordo com DDD, precisamos tornar este <a href="http://www.markhneedham.com/blog/2009/04/23/ddd-making-implicit-concepts-explicit/">conceito explícito</a> em nosso código. Vamos alterar a classe empresa para suportar isso:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> List Funcionarios <span style="color: #008000;">&#123;</span>get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Contrata<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
 <span style="color: #008000;">&#125;</span></pre></div></div>

<p>Repare que agora, existe um método na classe empresa que representa o conceito que estava implícito. Sempre devemos tornar os <a href="http://www.markhneedham.com/blog/2009/04/23/ddd-making-implicit-concepts-explicit/">conceitos implícitos explícitos</a>. Agora nosso código fica muito mais OO, se é que se pode usar esta expressão:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>eduardo<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>iuri<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>luciano<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Contrata</span><span style="color: #008000;">&#40;</span>sergio<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Agora o conceito “contratação” está explícito, mas ainda existe um <a href="http://en.wikipedia.org/wiki/Information_hiding">problema</a>, a classe empresa, ainda tem uma property que te permite acessar a lista de funcionários. Apesar de ter criado o método contrata, isso não garante que a lista não será manipulada diretamente.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Este trecho de código mostra novamente o <a href="http://en.wikipedia.org/wiki/Information_hiding">problema de expor a lista</a>, neste caso ao invés de contratar um funcionário estamos demitindo. Agora imagine que existe uma regra que especifica que todo funcinário demitido tem que ser inativado, como vamos garantir que isto vai ser feito? Podemos inativar o funcionário antes de removê-lo da lista:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  luiz<span style="color: #008000;">.</span><span style="color: #0000FF;">Inativar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>luiz<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>O problema desta abordagem é óbvio, não tem como garantir que esta regra será executada toda vez que precisarmos demitir um funcionário. Para resolver isso, novamente vamos tornar explícito o conceito de demissão.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> List Funcionarios<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Contrata<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Demite<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      funcionario<span style="color: #008000;">.</span><span style="color: #0000FF;">Inativar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span></pre></div></div>

<p>Agora a classe Empresa  tem um método Demite, o que torna explícito o conceito demissão. Note que antes de executar a remoção do usuário, fazemos a sua inativação. Além disso, não existe mais a property na classe empresa que expõe o atributo funcionários, este atributo é privado e somente a classe empresa sabe como manipulá-lo de forma correta.</p>
<p>Não fizemos nada além de seguir <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">princípios básicos de OO</a> aplicando o encapsulamento, e neste pequeno exemplo mostramos como é possível tornar o código mais fácil de se manter utilizando esta técnica.</p>
<h2><strong>Encapsulamento e linq no C#</strong></h2>
<p>Nas últimas versões do C# várias coisas interessantes foram incluídas, tornando a linguagem muito poderosa. Mas por outro lado, tenho visto uso destas técnicas de forma não muito organizada, principalmente em relação as boas práticas de programação em uma linguagem Orientada a Objetos.</p>
<p>Um dos recursos mais interessantes e que utiliza muitas das novas características da linguagem é o Linq. Vamos dar uma olhada no que<a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx"> é possível fazer com o Linq</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  var nomes <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span><span style="color: #666666;">&quot;luiz&quot;</span>,<span style="color: #666666;">&quot;sergio&quot;</span>, <span style="color: #666666;">&quot;iuri&quot;</span>, <span style="color: #666666;">&quot;eduardo&quot;</span>, <span style="color: #666666;">&quot;jose maria&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
  var nomesQueComecamComS <span style="color: #008000;">=</span> nomes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>nome <span style="color: #008000;">=&gt;</span> nome<span style="color: #008000;">.</span><span style="color: #0000FF;">StartsWith</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;S&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var nomesQueContemMaria <span style="color: #008000;">=</span> nomes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>nome <span style="color: #008000;">=&gt;</span> nome<span style="color: #008000;">.</span><span style="color: #0000FF;">Contains</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;maria&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> cities <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> <span style="color: #666666;">&quot;Auckland&quot;</span>, <span style="color: #666666;">&quot;Oslo&quot;</span>, <span style="color: #666666;">&quot;Sydney&quot;</span>,<span style="color: #666666;">&quot;Seattle&quot;</span>, <span style="color: #666666;">&quot;Paris&quot;</span>, <span style="color: #666666;">&quot;Los Angeles&quot;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
  IEnumerable places <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">from</span> city <span style="color: #0600FF; font-weight: bold;">in</span> cities
                             <span style="color: #0600FF; font-weight: bold;">where</span> city<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">&gt;</span>
                             orderby city descending
                             <span style="color: #0600FF; font-weight: bold;">select</span> city<span style="color: #008000;">;</span></pre></div></div>

<p>Isso é muito poderoso, podemos fazer operações sobre lista de forma muito mais declarativa. O problema é que todo esse poder pode esconder algumas surpresas se não tomarmos os devidos cuidados com sua utilização.<br />
No nosso primeiro exemplo, vimos como encapsulamento na sua forma mais simples, torna nosso código mais simples, expressivo e de mais fácil manutenção.<br />
Vamos voltar a analisar o primeiro exemplo, só que pela perspectiva do uso do linq. Para isso vamos precisar colocar criar novamente a property  funcionários na classe empresa.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"> <span style="color: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> List Funcionarios <span style="color: #008000;">&#123;</span>get<span style="color: #008000;">;</span>set<span style="color: #008000;">;</span><span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span></pre></div></div>

<p>Considere os seguintes trechos de códigos, e veja como é possível trabalhar de forma <a href="http://en.wikipedia.org/wiki/Declarative_programming">declarativa </a>utilizando os recursos do linq:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  var funcionarios <span style="color: #008000;">=</span> google<span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">;</span>
  var salarioMedido <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0000FF;">Average</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Salario</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>salarioMedido<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var funcionariosAtivos <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var desenvolvedores <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Cargo</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Equals</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;desenvolvedor&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  var GerenteComSalarioMaior2000 <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Cargo</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Equals</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Gerente&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&amp;</span>
                                                                            f<span style="color: #008000;">.</span><span style="color: #0000FF;">Salario</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">2000</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Veja que fizemos várias operações sobre a lista de funcionários da empresa. A primeira vista isso é muito prático, mas podemos ter problemas com essa abordagem.  Na minha opinião o maior problema disso é que perdemos o <a href="http://domaindrivendesign.org/">conhecimento fundamental do negócio</a>. Se eu quero saber o salário médio dos funcionários de uma empresa, então esta operaçao deve estar explícita no objeto empresa.</p>
<p>Mas se eu fizer isso vou deixar  de tirar proveito das facilidaes do Linq? Não, basta promover o encapsulamento e mover este código para a classe empresa. A partir de agora o usuário da classe vai passar a invocar o método disponível no objeto empresa:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  salarioMedido <span style="color: #008000;">=</span> google<span style="color: #008000;">.</span><span style="color: #0000FF;">ObterSalarioMedio</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Após fazer a mudança, o código fica mais simples, intuitivo e expressivo. O leitor do código, entende rapidamente o que esta linha de código faz e não precisa saber detalhes de implementação.<br />
Outro exemplo de código é a linha :</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  var funcionariosAtivos <span style="color: #008000;">=</span> funcionarios<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Neste trecho temos 2 problemas. Novamente a falta de encapsulamento. De quem é a <a href="http://en.wikipedia.org/wiki/GRASP_(object-oriented_design)">responsabilidade</a> de dizer quem são os funcionários ativos? <a href="http://web.cs.wpi.edu/~gpollice/cs4233-a05/CourseNotes/maps/class4/InformationExpert.html">Deveria ser da classe empresa</a>, então precisamos criar um novo método na classe para obter os funcionários ativos.<br />
Então na classe empresa temos:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #0600FF; font-weight: bold;">public</span> IEnumerablel ObterFuncionariosAtivos<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
     <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #008000;">&#125;</span></pre></div></div>

<p>O segundo problema desta expressão novamente é falta de encapsulamento, estamos violando o princípio <a href="http://pragprog.com/articles/tell-dont-ask">Tell don’t Ask</a> quando fazemos  f.ativo == true. Quem sabe dizer se o funcionário é ativo ou não é o objeto funcionário, então é necessário criar o método na classe funcionário para tornar o explícito o conceito:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #6666cc; font-weight: bold;">class</span> Funcionario
  <span style="color: #008000;">&#123;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Nome <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Cargo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">double</span> Salario <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> Ativo <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> EstahAtivo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span></pre></div></div>

<p>E na classe empresa  podemos alterar a expressão Linq para utilizar o método da classe funcionário.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #0600FF; font-weight: bold;">public</span> IEnumerable ObterFuncionariosAtivos<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">EstahAtivo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #008000;">&#125;</span></pre></div></div>

<p>Aqui a classe empresa completa:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">class</span> Empresa
 <span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> List Funcionarios<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Empresa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      Funcionarios <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Contrata<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Demite<span style="color: #008000;">&#40;</span>Funcionario funcionario<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
      funcionario<span style="color: #008000;">.</span><span style="color: #0000FF;">Inativar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>funcionario<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>     
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">public</span> IEnumerablel ObterFuncionariosAtivos<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
       <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Ativo</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>  
&nbsp;
     <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">double</span> ObterSalarioMedio<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
         <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Funcionarios</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Average</span><span style="color: #008000;">&#40;</span>f <span style="color: #008000;">=&gt;</span> f<span style="color: #008000;">.</span><span style="color: #0000FF;">Salario</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span></pre></div></div>

<p><a href="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionarioCompleto.png"><img class="alignnone size-full wp-image-517" title="EmpresaFuncionarioCompleto" src="http://www.sagadoprogramador.com.br/wp-content/uploads/2010/05/EmpresaFuncionarioCompleto.png" alt="" width="525" height="144" /></a></p>
<p>Estes são apenas alguns exemplos de código simples onde a falta de encapsulamento pode trazer problemas no futuro. Com certeza um dos mais evidentes é a replicação de código e consequentemente os problemas de manutenção causados por ele, além é claro do fato do conhecimento do domínio ficar espalhado entre várias expressões Linq.</p>
<h2>Então os problemas são das novas features do C#?</h2>
<p>Não, com certeza isso não é problema das novas features do c#. A questão evidente é que muitos desenvolvedores estão esquecendo <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">princípios básicos</a> ao utilizarem estes recursos.</p>
<p>Existem alguns artigos  na web falando sobre a tendência de se <a href="http://www.markhneedham.com/blog/2010/04/02/ldnug-mixing-functional-and-object-oriented-approaches-to-programming-in-c/">misturar</a> os <a href="http://www.ccs.neu.edu/home/matthias/Presentations/ecoop2004.pdf">paradigmas funcional e OO</a>. Nós como desenvolvedores só temos a ganhar com isso, pois podemos tirar proveito do  melhor dos dois paradigmas. O que não pode acontecer é voltarmos aos problemas que tínhamos no passado, geralmente por  descuido ou  simplesmente por um “relaxamento”  com princípios básicos de Orientação Objetos.</p>
<p>até a próxima,<br />
Luiz Costa</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/05/ideias-sobre-encapsulamento-linq-delegates-em-c/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>DRY e Blocos de Código com Ruby</title>
		<link>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 02:54:22 +0000</pubDate>
		<dc:creator>Sergio Azevedo</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[block]]></category>
		<category><![CDATA[blocos]]></category>
		<category><![CDATA[blocos de codigo ruby]]></category>
		<category><![CDATA[ruby block]]></category>
		<category><![CDATA[ruby blocks]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=451</guid>
		<description><![CDATA[O Iuri já mostrou num post anterior, como criar métodos (funções) em ruby. Sendo assim somos praticamente craques em construir funções ruby. Neste post vamos explorar recursos avançados e interessantes das funçoes ruby, para isso, utilizaremos um array com alguns nomes. Problema Inicial: Devemos criar um  método que seja capaz de percorrer um array, exibindo seus [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://twitter.com/iurims">Iuri</a> já mostrou num <a href="http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/">post anterior</a>, como criar métodos (funções) em ruby. Sendo assim somos praticamente craques em construir funções ruby. Neste post vamos explorar recursos avançados e interessantes das funçoes ruby, para isso, utilizaremos um array com alguns nomes.</p>
<h2>Problema Inicial:</h2>
<p>Devemos criar um  método que seja capaz de percorrer um array, exibindo seus elementos. <em>(Ok, tudo bem nós sabemos que todo array possui um método each. Mas vamos fingir que esse kra não existe)</em></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> elemento
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Ótimo! Atingimos nosso objetivo. O codigo acima exibira os nomes contidos no array.</p>
<h2>Os requisitos mudaram:</h2>
<p>Agora nós queremos  percorrer o array exibindo cada um de seus elementos ao contrario, por exemplo, &#8220;sergio&#8221; será exibido como &#8220;oigres&#8221;. Podemos criar um novo método para isso, então vamos ao trabalho:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> lista <span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Perfeito! Mais uma vez concluímos nossa tarefa.</p>
<h2>DRY, mais um princípio de Desenvolvimento de Software:</h2>
<p>Os problemas anteriores envolviam operações com elementos de um array (uma lista), e assim acabamos criando dois métodos para resolver os problemas propostos. Existe um princípio de desenvolvimento de software que é focado em reduzir a repetição/duplicação de código, ele é conhecido como: <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">Don&#8217;t Repeat Yourself &#8211; (DRY)</a>. Este principio diz que:</p>
<blockquote>
<h4>&#8220;Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.&#8221;</h4>
</blockquote>
<p style="text-align: justify;">O que poderiamos traduzir como: <em>&#8220;Cada parte do conhecimento deve ter uma representação única e não ambigua dentro de um sistema&#8221;. </em>Desta forma utilizando o DRY para analisar as funções que escrevemos até agora, podemos notar que <em>a parte do conhecimento </em>de percorrer um array não possui <em>uma representação única</em> em nosso sistema. O ideal seria que o codigo de percorrer um array nao fosse mais repetido, e é exatamente nisso que vamos trabalhar agora.</p>
<h2>Aplicando o DRY</h2>
<p>A maneira mais simples de resolvemos o problema de duplicação do codigo de percorrer o array, é sem duvida realizar um refactor chamado <a href="http://sourcemaking.com/refactoring/extract-method">extract method</a>, e assim isolar a lógica de percorrer arrays em um método. Entao vamos lá:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
   percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span><span style="color:#006600; font-weight:bold;">&#41;</span>
   <span style="color:#CC0066; font-weight:bold;">puts</span> elemento
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">array</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span>
mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Pronto! Com este método que acabamos de criar eliminamos o problema de  repetição de código. Porém ao executar este programa receberemos uma mensagem de erro. O grande problema aqui é que agora os métodos <em>mostra_elementos </em>e <em>mostra_elementos_ao_contrario</em> não conseguem mais acessar cada elemento do array. Estes métodos agora usam a função percorre_array, e somente dentro desta função é que a variavel <em>elemento</em> existe. Neste ponto podemos pensar que, ou fazemos a coisa ficar DRY, ou fazemos o programa funcionar. Calma, com Ruby nos poderemos fazer isso funcionar e ainda ser DRY. Para isso só precisamos aprender a usar os famosos blocos do Ruby.</p>
<h2>Ruby block&#8217;s</h2>
<p>Com certeza você já ouviu, que tudo em ruby é objeto. Na verdade mesmo, quase tudo em Ruby é objeto, por exemplo blocos de código não são objetos. Mas o importante é  que  em Ruby podemos armazenar trechos de código em um objeto especial que se chama Proc. Veja:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">bloco = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
bloco.<span style="color:#9900CC;">call</span></pre></div></div>

<p>Acabamos de criar um objeto, que contem código, e fizemos isso utilizando Proc.new e fornecendo o código através das chaves  &#8221;{ }&#8221;. De posse de uma Proc, podemos executar o código que ela contem a qualquer momento. Basta pra isso usar o método call da Proc. No exemplo acima ao chamar <em>bloco.call </em>veremos o texto <em>s</em><em>ou um bloco de codigo<strong>.</strong><span style="font-style: normal;"> O interessante disso é que agora podemos passar </span> código </em> como parametro, veja um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span> block <span style="color:#006600; font-weight:bold;">&#41;</span>
  block.<span style="color:#9900CC;">call</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
bloco = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span>bloco<span style="color:#006600; font-weight:bold;">&#41;</span>
faco_o_que_mandar <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Mais um bloco&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Mas podemos fazer como os rubistas fazem na maioria das vezes. Eles chamam a função e passam o bloco como parametro, para isso precisamos fazer uma pequena alteração em nossa função, basta colocar um <strong>&#038;</strong> a frente do nome do nosso parametro. Outra coisa é que geralmente os rubistas utilizam a plavara <strong>yield</strong> ao invés de coisas como <strong>bloco.call</strong>, vamos mudar isso também:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">yield</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
faco_o_que_mandar <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo tipo rubista&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
faco_o_que_mandar <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;blocos do end sao usados quando vc quer&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;fazer coisas que precisem de mais de uma&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;linha =)&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>O grande barato é que agora escrevemos uma função que recebe e executa um código &#8220;visitante&#8221;. Este é um recurso muito poderoso, e é graças a ele que vamos conseguir resolver o problema de percorrer um array para fazer coisas diferentes com seus elementos, sem precisar repetir código.</p>
<h2>Tirando vantagem dos blocos</h2>
<p>Bem, nós já temos uma função que sabe andar em um array. Agora só precisamos fazer esta função receber um bloco de código &#8220;visitante&#8221; e assim teremos tudo resolvido. Vamos então ao trabalho:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento <span style="color:#006600; font-weight:bold;">&#125;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span> <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p><em>Neste momento você pode estar se perguntando o porquê do bloco de código estar fora dos parênteses. Por mais estranho que possa parecer é desse jeito que funciona mesmo. Os blocos são informados depois dos parametros &#8220;convencionais&#8221;.</em></p>
<p>Agora seria ótimo se isso funcionasse, não é? Pena que não vai funcionar. Ao executar esse código veremos o seguinte erro: <span style="color: #ff0000;">undefined local variable or method `elemento&#8217; for main:Object (NameError).</span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Repare no erro, ele diz que a variavel <em>elemento </em>não está definida. Isso aconteceu porque esta variavel é local do método <em>percorre_array</em>, ou seja só existe, e só é visivel naquele método. Nós precisamos manipular esta variavel, para que isto seja possível o método que <strong>possui</strong> a variavel precisa permitir que os blocos visitantes utilizem esta variavel. Fazer isso é simples, basta que no <strong>yield</strong> nos passemos a variavel em questão como parâmetro. </span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Quando colocamos o  <strong>yield</strong> na função é como se dissesemos: &#8220;Rode o codigo visitante agora&#8221;. E quando colocamos a frente do <strong>yield</strong> parâmetros é como se dissessemos: &#8220;Ei código vistante, se você quiser pode usar estes caras aqui que eu tenho&#8221;. Vejamos como fica isso no nosso codigo:</span></span></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#008000; font-style:italic;">#agora estamos expondo a variavel elemento</span>
    <span style="color:#008000; font-style:italic;"># para o codigo visitante</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span> elemento
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;"># uma pequena alteracao é necessaria aqui</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>elemento<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento <span style="color:#006600; font-weight:bold;">&#125;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>elemento<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Agora sim o código funciona. A linha<em></em> <em>yield elemento</em>, tem o efeito de enviar para o bloco visitante a variavel <em>elemento </em>como parametro. Assim a cada iteracao do loop for um novo valor é enviado ao código visitante através da variavel <em>elemento.</em> Com isso nosso trabalho está terminado, implementamos as funcionalidades solicitadas, sem repetir código, e de quebra aprendemos sobre DRY e blocos de código em Ruby.</p>
<p>Bloco de código é um assunto bem interessante, e aqui nós abordamos só uma pequena parte. Tem ainda um lance de lambdas, enfim como disse antes o assunto é muito interessante, e se você quiser saber mais pode olhar um post do Anderson Leite sobre isso, <a href="http://andersonleiteblog.wordpress.com/2010/02/18/metaprogramacao-procs-lambdas-e/">o link é este</a>.</p>
<p>Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Cliente para Restfulie C#</title>
		<link>http://www.sagadoprogramador.com.br/2010/01/cliente-para-restfulie-c/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/01/cliente-para-restfulie-c/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 23:43:52 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[hipermedia]]></category>
		<category><![CDATA[restfulie]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=430</guid>
		<description><![CDATA[No final do ano passado o Guilherme Silveira da Caelum , lançou a api Restfulie. Basicamente o Restfulie implementa as idéias do Jim Webber e Ian Robson em relação a media types que suportam hipermídia, content negotiation e muito mais relacionado a Rest. Este projeto fez bastante barulho na comunidade, inclusive recebendo elogios do próprio [...]]]></description>
			<content:encoded><![CDATA[<p>No final do ano passado o <a href="http://guilhermesilveira.wordpress.com/" target="_blank">Guilherme Silveira</a> da <a href="http://www.caelum.com.br" target="_blank">Caelum </a>, lançou a api <a href="http://restfulie.caelum.com.br/" target="_blank">Restfulie</a>.<br />
Basicamente o Restfulie implementa as idéias do <a href="http://jim.webber.name/" target="_blank">Jim Webber</a> e <a href="http://iansrobinson.com/" target="_blank">Ian Robson</a> em relação a media types que suportam hipermídia, content negotiation e muito mais relacionado a <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" target="_blank">Rest</a>.<br />
Este projeto fez <a href="http://www.infoq.com/news/2009/11/restfulie-hypermedia-services" target="_blank">bastante barulho</a> na <a href="http://www.infoq.com/news/2009/12/restfulie-interview" target="_blank">comunidade</a>, inclusive recebendo <a href="http://jim.webber.name/2009/11/03/0a252e61-a132-42ab-8547-69e269c3c075.aspx">elogios do próprio Jim</a>.</p>
<p>O Restfulie teve sua versão original implementada em<a href="http://restfulie.caelum.com.br/restful_rails" target="_blank"> ruby</a> e logo depois foi lançada a versão para<a href="http://github.com/caelum/restfulie-java" target="_blank"> Java</a>, mas ainda não havia nenhuma versão para .Net. Foi então que eu e o Sergio Junior aqui do blog resolvemos escrever uma versão para <a href="http://restfulie.caelum.com.br/restful_csharp" target="_blank">C# da api</a>.<br />
Começamos a implementar a parte cliente do Restfulie e fizemos isto utilizando as características dinâmicas da versão 4.0 do C#.<br />
A idéia é que podemos fazer o client em C# bem próximo da idéia inicial que foi escrita em Ruby.<br />
<span id="more-430"></span><br />
Aqui vamos mostrar alguns exemplos de utilização desta versão em C#.<br />
Um recurso Pedido pode ter sua representação em xml como a que segue:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pedido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>26/12/2009 11:40<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/data<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>300.00<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;refresh&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">xmlns:atom</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2005/Atom&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;update&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">xmlns:atom</span>=<span style="color: #ff0000;">&quot;...&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;pagar&quot;</span></span>
<span style="color: #009900;">		  <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1/pagar&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">xmlns:atom</span>=<span style="color: #ff0000;">&quot;...&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;excluir&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1</span>
<span style="color: #009900;">          xmlns:atom=&quot;</span>...<span style="color: #ff0000;">&quot;/&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;atom:link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;GetCliente&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.caelum.com.br/pedidos/1/cliente</span>
<span style="color: #009900;">          xmlns:atom=&quot;</span>...<span style="color: #ff0000;">&quot;/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/pedido<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Respare que a representação deste recurso além de conter  os dados do recurso, possui também  todas as possíveis transições de estado do recurso.<br />
Além  disso, ainda é possível seguir os links e obter outros recursos relacionados: este é o conceito de Hipermedia tanto utilizado na web humana.</p>
<p><strong>Utilizando o Restfulie client C#</strong></p>
<p>Primeiro começamos fazendo o download da <a href="http://code.google.com/p/restfulie/downloads/list" target="_blank">DLL </a>e então para obter a representação de um recurso em C#, podemos utilizar algo bem parecido com ruby, o acesso a um entry point:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">dynamic  pedido <span style="color: #008000;">=</span> Restfulie<span style="color: #008000;">.</span><span style="color: #0000FF;">At</span><span style="color: #008000;">&#40;</span>“www<span style="color: #008000;">.</span><span style="color: #0000FF;">caelum</span><span style="color: #008000;">.</span><span style="color: #0000FF;">com</span><span style="color: #008000;">.</span><span style="color: #0000FF;">br</span><span style="color: #008000;">/</span>pedidos<span style="color: #008000;">/</span><span style="color: #FF0000;">1</span><span style="color: #008000;">.</span><span style="color: #0000FF;">xml</span>”<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Uma vez com a representação do recurso em mãos, podemos obter as informações do mesmo e seguir seus links.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>
   <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">format</span><span style="color: #008000;">&#40;</span>“O valor total <span style="color: #0600FF; font-weight: bold;">do</span> pedido é<span style="color: #008000;">:</span><span style="color: #008000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#125;</span>”, pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">Total</span> <span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>
   <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">format</span><span style="color: #008000;">&#40;</span>“A data <span style="color: #0600FF; font-weight: bold;">do</span> pedido é<span style="color: #008000;">:</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#125;</span>”, pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">Data</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>É possível invocar métodos e alterar o estado do pedido, além de navegar em suas relações com outros recursos.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">   pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">Pagar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">Cancelar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
   pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">Excluir</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Estas chamadas de métodos são remotas, baseadas nos links fornecidos pelo xml e nos protocolos http e media types bem conhecidos.<br />
Para recuperar um recurso relacionado através dos links:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  dynamic cliente <span style="color: #008000;">=</span> pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCliente</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>
     <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">format</span><span style="color: #008000;">&#40;</span>“Nome <span style="color: #0600FF; font-weight: bold;">do</span> cliente <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#125;</span>”, cliente<span style="color: #008000;">.</span><span style="color: #0000FF;">nome</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Ainda podemos obter as informações sobre sua resposta web, para analisar headers ou response codes:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">WebResponse</span><span style="color: #008000;">.</span><span style="color: #0000FF;">StatusCode</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>As vezes a representação xml do recurso pode conter tags com o caracter “-”.<br />
Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Sao Paulo<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;population<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>18000000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/size<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;growth<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>10<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/growth<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/population<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;updated-at<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>10/01/2010<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/updated-at<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;next_largest&quot;</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://localhost:3000/cities/18.xml&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Obtendo o recurso:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">dynamic city <span style="color: #008000;">=</span> Restfulie<span style="color: #008000;">.</span><span style="color: #0000FF;">At</span><span style="color: #008000;">&#40;</span>“http<span style="color: #008000;">:</span><span style="color: #008080; font-style: italic;">//localhost:3000/cities/17.xml”).Get();</span></pre></div></div>

<p>Acessando o atributo “update-at”:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>
     <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">format</span><span style="color: #008000;">&#40;</span>“A data de atualização é <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#125;</span>”,city<span style="color: #008000;">.</span><span style="color: #0000FF;">Update_At</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>
     <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">format</span><span style="color: #008000;">&#40;</span>“População <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#125;</span>”, city<span style="color: #008000;">.</span><span style="color: #0000FF;">Population</span><span style="color: #008000;">.</span><span style="color: #0000FF;">size</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Note que em na vesão C#, não acessamos o atributo update-at com caracter “-”, este é substituído por “_”. Então quando for necessário acessar um atributo ou método que utilize o “-”, substituída por “_”.<br />
Com as novas capacidades dinâmicas do C# 4.0, conseguimos atingir um resultado bem próximo ao que é possível na versão ruby.<br />
Aqui segue um comparativo básico:</p>
<p>Em Ruby:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  pedido = Restfulie.<span style="color:#9900CC;">at</span><span style="color:#006600; font-weight:bold;">&#40;</span>“http:<span style="color:#006600; font-weight:bold;">//</span>restfulie<span style="color:#006600; font-weight:bold;">-</span>test.<span style="color:#9900CC;">heroku</span>.<span style="color:#9900CC;">com</span><span style="color:#006600; font-weight:bold;">/</span>orders<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">14</span>”<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">get</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> pedido.<span style="color:#9900CC;">customer</span><span style="color:#006600; font-weight:bold;">-</span>name
  pedido.<span style="color:#9900CC;">cancel</span></pre></div></div>

<p>Em C#</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  pedido <span style="color: #008000;">=</span> Restfulie<span style="color: #008000;">.</span><span style="color: #0000FF;">At</span><span style="color: #008000;">&#40;</span>“http<span style="color: #008000;">:</span><span style="color: #008080; font-style: italic;">//restfulie-test.heroku.com/orders/14.xml”).Get();</span>
  Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">customer_name</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
  pedido<span style="color: #008000;">.</span><span style="color: #0000FF;">Cancel</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Por enquanto só temos a versão do client em C#. Ainda falta uma série de features a serem implementadas. No site do projeto, tem uma lista de coisas que necessitam de ser feitas no cliente<br />
para que ele fique tão maduro quanto as versões em ruby ou Java. Vamos continuar trabalhando no cliente para isso.</p>
<p>Se você está interessado em ajudar neste projeto, deixe um comentário ou mande um e-mail para nós.</p>
<p>Para saber mais:</p>
<p><a href="http://github.com/caelum/restfulie-csharp">http://github.com/caelum/restfulie-csharp</a><br />
<a href="http://restfulie.caelumobjects.com/">http://restfulie.caelumobjects.com/</a></p>
<p>Para saber mais sobre as idéias por trás do Restfulie, segue o link do artigo na infoq.<br />
<a href="http://www.infoq.com/articles/webber-rest-workflow">http://www.infoq.com/articles/webber-rest-workflow</a></p>
<p>Até a Próxima<br />
Luiz Costa<br />
Sérgio Júnior.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/01/cliente-para-restfulie-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

