<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>boa-pratica &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/boa-pratica/</link>
	<description>Feed of posts on WordPress.com tagged "boa-pratica"</description>
	<pubDate>Sun, 12 Oct 2008 08:06:35 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Namespace (.NET) e Package (Java)]]></title>
<link>http://marceloneias.wordpress.com/?p=26</link>
<pubDate>Tue, 29 Jul 2008 05:00:00 +0000</pubDate>
<dc:creator>marceloneias</dc:creator>
<guid>http://marceloneias.pt-br.wordpress.com/2008/07/29/namespace-net-e-package-java/</guid>
<description><![CDATA[À medida que um programa cresce, temos alguns problemas como por exemplo: muito código é mais dif]]></description>
<content:encoded><![CDATA[<p>À medida que um programa cresce, temos alguns problemas como por exemplo: muito código é mais difícil de entender e manter; mais código normalmente significa mais nomes, mais dados nomeados, mais métodos nomeados e mais classes nomeadas. à medida que o número de nomes aumenta, aumentam também as chances da compilação do projeto falhar porque dois ou mais nomes estão em conflito.</p>
<p>Antigamente, os programadores tentavam resolver o conflito pré-fixando os nomes com algum tipo de qualificador. Essa solução não é boa porque não é escalável, os nomes tornam-se maiores e você gasta menos tempo escrevendo o software e mais tempo digitando e lendo e relendo nomes longos e incompreensíveis.</p>
<p>Para resolver este problema, tanto no <strong>.NET</strong> quanto no <strong>Java</strong>, podemos criar um "<span style="text-decoration:underline;">contêiner</span>" nomeado, desta forma duas classes com o mesmo nome não serão confundidas entre si se elas estiverem em "contêiners" diferentes. É uma boa prática definir todas as suas classes em "contêiners".</p>
<p>Os contêiners podem ser utilizados tanto no .NET quanto no Java, no .NET chamamos de "<strong>namespaces</strong>" e no Java chamamos de "<strong>packages</strong>" (pacotes).</p>
<p>Conceitualmente não existem diferenças entre as duas linguagens, porém, sintaticamente existem diferenças, mas nada que não seja de fácil assimilação. Veja:</p>
<ul>
<li>Em <strong>Java</strong>, um <span style="text-decoration:underline;">package</span> representa fisicamente uma pasta (ou diretório para os puristas);</li>
<li>Em <strong>.NET</strong> um namespace não está relacionado a uma pasta. É possível ter uma pasta com um nome e dentro desta pasta, classes que pertençam a um namespace com outro nome, ou ainda, em uma pasta é possível existirem classes com namespaces diferente.  </li>
</ul>
<p><strong>Exemplo .NET:</strong></p>
<p><span style="color:#0000ff;">namespace</span> Financeiro<br />
{<br />
     <span style="color:#0000ff;">class</span> <span style="color:#008080;">Calculo</span><br />
     {<br />
           ......<br />
     }<br />
}</p>
<p><span style="color:#0000ff;">namespace</span> Estoque<br />
{<br />
     <span style="color:#0000ff;">class</span> <span style="color:#008080;">Calculo</span><br />
     {<br />
           ......<br />
     }<br />
}<br />
<strong></strong></p>
<p><strong>Exemplo Java:</strong></p>
<p><span style="color:#0000ff;">package</span> br.com.meusistema.financeiro;<br />
<span style="color:#0000ff;">public class</span> <strong>calculo</strong> {<br />
     .......<br />
}</p>
<p><span style="color:#0000ff;">package</span> br.com.meusistema.estoque;<br />
<span style="color:#0000ff;">public class</span> <strong>calculo</strong> {<br />
     .......<br />
}</p>
<p>Nos dois exemplos acima (.NET e Java), conseguimos ter duas classes com o mesmo nome, porém em contêiners diferentes dentro do mesmo sistema.</p>
<p><strong>.NET</strong><br />
     Financeiro.calculo<br />
     Estoque.calculo</p>
<p><strong>Java<br />
</strong>    br.com.meusistema.financeiro.calculo<br />
    br.com.meusistema.estoque.calculo</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Classloader: como utilizar]]></title>
