<?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>codificando.com &#187; design</title>
	<atom:link href="http://codificando.com/tag/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://codificando.com</link>
	<description>Desenvolvimento de Software com qualidade</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:49:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Law of Demeter simples em Ruby com a gem demeter</title>
		<link>http://codificando.com/2009/11/law-of-demeter-simples-em-ruby-com-a-gem-demeter/</link>
		<comments>http://codificando.com/2009/11/law-of-demeter-simples-em-ruby-com-a-gem-demeter/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 04:17:07 +0000</pubDate>
		<dc:creator>Emerson Macedo</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[demeter]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[dry]]></category>
		<category><![CDATA[lawofdemeter]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://codificando.com/?p=276</guid>
		<description><![CDATA[Depois de programar algum tempo em Ruby, me senti muito incomodado em ter que repetir um determinado código para manter minha estrutura respeitando a Law of Demeter. Pra quem não está familiarizado, segue um simples exemplo em Rails: #models class &#8230; <a href="http://codificando.com/2009/11/law-of-demeter-simples-em-ruby-com-a-gem-demeter/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Depois de programar algum tempo em Ruby, me senti muito incomodado em ter que repetir um determinado código para manter minha estrutura respeitando a <a href="http://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter</a>. Pra quem não está familiarizado, segue um simples exemplo em Rails:</p>
<pre class="brush: ruby; title: ;">
#models
class Post &lt; ActiveRecord::Base
  has_many :comments
end

class Comment &lt; ActiveRecord::Base
  belongs_to :post
end

#view - erb|haml
@comment.post.title
@comment.post.name
@comment.post.something_else
</pre>
<p>O exemplo é um pouco forçado, mas o problema claro do exemplo é que estamos conhecendo demais sobre o objeto <strong>post</strong> dentro de <strong>comment</strong>. Se for necessário alguma alteração em algum dos atributos que estamos acessando diretamente, possivelmente isso resultará em modificações em cascata em todo código.</p>
<p>Depois dessa explicação básica para quem ainda não conhecia a <a href="http://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter</a>, vamos aplicar algumas soluções:</p>
<p>Segunda tentativa:</p>
<pre class="brush: ruby; title: ;">
#models
class Post &lt; ActiveRecord::Base
  has_many :comments
end

class Comment &lt; ActiveRecord::Base
  belongs_to :post
  def post_title
    post ? post.title : nil #preciso verificar se é nulo, caso contrário terei problemas
  end
  def post_name
    post ? post.name : nil #preciso verificar se é nulo, caso contrário terei problemas
  end
  def post_something_else
    post ? post.something_else : nil #preciso verificar se é nulo, caso contrário terei problemas
  end
end

#view - erb|haml
@comment.post_title
@comment.post_name
@comment.post_something_else
</pre>
<p>Essa mudança resolve o problema. Acontece que isso acaba sendo um pattern para resolver o problema, portanto, precisamos encontrar uma forma de não ficar repetindo esse código.</p>
<p>Quem já leu o livro <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X">The Pragmatic Programmer</a>, tem bem na memória o capítulo que apresenta o conceito <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY &#8211; D&#8217;ont Repeat Yourself</a>. Quem programa em Ruby e principalmente já usou o framework Rails sabe bem que <a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a> é um dos chavões que estão imbutidos na propaganda. Vamos então tentar fazer mais algumas modificações pra tentar alcançar esse objetivo:</p>
<p>Terceira tentativa:</p>
<pre class="brush: ruby; title: ;">
#models
class Post &lt; ActiveRecord::Base
  has_many :comments
end

require 'forwardable'
class Comment &lt; ActiveRecord::Base
  extend Forwardable
  belongs_to :post
  def_delegator :post, :name, :post_name
  def_delegator :post, :title, :post_title
  def_delegator :post, :something_else, :post_something_else
end

#view - erb|haml
@comment.post_title
@comment.post_name
@comment.post_something_else
</pre>
<p>O módulo <a href="http://www.ruby-doc.org/stdlib/libdoc/forwardable/rdoc/index.html">Forwardable</a> já vem com o Ruby. Portanto, a solução mais obvia foi usar esse módulo para melhorar o exemplo anterior. Apesar de escrever menos código, essa alternativa tem o inconveniente de não verificar se o objeto <strong>post</strong> é <strong>nil</strong>, causando assim <strong>NoMethodError</strong> em alguns casos. Sendo assim, a alternativa anterior ainda parece ser mais adequada. Porém, a duplicação de código ainda me incomodava bastante, portanto, resolvi montar uma solução única que deu origem a <a href="http://github.com/emerleite/demeter"><strong>gem demeter</strong></a>.</p>
<p>A solução definitiva:</p>
<pre class="brush: ruby; title: ;">
#no shell
&gt; sudo gem update --system
&gt; sudo gem sources -a http://gemcutter.org
&gt; sudo gem install demeter

#models
class Post &lt; ActiveRecord::Base
  has_many :comments
end

class Comment &lt; ActiveRecord::Base
  extend Demeter     #extends demeter module
  demeter :post      #demeter post object
  belongs_to :post
end

#view
@comment.post_title
@comment.post_name
@comment.post_something_else
</pre>
<p>Basicamente o problema foi resolvido com 2 linhas de código:</p>
<pre class="brush: ruby; title: ;">
  extend Demeter
  demeter :post
</pre>
<p>A vantagens são visíveis porque (1) você escreve bem menos, (2) já existe a verificação de objetos nulos e (3) caso você queira sobrescrever o comportamento padrão, basta criar um método que responda a mesma mensagem que a <a href="http://github.com/emerleite/demeter"><strong>gem demeter</strong></a> responde. Dessa forma, o método criado pelo programador semrpe terá prioridade.</p>
<p>O código fonte do projeto está em <a href="http://github.com/emerleite/demeter">http://github.com/emerleite/demeter</a> com todas as instruções para utilização tanto em Ruby quanto em Ruby on Rails. O código fonte tem todos os testes automatizados que cobrem diversos cenários. O resultado desses testes podem ser vistos em <a href="http://runcoderun.com/emerleite/demeter">http://runcoderun.com/emerleite/demeter</a>. A página da gem fica em <a href="http://gemcutter.org/gems/demeter">http://gemcutter.org/gems/demeter</a></p>
<p>Aguardo o feedback de vocês <img src='http://codificando.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
<p><font color="#B4B4B4" size="-2">Post Footer automatically generated by <a href="http://www.freetimefoto.com/add_post_footer_plugin_wordpress" style="color: #B4B4B4; text-decoration:underline;">Add Post Footer Plugin</a> for wordpress.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://codificando.com/2009/11/law-of-demeter-simples-em-ruby-com-a-gem-demeter/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Assine seus códigos</title>
		<link>http://codificando.com/2009/02/assine-seus-codigos/</link>
		<comments>http://codificando.com/2009/02/assine-seus-codigos/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 19:26:21 +0000</pubDate>
		<dc:creator>Emerson Macedo</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[engenharia]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://codificando.com/?p=58</guid>
		<description><![CDATA[Quem nunca chegou numa empresa ou projeto, deu de cara com um código horroroso e logo disse: Que droga, quem foi o infeliz que fez esse código tosco? Ou o contrário: Quem foi o cara que fez esse código maneiro? &#8230; <a href="http://codificando.com/2009/02/assine-seus-codigos/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quem nunca chegou numa empresa ou projeto, deu de cara com um código horroroso e logo disse: Que droga, quem foi o infeliz que fez esse código tosco? Ou o contrário: Quem foi o cara que fez esse código maneiro?</p>
<p>Essas situações são muito frequentes, principalmente a primeira, com códigos fedorentos. Por isso, eu adoto uma postura: Sempre assino meus códigos.</p>
<p>O que seria assinar o código? Bem, assinar o código é aquela simples documentação que vem logo acima do arquivo, como por exemplo em Java, usando o famoso javadoc:</p>
<pre class="brush: java; title: ;">
package xpto;
import x;
/**
* @author Emerson Macedo
*/
public class Abc {
// ...
}
</pre>
<p>Assinar o código pode parecer meio arrogante mas o objetivo não é esse. O propósito de <a href="http://codificando.com/2009/01/15/os-5-niveis-do-desenvolvedor-nos-testes-automatizados/"><img class="alignright" src="http://codificando.com/wp-content/uploads/2009/02/assinando.jpg" alt="" /></a>assinar o código e se expor. Quando você assina alguma coisa, explicitamente está colocando a sua autoria naquilo, ficando sujeito tanto a críticas, quanto a elogios.</p>
<p>Quando algum pintor faz um quadro, ele sempre vem assinado em alguma parte. Dificilmente o autor dessa obra de arte vai terminar esse quadro antes que ele tenha certeza que está com ótima qualidade (pelo menos na visão dele).</p>
<p>E no que isso implica? Isso implica que você (1) vai pensar 2 vezes antes de colocar aquela habitual gambiarra no seu código, (2) vai pensar bem antes de <a href="http://codificando.com/2009/01/15/os-5-niveis-do-desenvolvedor-nos-testes-automatizados/">concluir alguma coisa sem devidos testes automatizado</a>s e (3) vai ser muito mais responsável com o código que você está desenvolvendo.</p>
<p><strong>Conclusão</strong></p>
<p>Como qualquer desenvolvedor, já desenvolvi códigos ruins em diversos projetos pelos quais passei. Aquele que nunca desenvolveu código fedorento que atire a primeira pedra. Hoje em dia, <a href="http://codificando.com/2008/09/11/codigo-do-panico/">não desprezo a qualidade daquilo que desenvolvo</a>. Acredito muito que quando assinamos nossos códigos e nos damos conta que outro desenvolvedor/programador irá utiliza-lo futuramente, isso gera um maior cuidado com a qualidade.
<p><font color="#B4B4B4" size="-2">Post Footer automatically generated by <a href="http://www.freetimefoto.com/add_post_footer_plugin_wordpress" style="color: #B4B4B4; text-decoration:underline;">Add Post Footer Plugin</a> for wordpress.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://codificando.com/2009/02/assine-seus-codigos/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Os 5 níveis do desenvolvedor nos testes automatizados</title>
		<link>http://codificando.com/2009/01/os-5-niveis-do-desenvolvedor-nos-testes-automatizados/</link>
		<comments>http://codificando.com/2009/01/os-5-niveis-do-desenvolvedor-nos-testes-automatizados/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 16:40:53 +0000</pubDate>
		<dc:creator>Emerson Macedo</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[cursos]]></category>
		<category><![CDATA[engenharia]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testes]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://codificando.com/?p=57</guid>
		<description><![CDATA[Alguns acontecimentos me fizeram refletir um pouco sobre a relação entre o desenvolvedor de software e os testes automatizados. Muitas vezes parei pra explicar pra vários colegas de trabalho sobre a importância do assunto, fiz pair-programmming pra ensinar como se &#8230; <a href="http://codificando.com/2009/01/os-5-niveis-do-desenvolvedor-nos-testes-automatizados/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Alguns acontecimentos me fizeram refletir um pouco sobre a relação entre o desenvolvedor de software e os <a href="http://pt.wikipedia.org/wiki/Testes_automatizados">testes automatizados</a>.</p>
<p>Muitas vezes parei pra explicar pra vários colegas de trabalho sobre a importância do assunto, fiz <a href="http://www.improveit.com.br/xp/praticas/programacao_par">pair-programmming</a> pra ensinar como se faz, em fim, investi muito tempo pra ajudar diversas pessoas com isso. Por incrível que pareça, tem muiiiiiita gente que ainda não entendeu muito bem. Portanto, resolvi classificar a relação entre o desenvolvedor e os <a href="http://pt.wikipedia.org/wiki/Testes_automatizados">testes automatizados</a> em 5 níveis.</p>
<p>São eles:</p>
<ol>
<li><strong>Ignorante:</strong> Esse é o nível no qual o desenvolvedor não sabe direito o que são testes automatizados ou sequer ouviu falar sobre o assunto (acredite, ainda tem gente assim em pleno 2009).</li>
<li><strong>Indiferente: </strong>Nesse nível, o desenvolvedor já sabe o que é, mas acha que essa prática/tecnica não serve pra nada. Apenas toma tempo e atrasa a entrega do produto que está sendo desenvolvido. A sensação dele é que sem os testes a entrega seria mais rápida (e a quantidade de bugs tb vão aparecer mais rápido).<img class="alignright" src="http://codificando.com/wp-content/uploads/2009/01/escada.jpg" alt="" width="275" height="201" /></li>
<li><strong>Prequiçoso</strong>: Nesse nível eu encontro muita gente. É nesse nível onde a ficha caiu mas o camarada não toma coragem pra aprender a fazer os testes automatizados. Ainda existe o medo de perder muito tempo com essa prática e a preguiça impera, impedindo o progresso.</li>
<li><strong>Decidido: </strong>Esse pra mim é o nível mais importante. É nessa hora que o desenvolvedor se dá conta que não dá mais pra desenvolver software sem testes automatizados. É nessa hora que o cara pensa: &#8220;como eu pude desenvolver sem testes até hoje?&#8221;. É nesse momento que inicia-se o aprendizado.</li>
<li><strong>Profissional: </strong>Nesse nível, o desenvolvedor já não se sente mais confortável desenvolvendo sem testes automatizados. Desenvolver sem testes o incomoda profundamente. Nesse momento o mesmo está maduro quanto a importância dos testes e a aplicação na prática. O mesmo começa a se tornar um evangelista para os demais desenvolvedores e sempre que pode, fala sobre o assunto. Nesse momento o desenvolvedor pode realmente dizer que é um profissional, pois hoje em dia não se admite mais desenvolver sem ter testes automatizados que garantam qualidade daquilo que se desenvolve.</li>
</ol>
<p><strong><em>Em qual nível você está?</em></strong>
<p><font color="#B4B4B4" size="-2">Post Footer automatically generated by <a href="http://www.freetimefoto.com/add_post_footer_plugin_wordpress" style="color: #B4B4B4; text-decoration:underline;">Add Post Footer Plugin</a> for wordpress.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://codificando.com/2009/01/os-5-niveis-do-desenvolvedor-nos-testes-automatizados/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>A maravilhosa teta chamada SOA</title>
		<link>http://codificando.com/2008/02/a-maravilhosa-teta-chamada-soa/</link>
		<comments>http://codificando.com/2008/02/a-maravilhosa-teta-chamada-soa/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 16:15:46 +0000</pubDate>
		<dc:creator>Emerson Macedo</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[engenharia]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[negocios]]></category>
		<category><![CDATA[soa]]></category>

		<guid isPermaLink="false">http://emerleite.wordpress.com/?p=7</guid>
		<description><![CDATA[Nos últimos meses, tenho ajudado a empresa onde trabalho a escolher um fornecedor para implantar SOA na casa. Infelizmente, não nos está autorizado a fazermos nós mesmos. Os fornecedores escolhidos pela empresa para nossa avaliação, são quase todos fornecedores [A-Za-z]{3}. &#8230; <a href="http://codificando.com/2008/02/a-maravilhosa-teta-chamada-soa/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nos últimos meses, tenho ajudado a empresa onde trabalho a escolher um fornecedor para implantar <a title="SOA" href="http://en.wikipedia.org/wiki/Service-oriented_architecture" target="_blank">SOA</a> na casa. Infelizmente, não nos está autorizado a fazermos nós mesmos. Os fornecedores escolhidos pela empresa para nossa avaliação, são quase todos fornecedores <a title="[A-Za-z]{3}" href="http://blog.fragmental.com.br/2007/06/07/3-letrinhas/">[A-Za-z]{3}</a>.</p>
<p>Tenho percebido de maneira geral que a maioria desses fornecedores não conhece muito do que nos tem apresentado. Uma simples pergunta sobre <a title="Message" href="http://en.wikipedia.org/wiki/Message_broker" target="_blank">Message</a> <a title="Broker" href="http://www.enterpriseintegrationpatterns.com/MessageBroker.html" target="_blank">Broker</a> e ninguém, absolutamente nenhum dos fornecedores soube responder direito. Na verdade, alguns deles confundiram com o produto <a title="Message Broker da IBM" href="http://www-306.ibm.com/software/integration/wbimessagebroker/" target="_blank">Message Broker da IBM</a> e outros com <a title="ESB" href="http://en.wikipedia.org/wiki/Enterprise_service_bus" target="_blank">ESB</a>.</p>
<p>Teve uma outra empresa, que não posso mencionar o nome por motivos óbvios, que conseguiu vender um projeto <a title="SOA" href="http://en.wikipedia.org/wiki/Service-oriented_architecture" target="_blank">SOA</a> aqui dentro, que não era nada mais que instalar um <a title="ESB" href="http://en.wikipedia.org/wiki/Enterprise_service_bus" target="_blank">ESB</a>, um servidor de processos e fazer um sisteminha de referência e só !!!! O Pior de tudo é que ganharam uma grana preta com isso.</p>
<p>O fato é que está muito difícil opinar sobre qual fornecedor a empresa deve confiar o <strong>&#8220;projeto&#8221; SOA</strong>, e o cenário atual, com a pressão vinda de cima pra baixo para implantar alguma coisa de <a title="SOA" href="http://en.wikipedia.org/wiki/Service-oriented_architecture" target="_blank">SOA</a>, só porque está na moda e sem as vezes nem entender o que é, faz como que muitos fornecedores consigam essa maravilhosa <em><strong>TETA</strong></em> pra mamar nas grandes corporações.
<p><font color="#B4B4B4" size="-2">Post Footer automatically generated by <a href="http://www.freetimefoto.com/add_post_footer_plugin_wordpress" style="color: #B4B4B4; text-decoration:underline;">Add Post Footer Plugin</a> for wordpress.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://codificando.com/2008/02/a-maravilhosa-teta-chamada-soa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

