<?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>Sobre Código</title>
	<atom:link href="http://sobrecodigo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sobrecodigo.com</link>
	<description>Desenvolvimento de Software, palestras, tutoriais e treinamentos</description>
	<lastBuildDate>Tue, 18 Jun 2013 12:00:16 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Nomenclatura de entidades (classes, métodos, variáveis) no código &#8211; o que fazer, o que não fazer, regras a seguir</title>
		<link>http://sobrecodigo.com/nomenclatura-de-entidades-classes-metodos-variaveis-no-codigo-o-que-fazer-o-que-nao-fazer-regras-a-seguir/</link>
		<comments>http://sobrecodigo.com/nomenclatura-de-entidades-classes-metodos-variaveis-no-codigo-o-que-fazer-o-que-nao-fazer-regras-a-seguir/#comments</comments>
		<pubDate>Tue, 18 Jun 2013 12:00:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[nomenclatura]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[regras]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2679</guid>
		<description><![CDATA[Continuando com o assunto de qualidade de código, um ponto que considero bastante importante é a nomenclatura de variáveis, metodos, classes, arquivos, &#8230; Isto por que os nomes servem para documentar o que aquele código faz, para que serve, o que ele esta modelando. Eu acredito que o código, escrito em qualquer linguagem, deve ser &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/nomenclatura-de-entidades-classes-metodos-variaveis-no-codigo-o-que-fazer-o-que-nao-fazer-regras-a-seguir/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Continuando com o assunto de qualidade de código, um ponto que considero bastante importante é a nomenclatura de variáveis, metodos, classes, arquivos, &#8230;</p>
<p>Isto por que os nomes servem para documentar o que aquele código faz, para que serve, o que ele esta modelando.</p>
<p>Eu acredito que o código, escrito em qualquer linguagem, deve ser legível, ou quase, em portugues ou inglês, normalmente prefiro escrever em inglês, mas isto é padrão do projeto ou preferência pessoal, o importante é a legibilidade do código.</p>
<p>Mas do que eu estou falando?</p>
<p>Pegue um exemplo de código em java:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> writeFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> fileName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #003399;">PrintWriter</span> pw <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintWriter</span><span style="color: #009900;">&#40;</span>fileName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%1$12s%2$015d%3$013d%4$50s%5$2d%6$1d%7$50s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,v1, v2, v3, v4, v5, v6, v7<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #003399;">Long</span> v8<span style="color: #339933;">=</span>0l, v9<span style="color: #339933;">=</span>0l<span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Long</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> val <span style="color: #339933;">:</span> recs<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%1$010d%2$010d%3$010d%4$010d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,val<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>, val<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>, val<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span>, val<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    v8 <span style="color: #339933;">+=</span> val<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    v9 <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%1$010d%2$010d&quot;</span>,v8, v9<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  pw.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>É difícil entender o que o código faz.<br />
Ok, é possível inferir que ele esta gravando um arquivo, baseado em algumas variáveis, com uma linha de cabeçalho, uma de rodapé e várias de detalhes, mas o código não ajuda muito a entendermos isto, pelo menos não tanto quanto o próximo exemplo.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> writeFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> fileName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #003399;">PrintWriter</span> pw <span style="color: #339933;">=</span> openFile<span style="color: #009900;">&#40;</span>fileName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  printHeader<span style="color: #009900;">&#40;</span>pw, name, cashAvailable, totalNumberOfEvents,description,code,activeFlag,address<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #003399;">Long</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> res <span style="color: #339933;">=</span> printDetails<span style="color: #009900;">&#40;</span>pw,events<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #003399;">Long</span> sumOfTransfers <span style="color: #339933;">=</span> res<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>,actualNumberOfEvents <span style="color: #339933;">=</span> res<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  printFoter<span style="color: #009900;">&#40;</span>pw,sumOfTransfers,actualNumberOfEvents<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  closeFile<span style="color: #009900;">&#40;</span>pw<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">PrintWriter</span> openFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> fileName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintWriter</span><span style="color: #009900;">&#40;</span>fileName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> printHeader<span style="color: #009900;">&#40;</span><span style="color: #003399;">PrintWriter</span> pw, <span style="color: #003399;">String</span> name, <span style="color: #003399;">Long</span> cashAvailable, <span style="color: #003399;">Long</span> totalNumberOfEvents, <span style="color: #003399;">String</span> description, <span style="color: #003399;">Integer</span> code, <span style="color: #003399;">Integer</span> activeFlag, <span style="color: #003399;">String</span> address<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%1$12s%2$015d%3$013d%4$50s%5$2d%6$1d%7$50s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,name, cashAvailable, totalNumberOfEvents,description,code,activeFlag,address<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Long</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> printDetails<span style="color: #009900;">&#40;</span><span style="color: #003399;">PrintWriter</span> pw, <span style="color: #003399;">Long</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> events<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #003399;">Long</span> sumOfTransfers<span style="color: #339933;">=</span>0l, eventCount<span style="color: #339933;">=</span>0l<span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Long</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> event <span style="color: #339933;">:</span> events<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">Long</span> valueToTransfer<span style="color: #339933;">=</span>event<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>,account<span style="color: #339933;">=</span>event<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>,bancCode<span style="color: #339933;">=</span>event<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span>, checkNumber<span style="color: #339933;">=</span>event<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%1$010d%2$010d%3$010d%4$010d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,valueToTransfer, account, bancCode, checkNumber<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    sumOfTransfers <span style="color: #339933;">+=</span> valueToTransfer<span style="color: #339933;">;</span>
    eventCount <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Long</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span>sumOfTransfers, eventCount<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> printFooter<span style="color: #009900;">&#40;</span><span style="color: #003399;">PrintWriter</span> pw, <span style="color: #003399;">Long</span> sumOfTransfers, <span style="color: #003399;">Long</span> actualNumberOfEvents<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%1$010d%2$010d&quot;</span>,sumOfTransfers,actualNumberOfEvents<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> closeFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">PrintWriter</span> pw<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  pw.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Se você tentar ler agora só o código do método writeFile da segunda versão, vai perceber como blocos pequenos de código e nomes decentes de variáveis tornam o código bastante fácil de entender.</p>
<p>Sim, eu sei que este foi um exemplo simples, mas isto vale para situações complexas também.</p>
<p>Claro que eu não sou perfeito, e nem todo o código que eu escrevo é tão legível assim, mas eu sigo algumas regras simples que valem para qualquer linguagem que eu estiver trabalhando, claro que com pequenas variações, que me ajudam a definir os nomes para as entidades no código. Coisa que já vi muita gente tendo dificuldades.</p>
<p>Regras:</p>
<ol>
<li>Nomes de métodos são verbos, que dizem o que o método faz, e não como ele faz</li>
<li>Nomes de classes e variáveis são substantivos que dizem o que aquela entidade representa, é só pensar um pouco, a classe ou variável sempre foi criada para representar um conceito, se lendo o nome você não sabe qual era o conceito, o nome esta errado</li>
<li>Um método deve realizar uma e apenas uma tarefa</li>
<li>O código de um método deve ter no máximo 10 linhas, se não for possível seguir esta regra, siga a próxima</li>
<li>Se para ler todo o corpo de um método você precisa fazer scroll na tela, ele esta grande demais, precisa de refactoring urgente</li>
<li>Uma classe deve obrigatoriamente seguir o principio da única responsabilidade, uma classe nunca deve representar mais de um conceito, nem ter métodos para realizar tarefas que não tenham a ver com este conceito primordial</li>
<li>Não sei qual o tamanho máximo para o corpo de uma classe, ou para um arquivo de código fonte, mas com certeza é muito menos de 1k linhas</li>
<li>Refatore sempre que uma parte do código não estiver seguindo qualquer um destes conceitos</li>
</ol>
<p>O que vocês acham destas regras? Alguma regra adicional? Concordam com elas? Acham que não se aplicam a algum caso? Acham um monte de besteiras? Vou ficar bastante feliz de ler comentários sobre legibilidade de código.</p>
<p>PS.: o que acham de um post sobre refactorings?</p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/nomenclatura-de-entidades-classes-metodos-variaveis-no-codigo-o-que-fazer-o-que-nao-fazer-regras-a-seguir/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Video e Exemplos da minha palestra do Just Jva 2013</title>
		<link>http://sobrecodigo.com/video-e-exemplos-da-minha-palestra-do-just-jva-2013/</link>
		<comments>http://sobrecodigo.com/video-e-exemplos-da-minha-palestra-do-just-jva-2013/#comments</comments>
		<pubDate>Fri, 14 Jun 2013 13:00:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2670</guid>
		<description><![CDATA[Bom, como alguns de vocês devem saber, eu apresentei a palestra &#8220;Java EE + JRuby + Rails – interfaces rapidas para aplicações Java EE&#8221; no Just Java 2013. Como sempre aprendo algo fazendo a palestra, nesta eu aprendi que estou meio enferrujado com este esquema de palestrar, vários pontos eu poderia ter apresentado melhor, e &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/video-e-exemplos-da-minha-palestra-do-just-jva-2013/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Bom, como alguns de vocês devem saber, eu apresentei a palestra &#8220;Java EE + JRuby + Rails – interfaces rapidas para aplicações Java EE&#8221; no Just Java 2013.<br />
Como sempre aprendo algo fazendo a palestra, nesta eu aprendi que estou meio enferrujado com este esquema de palestrar, vários pontos eu poderia ter apresentado melhor, e tenho que melhorar a programação também, passei meio rapido por alguns dos topicos por que tinha o avião marcado de volta e tinha que cuidar o horario do fim, e o final do coffee atrasou por causa dos sorteios, mas acho que mesmo assim a palestra foi legal.</p>
<p>Para quem não conseguiu ir até o evento, mas gostaria de assistir a palestra, eu gravei a apresentação e estou disponibilizando o video aqui no blog (coloquei no vimeo, se alguem quiser baixar ele para assistir offline o download esta disponível por la).</p>
<p><iframe src="http://player.vimeo.com/video/68024174" width="500" height="375" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/68024174">2013 Palestra Just Java &#8211; JRuby on Rails &#8211; Interfaces ricas para aplicações Java EE</a> from <a href="http://vimeo.com/urubatan">Rodrigo Urubatan</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Para quem quiser acessar o código das apps de exemplo, elas estão bem cruas, mas seguem os links:<br />
- <a href="https://www.dropbox.com/sh/n94zc34itlm0ixd/Kq5yxT5XaA">App Rails</a><br />
- <a href="https://www.dropbox.com/sh/1kpim17ps30oadi/_TU1DRcKbU">App Java</a></p>
<p>E os slides estão aqui no <a href="http://www.slideshare.net/urubatan/just-java-2013-java-ee-j-ruby-rails-22946842">SlideShare</a></p>
<p>Quem tiver perguntas depois de assistir o video, é só deixar a pergunta em um comentário aqui que respondo sem problemas <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/video-e-exemplos-da-minha-palestra-do-just-jva-2013/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Por que qualidade de código é importante, e por que a falta dele pode acabar com um projeto</title>
		<link>http://sobrecodigo.com/por-que-qualidade-de-codigo-e-importante-e-por-que-a-falta-dele-pode-acabar-com-um-projeto/</link>
		<comments>http://sobrecodigo.com/por-que-qualidade-de-codigo-e-importante-e-por-que-a-falta-dele-pode-acabar-com-um-projeto/#comments</comments>
		<pubDate>Fri, 14 Jun 2013 01:25:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2676</guid>
		<description><![CDATA[Eu já participei de mais de um projeto que em algum momento se perdia a capacidade de dizer quanto tempo se levaria para fazer qualquer alteração, normalmente por que uma alteração em qualquer lugar refletia em todos os outros pontos aleatórios do sistema. Também já participei de projetos em que se olhando para o nome &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/por-que-qualidade-de-codigo-e-importante-e-por-que-a-falta-dele-pode-acabar-com-um-projeto/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Eu já participei de mais de um projeto que em algum momento se perdia a capacidade de dizer quanto tempo se levaria para fazer qualquer alteração, normalmente por que uma alteração em qualquer lugar refletia em todos os outros pontos aleatórios do sistema.<br />
Também já participei de projetos em que se olhando para o nome de uma classe, de um método, de uma tabela não se fazia idéia de para que aquilo servia, o nome não dava pista nenhuma de para que o objeto era usado.<br />
Muitas vezes um projeto tinha os dois problemas ao mesmo tempo.<br />
Outros projetos que participei utilizavam soluções &#8220;mágicas&#8221; para resolver todos os problemas, e rápidamente não se sabia mais o que tinha causado algum efeito no código, se era o próprio código ou alguma das mágicas aplicadas nele.</p>
<p>Acredito que muitos de vocês já passaram por estes problemas também, normalmente chamamos isto de código legado, mas vou dizer algo que muitos não vão gostar de ouvir, muitos destes projetos, eu ou algum dos outros desenvolvedores que estavam ali ainda, participou desde o inicio, ajudamos a definir os padrões, a definir a arquitetura, e pouco tempo depois passamos a ignorar os padrões que nós mesmos haviamos definido.</p>
<p>Mas o que causou isto? o que fez este código deteriorar desta forma? Acho que muitos responderiam algum ou alguns dos seguintes itens:</p>
<ul>
<li>Prazos apertados</li>
<li>Pressão do cliente</li>
<li>Já estava assim</li>
<li>Ninguem seguia os padrões eu também não vou seguir</li>
<li>Vou fazer isto desta forma e depois volto para arrumar, mesmo sabendo que isto não iria acontecer</li>
<li>Vai ser mais rapido fazer deste jeito mesmo, a qualidade do código aqui não vai fazer diferença</li>
<li>Outra opção qualquer</li>
</ul>
<p>Mas pelo menos nas situações em que eu vivi, estas afirmações não eram validas, vou comentar algumas delas, e normalmente os culpados por criar o código feio, dificil de manter, dificil de lêr, eram os próprios desenvolvedores (claro, eu incluido).</p>
<p>Pressão do cliente e prazos apertados não são razões válidas para código ruim, por que o código ruim vai fazer com que tudo demore mais e vai piorar o negócio do cliente, não entregando um produto de qualidade.</p>
<p>Já estava assim é uma desculpa preguiçosa de quem não se importa com a qualidade do seu próprio trabalho, se já estava assim, tente arrumar, reclame com alguem que pode arrumar, ou pelo menos tente descobrir por que estava assim. E mesmo assim, isto não é disculpa para que o código novo que você esta escrevendo siga ruim, o novo pedacinho pode ser melhor do que o espaguete que você encontrou.</p>
<p>Se ninguem estava seguindo os padrões, também não seguir aumenta o problema, o ideal seria falar com a equipe, com algum gerente, lider tecnico, organizar code reviews e mostrar por que aqueles padrões eram importantes. Se ninguem concorda com os padrões definidos, que eles sejam alterados, mas é importante ter padrões.</p>
<p>E por último, pensar que fazer de qualquer jeito vai ser mais rapido é uma armadilha que quase todos já caímos, o problema de codigo ruim é que ele deve vir acompanhado de mais bugs, e vai ser mais difícil de debugar, e de corrigir, ou seja, no final, vai levar mais tempo para entregar a feature para o cliente.</p>
<p>Até aqui acho que todos devem concordar, mesmo não gostando muito, mas agora, o ponto que vai ter mais discussão, inclusive vou dividir o assunto em outros posts, o que é código ruim e o que é código bom?</p>
<p>O &#8220;Uncle Bob&#8221; tem uma definição interessante, que eu concordo e acho que a maioria vai concordar: a qualidade do código pode ser medida pela quantidade de WTF ouvida durante uma sessão de code review.<br />
(WTF &#8211; What the Fuck &#8211; que merda é esta &#8211; o que esta merda faz &#8211; que porcaria é esta &#8211; &#8230;)</p>
<p>Sei que isto é bastante subjetivo e vai variar do quão dormentes estão os membros da equipe, mas já é uma boa definição para começar.</p>
<p>Eu adicionaria mais alguns itens para considerar um código bom, sendo o principal dele a legibilidade.<br />
O que é legibilidade? Simples, é a qualidade que permite que quando você ler o nome de um método, classe, arquivo, &#8230;<br />
Você saiba para que ele serve, o que ele faz.<br />
E quando você ler o corpo de um bloco de código, você vai entender e exatamente para que ele serve, o que ele faz.<br />
&#8211; Ahh, mas existem comentários para isto!<br />
Errado!<br />
Comentários existem e são muito bons para que você documente por que fez algo, qual foi a origem do requisito. Se você esta comentando o que o código faz, já é um sinal de que o código deve ser um lixo.</p>
<p>A performance do código tem que ser boa também, e isto é uma outra medida bastante subjetiva.</p>
<p>É necessário também seguir os padrões de codigo da linguagem sendo usada, não adiante o código java parecer ruby, ou o código c++ parecer java, ou o código python parecer código ruby.<br />
Cada linguagem tem um padrão, e normalmente as construções da linguagem funcionam melhor se aquele padrão é seguido, isto vai trazer código mais limpo.</p>
<p>Alem disto gosto de adicionar algumas regrinhas simples para ajudar na legibilidade, seguir alguns principios, mas vou falar disto em um próximo post.</p>
<p>Alguem tem outra opinião sobre este assunto? Alguem tem algum comentário complementar? Todos os comentários são bem vindos <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/por-que-qualidade-de-codigo-e-importante-e-por-que-a-falta-dele-pode-acabar-com-um-projeto/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Just Java 2013 &#8211; Vamos falar de Java EE e Rails trabalhando juntos!</title>
		<link>http://sobrecodigo.com/just-java-2003-vamos-falar-de-java-ee-e-rails-trabalhando-juntos/</link>
		<comments>http://sobrecodigo.com/just-java-2003-vamos-falar-de-java-ee-e-rails-trabalhando-juntos/#comments</comments>
		<pubDate>Fri, 31 May 2013 13:47:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Java EE]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2662</guid>
		<description><![CDATA[Bom, como a maioria já deve estar sabendo, no final da próxima semana vai acontecer o Just Java 2013, o evento vai acontecer nos dias 7 e 8 de junho. no SENAC – CAMPUS SANTO AMARO, Avenida Engenheiro Eusébio Stevaux, 823 &#8211; São Paulo – SP. Quem quiser dar uma olhada na grade, pode clicar &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/just-java-2003-vamos-falar-de-java-ee-e-rails-trabalhando-juntos/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p><center><a href="http://soujava.org.br/justjava-2013/" border="0"><img src="http://sobrecodigo.com/wp-content/uploads/2013/05/just.jpg" alt="Just Java 2013" border="0"/></a></center></p>
<p>Bom, como a maioria já deve estar sabendo, no final da próxima semana vai acontecer o <a href="http://soujava.org.br/justjava-2013/">Just Java 2013</a>, o evento vai acontecer nos dias 7 e 8 de junho. no SENAC – CAMPUS SANTO AMARO, Avenida Engenheiro Eusébio Stevaux, 823 &#8211; São Paulo – SP.</p>
<p>Quem quiser dar uma olhada na grade, pode <a href="http://goo.gl/npvBp">clicar aqui</a>.</p>
<p>O Just Java é, acredito, o maior evento independente sobre java do Brasil, é organizado pelo SouJava, um dos mais antigos grupos de usuário do brasil, e um dos mais ativos com certeza.</p>
<p>Participo do evento desde 2002 (se não me engano foi o primeiro que participei), já palestrei em várias edições, e acho que só não fui nos últimos 3.</p>
<p>Este ano vou apresentar a palestra &#8220;Java EE + JRuby + Rails &#8211; interfaces rapidas para aplicações Java EE&#8221;, que acho que vai ser bastante útil, farei o máximo para ser divertida, alem de apresentar diversas situações que passei em alguns projetos.</p>
<p>Se quiser se adiantar um pouco e aprender um pouco sobre Rails antes do Just Java, podem <a href="http://www.novatec.com.br/livros/rubyonrails2/">comprar meu livro na Novatec</a> <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Falando em <a href="http://www.novatec.com.br/" border="0"><img src="http://www.novatec.com.br/figuras/logo_novatec.gif" alt="Novatec editora" border="0" style="display:inline;"/></a>, gostaria de agradecer a eles por patrocinar a minha ida ao evento!<br />
Para se adiantar um pouco, o que acham de <a href="http://www.novatec.com.br/busca.php?palavra=java">ler alguns livros sobre Java</a>?</p>
<p>E por último, o que estão esperando para<a href="http://goo.gl/kjQdn"> se inscrever no Just Java 2013</a>? Daqui a pouco as vagas acabam.</p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/just-java-2003-vamos-falar-de-java-ee-e-rails-trabalhando-juntos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Curso online (Hangout) de BDD com cucumber &#8211; melhorando a comunicação e automatizando os testes de software</title>
		<link>http://sobrecodigo.com/curso-online-hangout-de-bdd-com-cucumber-melhorando-a-comunicacao-e-automatizando-os-testes-de-software/</link>
		<comments>http://sobrecodigo.com/curso-online-hangout-de-bdd-com-cucumber-melhorando-a-comunicacao-e-automatizando-os-testes-de-software/#comments</comments>
		<pubDate>Mon, 27 May 2013 17:00:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cursos]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[hangout]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2654</guid>
		<description><![CDATA[Como alguns devem ter ouvido falar, estou escrevendo um livro sobre BDD, o cucumber não vai ser a única ferramenta usada no livro, mas é uma das principais, até por ser gratuitas, e por eu gostar bastante de Ruby. Escrevendo o livro, tive a idéia de fazer este curso online, vão ter vagas limitadas, vou &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/curso-online-hangout-de-bdd-com-cucumber-melhorando-a-comunicacao-e-automatizando-os-testes-de-software/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Como alguns devem ter ouvido falar, estou escrevendo um livro sobre BDD, o cucumber não vai ser a única ferramenta usada no livro, mas é uma das principais, até por ser gratuitas, e por eu gostar bastante de Ruby.</p>
<p>Escrevendo o livro, tive a idéia de fazer este curso online, vão ter vagas limitadas, vou usar o Hangout pela possibilidade de vídeo conferência e compartilhamento de telas, fiz alguns testes e a ferramenta pareceu atender bem o que passei para o curso.</p>
<p><strong>O conteúdo do curso vai ser o seguinte:</strong></p>
<ul>
<li>Aula 1
<ul>
<li>O que é BDD</li>
<li>Como começar a aplicar na empresa ou nos projetos particulares</li>
<li>Introdução à Domain Driven Design</li>
<li>Introduzindo uma linguagem Ubiqua para negócio, análise, desenvolvimento e testes</li>
<li>Como escrever testes usando a linguagem gherkin</li>
<li>Como tornar testes escritos em linguagem natural  executaveis</li>
</ul>
</li>
<li>Aula 2
<ul>
<li><em id="__mceDel">Usando cucumber para testar aplicações rails</em></li>
<li><em id="__mceDel">Usando drivers para teste de Ajax</em></li>
<li><em id="__mceDel">Testando bibliotecas ruby</em></li>
</ul>
</li>
<li>Aula 3
<ul>
<li>Cucumber e JRuby para testar bibliotecas Java</li>
<li>Cucumber e IronRuby para testar bibliotecas .NET</li>
</ul>
</li>
<li>Aula 4
<ul>
<li>Melhorando os relatórios, formatadores de saida</li>
<li>Usando tags para filtra testes</li>
<li>Executando apenas os testes com falha</li>
<li>Ganchos de execução</li>
</ul>
</li>
</ul>
<p>Serão apenas 10 alunos, já que vou fazer o curso via Hangout, e também para dar atenção a todos como se estivessemos em uma sala de aulas, mas cada um vai estar no conforto do lugar que escolher.</p>
<p>Quem fizer o curso vai ganhar apostila em PDF, acesso ao código dos exemplos via um repositório git, um video com a gravação de cada uma das 4 aulas, e se quiser tem a opção de comprar uma copia do meu livro de Rails com 50% de desconto.</p>
<p>Cada uma das aulas deve ter entre 3 e 4 horas, e as aulas acontecerão sempre quinta feira a noite, começando as 19h.</p>
<p>Se o assunto se prolongar mais do que 4 horas, os participantes decidem se continuamos a aula ou se fazemos uma aula extra sobre algum assunto especifico.</p>
<p><strong>Publico Alvo:</strong></p>
<p>O curso foi feito pensando em desenvolvedores, e ou testadores que queiram ter um conhecimento sobre todo o fluxo e todos os requisitos da aplicação. A primeira aula também vai ser extremamente útil para gerentes de projetos, analistas de negocios, alem de ser extremamente útil para product owners. As aulas seguintes incluem bastante desenvolvimento, e serão mais bem aproveitadas por quem tenha algum conhecimento de desenvolvimento. O Ruby vai ser usado como linguagem principal, mas conhecimento em qualquer linguagem de programação vai ser o suficiente, uma das apostilas vai conter uma introdução a linguagem Ruby, que vai ser o suficiente para entender bem todos os exemplos do curso.</p>
<p><strong>Pre requisitos:</strong></p>
<p>Para aproveitar bem o curso e importante conhecer bem alguma linguagem de programação, não é necessário conhecer previamente Ruby, é importante também ter uma noção de como definir regras de negócios de uma aplicação, e ter coragem e vontade de querer implantar uma linguagem única em todo o processo de desenvolvimento, da coleta de requisitos ao desenvolvimento.</p>
<p>&nbsp;</p>
<p><strong>Investimento:</strong></p>
<p>O pagamento vai ser feito via paypal ou deposito, como esta é uma primeira experiência, não vou ter um sistema especifico para gerenciar as inscrições, então as inscrições serão feitas enviando um email para <a href="mailto:cursobdd@urubatan.com.br?subject=Inscrição no curso">cursobdd@urubatan.com.br</a>, enviem o email informando se querem pagar via paypal ou deposito.</p>
<p>O valor do curso vai ser de R$400.</p>
<p>Se quiser comprar o livro com 50% de desconto, basta adicionar R$34,50 no valor da inscrição e o frete (gratuito via PAC, se preferir sedex enviar email para verificar o preço).</p>
<p><strong>Datas do curso:</strong></p>
<p>A previsão inicial é que o curso aconteça nos dias: 13/06, 20/06, 27/06 e 04/07, qualquer alteração os incritos serão visados e consultados.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/curso-online-hangout-de-bdd-com-cucumber-melhorando-a-comunicacao-e-automatizando-os-testes-de-software/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Como usar VRaptor em um servidor Weblogic 12c</title>
		<link>http://sobrecodigo.com/como-usar-vraptor-em-um-servidor-weblogic-12c/</link>
		<comments>http://sobrecodigo.com/como-usar-vraptor-em-um-servidor-weblogic-12c/#comments</comments>
		<pubDate>Mon, 06 May 2013 10:00:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[classloader]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[vraptor]]></category>
		<category><![CDATA[weblogic]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2646</guid>
		<description><![CDATA[Em um projeto atual estava trabalhando com o VRaptor e precisei fazer deploy da aplicação em um Oracle Weblogic 12c, muitos erros apareceram e algumas coisas meio malucas, tipo dizer que um método não existia em uma classe do guice. O fix para isto é bastante simples, basta adicionar dentro do diretório WEB-INF da aplicação &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/como-usar-vraptor-em-um-servidor-weblogic-12c/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Em um projeto atual estava trabalhando com o VRaptor e precisei fazer deploy da aplicação em um Oracle Weblogic 12c, muitos erros apareceram e algumas coisas meio malucas, tipo dizer que um método não existia em uma classe do guice.</p>
<p>O fix para isto é bastante simples, basta adicionar dentro do diretório WEB-INF da aplicação web, um arquivo de nome weblogic.xml com o seguinte conteúdo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:weblogic-web-app</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:wls</span>=<span style="color: #ff0000;">&quot;http://xmlns.oracle.com/weblogic/weblogic-web-app&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:weblogic-version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>12.1.1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:weblogic-version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:context-root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>seu_contexto<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:context-root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:container-descriptor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wls:prefer-web-inf-classes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:prefer-web-inf-classes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:container-descriptor<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wls:weblogic-web-app<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>E pronto, depois disto a aplicação vai carregar no WL12c sem problemas <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>A magica é feita pela tag <b>prefer-web-inf-classes</b>, que faz o WL carregar as classes do WEB-INF/lib em vez de carregar a versão mais velha que veio junto com o weblogic.</p>
<p>O próximo warning foi do SL4J, para resolver o warning de multiplos bindings, simplesmente removi o pacote do SL4J do WEB-INF/lib e tudo passou a funcionar, depois de um restart do servidor, por que neste momento conflito de classloader era o que eu mais tinha <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/como-usar-vraptor-em-um-servidor-weblogic-12c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Só cucumber sem frescura, na verdade sem bibliotecas</title>
		<link>http://sobrecodigo.com/so-cucumber-sem-frescura-na-verdade-sem-bibliotecas/</link>
		<comments>http://sobrecodigo.com/so-cucumber-sem-frescura-na-verdade-sem-bibliotecas/#comments</comments>
		<pubDate>Fri, 03 May 2013 16:00:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[gherkin]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2639</guid>
		<description><![CDATA[Vejo bastante gente achando que cucumber é muito mais do que ele é de verdade, o cucumber é algo bem simples, a única coisa que ele faz é pegar um texto escrito utilizando gherkin (uma linguagem utilizada por diversas ferramentas BDD) e mapear par métodos Ruby utilizando expressões regulares para passar parâmetros. Ok, e aquela &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/so-cucumber-sem-frescura-na-verdade-sem-bibliotecas/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p><center><img src="http://cukes.info/images/cuke_logo.png"/></center><br />
Vejo bastante gente achando que cucumber é muito mais do que ele é de verdade, o cucumber é algo bem simples, a única coisa que ele faz é pegar um texto escrito utilizando gherkin (uma linguagem utilizada por diversas ferramentas BDD) e mapear par métodos Ruby utilizando expressões regulares para passar parâmetros.</p>
<p>Ok, e aquela coisa toda sobre automação de browser, &#8230;</p>
<p>Aquilo é feito por outras bibliotecas Ruby, que podem ser utilizadas em conjunto com o cucumber.</p>
<p>Ahh, beleza, quer um exemplo?</p>
<p>O cucumber, lê o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="gherkin" style="font-family:monospace;">#language: pt
Funcionalidade: Visualização de progresso atual de um projeto
	Como um cliente do projeto
	Eu quero visualizar o progresso das funcionalidades que solicitei
	Para que eu possa saber quando elas estarão disponiveis para uso
&nbsp;
	Contexto:
		Dado que existem os seguintes projetos cadastrados:
			|nome         |Descricao           |
			|Projeto 3    |Outro projeto       |
			|Projeto 4    |Outro projeto       |
		E que existem os seguintes usuários cadastrados:
			|login      |nick         |
			|jose       |José Silva   |
		E que os usuários fazem parte da equipe dos projetos:
			|login      |projeto       |
			|jose       |Projeto 3     |
			|jose       |Projeto 4     |
&nbsp;
	Esquema do Cenário: visualização de progresso em uma tarefa
		Dado que estou na página de dealhes do projeto &quot;&lt;projeto&gt;&quot;
		E que o usuário &quot;&lt;usuario&gt;&quot; reportou progresso &quot;&lt;progresso1&gt;&quot; na tarefa &quot;&lt;tarefa1&gt;&quot;
		E que o usuário &quot;&lt;usuario&gt;&quot; reportou progresso &quot;&lt;progresso2&gt;&quot; na tarefa &quot;&lt;tarefa2&gt;&quot;
		Quando eu clico em &quot;Ver progresso&quot;
		Então devo ver &quot;Progresso Atual&quot; igual a &quot;&lt;progresso&gt;&quot;
&nbsp;
	Cenários:
		|usuario    |projeto    |progresso1|tarefa1|progresso2|tarefa2|progresso|
		|jose       |Projeto 3  |30        |task1  |100       |task2  |65       |
		|jose       |Projeto 4  |60        |task1  |80        |task2  |70       |</pre></td></tr></table></div>

<p>E mapeia para o seguinte código ruby:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#encoding: utf-8</span>
&nbsp;
Dado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^que existem os seguintes projetos cadastrados:$<span style="color:#006600; font-weight:bold;">/</span><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>table<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#008000; font-style:italic;"># table is a Cucumber::Ast::Table</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>
&nbsp;
Dado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^que existem os seguintes usuários cadastrados:$<span style="color:#006600; font-weight:bold;">/</span><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>table<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#008000; font-style:italic;"># table is a Cucumber::Ast::Table</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>
&nbsp;
Dado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^que os usuários fazem parte da equipe dos projetos:$<span style="color:#006600; font-weight:bold;">/</span><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>table<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#008000; font-style:italic;"># table is a Cucumber::Ast::Table</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>
&nbsp;
Dado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^que estou na <span style="color:#CC0066; font-weight:bold;">p</span>ágina de dealhes <span style="color:#9966CC; font-weight:bold;">do</span> projeto <span style="color:#996600;">&quot;(.*?)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span><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>arg1<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>
&nbsp;
Dado<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^que o usuário <span style="color:#996600;">&quot;(.*?)&quot;</span> reportou progresso <span style="color:#996600;">&quot;(.*?)&quot;</span> na tarefa <span style="color:#996600;">&quot;(.*?)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span><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>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>
&nbsp;
Quando<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^eu clico em <span style="color:#996600;">&quot;(.*?)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span><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>arg1<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>
&nbsp;
Então<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^devo ver <span style="color:#996600;">&quot;(.*?)&quot;</span> igual a <span style="color:#996600;">&quot;(.*?)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span><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>arg1, arg2<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></td></tr></table></div>

<p>E apenas isto, fora isto, o cucumber não faz mais nada (ok, tem mais alguns recursos legais, mas nada relacionado diretamente com a interpretação de textos).</p>
<p>E de quebra, este bloco de texto mostra uma funcionalidade escrita em portugues, que inclui quase todos os recursos do gherkin implementados pelo cucumber <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Bom, se tiverem comentários sobre uso do cucumber, ou sobre este post, por favor postem nos comentários, ou perguntem diretamente pelo twitter ou facebook, acho que o blog vai identificar qualquer uma das formas de comentário <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/so-cucumber-sem-frescura-na-verdade-sem-bibliotecas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica de SQL: Nunca, em hipótese alguma, use parallel via trigger de logon no oracle</title>
		<link>http://sobrecodigo.com/dica-de-sql-nunca-em-hipotese-alguma-use-parallel-via-trigger-de-logon-no-oracle/</link>
		<comments>http://sobrecodigo.com/dica-de-sql-nunca-em-hipotese-alguma-use-parallel-via-trigger-de-logon-no-oracle/#comments</comments>
		<pubDate>Wed, 24 Apr 2013 20:45:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Dia a Dia]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[problema]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://sobrecodigo.com/?p=2632</guid>
		<description><![CDATA[Alguem pode ter a idéia de habilitar queries paralelas via uma trigger de logon no oracle, mas se alguem te sugerir isto, depois de bater na pessoa, diga educadamente que você prefere que o resto da aplicação continue funcionando. Por que eu digo isto? Um exemplo simples: 1 2 DELETE FROM tabela WHERE id=345; SELECT &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/dica-de-sql-nunca-em-hipotese-alguma-use-parallel-via-trigger-de-logon-no-oracle/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://sobrecodigo.com/wp-content/uploads/2013/04/parallel.jpg"><img class="aligncenter size-full wp-image-2633" alt="Oracle Parallel" src="http://sobrecodigo.com/wp-content/uploads/2013/04/parallel.jpg" width="259" height="194" /></a></p>
<p>Alguem pode ter a idéia de habilitar queries paralelas via uma trigger de logon no oracle, mas se alguem te sugerir isto, depois de bater na pessoa, diga educadamente que você prefere que o resto da aplicação continue funcionando.</p>
<p>Por que eu digo isto?</p>
<p>Um exemplo simples:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabela <span style="color: #993333; font-weight: bold;">WHERE</span> id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">345</span>;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">COUNT</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabela;</pre></td></tr></table></div>

<p>Funciona perfeitamente!</p>
<p>Agora habilite as queries paralelas, e o select count só vai funcionar depois de um commit;</p>
<p>Se tentar fazer um delete muito grande com a trigger de parallel habilitada também vai ter problemas, começara a ver a seguinte mensagem de erro:</p>
<blockquote><p>
ERROR at line 1:<br />
ORA-12801: error signaled in parallel query server P117, instance<br />
xxx802:user2 (2)<br />
ORA-00060: deadlock detected while waiting for resource
</p></blockquote>
<p>Se estiver tentando fazer a operação de delete via DBLINK fica ainda mais divertido, a mensagem de erro é:</p>
<blockquote><p>
ERROR at line 1: ORA-20000: # Erro na cópia dos dados:ORA-02049: timeout: distributed<br />
transaction waiting for lock<br />
ORA-02063: preceding line from DBL_NOME<br />
ORA-06512: at &#8220;SCHEMA.PROCEDURE&#8221;, line 34
</p></blockquote>
<p>E como resolver tudo isto e faze a sua applicação voltar a funcionar?</p>
<p>É só dropar a trigger de logon que fazia as consultas rodarem de forma paralela no oracle!</p>
<p>Ou seja, depois de bater na pessoa que sugerir esta trigger de logon, explique educadamente por que ela esta apanhando, para que ela evite apanhar de outra pessoa menos educada que você.</p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/dica-de-sql-nunca-em-hipotese-alguma-use-parallel-via-trigger-de-logon-no-oracle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Um padrão de código para qualquer linguagem OO, sugestão e como melhorar?</title>
		<link>http://sobrecodigo.com/um-padrao-de-codigo-para-qualquer-linguagem-oo-sugestao-e-como-melhorar/</link>
		<comments>http://sobrecodigo.com/um-padrao-de-codigo-para-qualquer-linguagem-oo-sugestao-e-como-melhorar/#comments</comments>
		<pubDate>Tue, 26 Mar 2013 21:33:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Dia a Dia]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[pesquisa]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=2625</guid>
		<description><![CDATA[Em uma situação no trabalho, decidi que seria interessante ter algumas regras básicas de como escrever código legível, seguindo aquele padrão: Escreva seu código como se quem vai dar manutenção nele fosse um maniaco homicida que sabe seu endereço E como utilizamos mais de uma linguagem no projeto, achei que seria possível definir regras básicas &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/um-padrao-de-codigo-para-qualquer-linguagem-oo-sugestao-e-como-melhorar/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Em uma situação no trabalho, decidi que seria interessante ter algumas regras básicas de como escrever código legível, seguindo aquele padrão:</p>
<blockquote><p>
  Escreva seu código como se quem vai dar manutenção nele fosse um maniaco homicida que sabe seu endereço
</p></blockquote>
<p>E como utilizamos mais de uma linguagem no projeto, achei que seria possível definir regras básicas para todas as linguagens (depois criar itens especificos de cada uma), e a lista de itens genéricos que me veio a cabeça foi esta listinha abaixo:</p>
<ul>
<li>Nomes de classes:
<ul>
<li>      1. devem usar CamelCase</li>
<li>      2. Devem dizer claramente o que a classe representa</li>
<li>      3. De preferência devem ser um substantivo, um objeto, com o nome facilmente mapeável para uma entidade de negocio no domínio da aplicação</li>
<li>Nomes de métodos:
<ul>
<li>1. Devem ser um verbo, que faça sentido dentro do dominio da classe onde ele se encontra ou no máximo seja um verbo auxiliar válido para uma das ações válidas da classe</li>
<li>2. Seguem o padrão da linguagem:</li>
<ul>
<li>java camelCase</li>
<li>python/ruby snake_case</li>
</ul>
</ul>
</li>
<li>3. De preferência não tenham mais de 10 linhas de código, exceções avaliadas independentemente
<ul>
<li>Caso o método tenha mais de 10 linhas, avaliar refatorar parte do código em um método auxiliar</li>
</ul>
</li>
</ul>
</li>
<li>Nomes de variáveis:
<ul>
<li>Seguem o padrão da linguagem:
<ul>
<li>java camelCase</li>
<li>python/ruby snake_case</li>
</ul>
</li>
<li>O nome deve indicar o que a variável representa, sem prefixos indicando o tipo
<ul>
<li>notação hungara só é aceitável em linguagens que usam explicitamente este padrão nas bibliotecas core</li>
</ul>
</li>
<li>Variáveis indexadoras (i, j, k, idx, &#8230;) são exceção a estas regras de nomenclatura</li>
</ul>
</li>
</ul>
<p>O que vocês acham destes itens, e tem alguma sugestão de melhora deste padrão genérico? a idéia é ter código fácil de ler e entender independente da plataforma/linguagem, e ter um padrão que profissionais de diversas senioridades possam seguir.</p>
<p>Agradeço quaisquer comentários!</p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/um-padrao-de-codigo-para-qualquer-linguagem-oo-sugestao-e-como-melhorar/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Domain Driven Design &#8211; Um rascunho de artigo</title>
		<link>http://sobrecodigo.com/domain-driven-design-um-rascunho-de-artigo/</link>
		<comments>http://sobrecodigo.com/domain-driven-design-um-rascunho-de-artigo/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 03:37:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Trabalho]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[livro2]]></category>

		<guid isPermaLink="false">http://www.urubatan.com.br/?p=2621</guid>
		<description><![CDATA[Escrevendo um pouco sobre BDD, comecei um rascunho de artigo sobre doman driven design, claro que vou elaborar mais ainda, mas acho que a versão inicial ficou decente, e como o livro de BDD ainda vai demorar bastante, vou postando alguns artigos e tutoriais por aqui de vez en quando Mas como eu disse, é &#8230; </p><p><a class="more-link block-button" href="http://sobrecodigo.com/domain-driven-design-um-rascunho-de-artigo/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Escrevendo um pouco sobre BDD, comecei um rascunho de artigo sobre doman driven design, claro que vou elaborar mais ainda, mas acho que a versão inicial ficou decente, e como o livro de BDD ainda vai demorar bastante, vou postando alguns artigos e tutoriais por aqui de vez en quando <img src='http://sobrecodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Mas como eu disse, é um rascunho, agradeço quaisquer comentários sobre coisas a melhorar, coisas que eu possa ter interpretado errado e qualquer coisa que vocês acharem que precisa de correção neste texto.</p>
<p>Sem mais delongas &#8230;</p>
<h2>Domain Driven Design (DDD)</h2>
<p>Domain Driven Design, ou design guiado pelo dominio do negocio, é um conjunto de boas praticas e regras, que definem que todos os artefatos gerados durante o desenvolvimento, devem ter a mesma nomenclatura utilizada para definir o dominio do negócio.</p>
<p>Para tornar o DDD possível, é necessário definir um dicionário de negócio com as palavras e conceitos principais ordenados de forma hierarquica, isto vai tornar bem mais fácil escolher nomes e decidir quais as propriedades de um artefato qualquer a ser criado.</p>
<p>Isto também elimina a necessidade de se criar padrões complexos de nomes para objetos, já que o nome para um artefato qualquer deve ser uma das palavras do dicionário de negócio, isto vai facilitar bastante quando um desenvolvedor for perguntar ou explicar algo para um cliente, por exemplo, imagine o seguinte dialogo:</p>
<ul>
<li>Cliente: pode por favor me explicar qual problema esta ocorrendo no cadastro de clientes?</li>
<li>Desenvolvedor: o problema é que o entity manager esta retornando um erro InvalidValueException quando chamo o metodo persist passando um objeto do tipo EntityCliData</li>
<li>Cliente: entity o que? o que é persist?</li>
</ul>
<p>Agora imagine a mesma conversa com estas palavras:</p>
<ul>
<li>Cliente: pode por favor me explicar qual problema esta ocorrendo no cadastro de clientes?</li>
<li>Desenvolvedor: o problema parece ser na implementação do método cadastrar da classe Cliente que esta retornando um erro de parâmetro inválido.</li>
<li>Cliente: a, obrigado, o erro informa qual parâmetro esta com problemas?</li>
</ul>
<p>Ou seja, utilizando as mesmas terminologias, é bem mais fácil a comunicação, claro que isto também altera a forma de implementar algumas coisas, mas o esforço é minimo perto dos beneficios que isto vai trazer para o projeto.</p>
<p>O termo &#8220;Domain Driven Design&#8221; foi usado pela primeira vez por Eric Evans no livro de mesmo nome escrito por ele. Segundo este livro, a abordagem possui 3 pilares básicos:</p>
<ol>
<li>Colocar o foco primário do projeto no dominio central da aplicação e na lógica do dominio</li>
<li>Basear designs complexos em um modelo do dominio</li>
<li>Iniciar uma interação colaborativa entre pessoas técnicas e especialistas do dominio para interativamente refinar um modelo conceitual que enderece problemas especificos do dominio da aplicação.</li>
</ol>
<h3>Definições básicas</h3>
<ul>
<li>Dominio: é um dominio de conhecimento, influencia ou atividade. O assunto no qual o usuário usa o programa é o dominio da aplicação.</li>
<li>Modelo: Um sistema de abstrações que descreve aspectos selecionados de um dominio e pode ser utilizado para resolver problemas naquele dominio.</li>
<li>Linguagem Ubiqua: Uma linguagem estruturada a volta do dominio e utilizada por todos os membros da equipe para conectar todas as atividades relacionadas ao desenvolvimento de software.</li>
<li>Contexto: a situação em que uma palavra aparece que define o significado da mesma.</li>
</ul>
<h3>Blocos básicos do DDD</h3>
<ul>
<li>Entity &#8211; objetos com dados e significado de negócio</li>
<li>Value Object &#8211; objetos com dados mas sem sifnificado proprio para o negocio</li>
<li>Aggregate &#8211; uma coleção de objetos unidos por uma raiz comum, esta raiz comum é responsável por garantir a integridade dos objetos agregados.</li>
<li>Service &#8211; Quando uma operação conceitualmente não pertence a nenhum objeto, esta pode ser modelada como um serviço.</li>
<li>Repository &#8211; metodos para buscar objetos devem ser delegados para um repositório especializado</li>
<li>Factory &#8211; métodos para criar objetos devem ser delegados para fabricas especializadas</li>
</ul>
<p>Com estes blocos básicos, a maior parte dos sistemas DDD podem ser implementados sem maiores problemas.</p>
<p>O objetivo principal é tornar a linguagem utilizada pelo negocio para definir o dominio do problema, ubiqua dentro de todo o projeto, utilizando a mesma linguagem na analise de negocio, na documentação da aplicação e no código da aplicação, facilitando assim a comunicação e o entendimento, e o melhor de tudo, diminuindo bastante a probabilidade de ser implementado algo diferente do que foi solicitado.</p>
]]></content:encoded>
			<wfw:commentRss>http://sobrecodigo.com/domain-driven-design-um-rascunho-de-artigo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