<link>http://refatorandopadroes.wordpress.com/2007/02/16/classloader-como-utilizar/</link>
<pubDate>Sat, 17 Feb 2007 01:46:44 +0000</pubDate>
<dc:creator>karluqs</dc:creator>
<guid>http://refatorandopadroes.pt-br.wordpress.com/2007/02/16/classloader-como-utilizar/</guid>
<description><![CDATA[É incrível como aprendemos algo novo todo dia, mesma que a lição venha de forma lenta e dolorosa]]></description>
<content:encoded><![CDATA[<p>É incrível como aprendemos algo novo todo dia, mesma que a lição venha de forma lenta e dolorosa... recentemente, em uma empresa onde presto serviços em Java, tivemos um problema com o <a href="http://getahead.ltd.uk/dwr" title="Componente AJAX" target="_blank">DWR</a> (tenho enorme paixão por este componente, o modo como fizeram a ponte entre Java e Javascript chega a ser mágico, é o estado da arte em uso de Javascript, mas isso fica pra outro 'post'... =D)</p>
<p>Pois bem, o problema foi ocasionado durante testes de migração pra o JBoss 4.x, a inicialização do DWR  estava falhando, não conseguia de forma alguma encontrar as classes informadas em seu arquivo de configuração xml, o famigerado <a href="http://java.sun.com/javase/6/docs/api/java/lang/NoClassDefFoundError.html" title="Exception classe não encontrada" target="_blank">NoClassDefFoundError</a>, algo que não apresentava problemas no JBoss 3.x. Após olhar em empacotamento, meta-infs, jars, configurações do JBoss, nada, nenhuma pista, nem o Google ajudou. O jeito foi descer mais fundo, ler o código fonte do DWR. A linha onde o erro ocorre, executa apenas um carregamento de classe:</p>
<p>this.classDefinition = Class.forName(className) ;</p>
<p>A classe é guardada para que possa ser instanciada por reflexão posteriormente, o interessante é que tudo isso ocorre na inicialização do JBoss, depois que a aplicação levanta, tentamos via debugger, executar o mesmo comando e voilá... funcionava perfeitamente... o que raios estava acontecendo ? Não sabíamos....</p>
<p>Bom, não teve jeito, a classe do DWR  teve de ser alterada para testar outra possibilidade de carregamento. Com isso trocamos a linha para:</p>
<p>this.classDefinition = Thread.currentThread().getContextClassLoader().loadClass(className);</p>
<p>Linha monstruosa.... mas funcionou!</p>
<p>Boa prática aprendida: o Class.forName() não sobe na hierarquia de ClassLoader, fica apenas no ClassLoader local, enquanto o ClassLoader.loadClass() sim, ou seja, por questão de robustez e boa prática, sempre utilize a segunda forma, para não ficar com cara de "ué", quando este tipo de problema surgir.</p>
<p>Mas por que no JBoss 3.x funcionava e no 4.x não ? A resposta é que o ClassLoader o 4.x foi reescrito para ficar mais aderente as especificações, com isso o Class.forName() pegou todo mundo desprevinido, houve claras reclamações da comunidade, mas temos que viver com isso..., existem práticas a serem seguidas.</p>
<p>Ainda bem que não tivemos que usar o código alterado do DWR, estávamos na versão 1.1.3, por curiosidade, baixei a versão estável mais recente (1.1.4) e pra minha grata surpresa essa linha já havia sido alterada do mesmo modo que fizemos :D, só fiquei chateado por essa alteração não estar presente no release notes, teria me economizado tempo durante busca por pistas...</p>
]]></content:encoded>
</item>

</channel>
</rss>
