<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comentários sobre: Vale a pena abstrair?</title>
	<atom:link href="http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/</link>
	<description>Michael Nascimento Santos em pt-BR</description>
	<lastBuildDate>Mon, 13 Apr 2015 12:20:08 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<item>
		<title>Por: blog.caelum.com.br &#187; Design Patterns: um mau sinal?</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-291</link>
		<dc:creator>blog.caelum.com.br &#187; Design Patterns: um mau sinal?</dc:creator>
		<pubDate>Mon, 18 Dec 2006 05:21:55 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-291</guid>
		<description>[...] Obviamente não estou pregando a total extinção de todos esses patterns (muito menos o DAO!), apenas lembrando que devemos medir muito bem a necessidade de criar mais classes e mais abstrações, em vez de atacar o problema com mais simplicidade, como o Michael Nascimento também já blogou (duas vezes). [...]</description>
		<content:encoded><![CDATA[<p>[...] Obviamente não estou pregando a total extinção de todos esses patterns (muito menos o DAO!), apenas lembrando que devemos medir muito bem a necessidade de criar mais classes e mais abstrações, em vez de atacar o problema com mais simplicidade, como o Michael Nascimento também já blogou (duas vezes). [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Blog do Mister M&#160;&#187; Seção de dados do blog &#187; Vale a pena abstrair? - Parte 2</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-84</link>
		<dc:creator>Blog do Mister M&#160;&#187; Seção de dados do blog &#187; Vale a pena abstrair? - Parte 2</dc:creator>
		<pubDate>Fri, 22 Sep 2006 21:38:50 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-84</guid>
		<description>[...] Blog do Mister M Michael Nascimento Santos em pt-BR       &#171; Vale a pena abstrair? [...]</description>
		<content:encoded><![CDATA[<p>[...] Blog do Mister M Michael Nascimento Santos em pt-BR       &laquo; Vale a pena abstrair? [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Tetsuo</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-70</link>
		<dc:creator>Tetsuo</dc:creator>
		<pubDate>Thu, 31 Aug 2006 12:52:23 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-70</guid>
		<description>Ixi, falou mal do Spring, tá no sal!!! hehe

Bem, quanto aos DAOs, eu acho que eles são úteis pra isolar o Hibernate, mantendo tudo quanto é HQL e Criteria em um só lugar, e não espalhado pelo sistema. Isso não requer interfaces (apesar delas serem úteis pra criar mocks de teste) e não aumenta estrondosamente a quantidade de código, apenas move um código que deveria existir de uma forma ou de outra. (obs.: mocks de DAOs são mesmo necessários, sendo que podemos simplesmente usar algum banco em memória, como o HSQLDB?)

A coisa fica complicada é quando alguém quer criar uma *abstração* sobre o Hibernate, fazendo de conta que tanto faz ser Hibernate, JDBC, iBatis, LDAP, XML, ou qualquer outra coisa. Das duas uma: ou ele nivela por baixo e perde as vantagens de se usar o framework, ou ele usa as features avançadas e torna a &#039;abstração&#039; totalmente amarrada com o Hibernate. E por &#039;amarrada&#039; não quero dizer que ele vá usar HQL diretamente (já que isto está &#039;abstraído&#039;), mas sim o lazy-loading, cache e relacionamentos, só pra citar o básico.

Então, já que é pra usar Hibernate, USE-O, não minta pra si mesmo. Mas não precisa espalhar imports org.hibernate.* por todo o código pra fazer isso :)

Quanto ao HibernateTemplate do Spring, ele não tenta abstrair o Hibernate, apenas facilita o seu uso. Mas claro, como o Hibernate já é uma abstração sobre JDBC, e tem uma API razoavelmente simples, um outro facilitador talvez seja desnecessário. (Já o JdbcTemplate é muitíssimo útil :))</description>
		<content:encoded><![CDATA[<p>Ixi, falou mal do Spring, tá no sal!!! hehe</p>
<p>Bem, quanto aos DAOs, eu acho que eles são úteis pra isolar o Hibernate, mantendo tudo quanto é HQL e Criteria em um só lugar, e não espalhado pelo sistema. Isso não requer interfaces (apesar delas serem úteis pra criar mocks de teste) e não aumenta estrondosamente a quantidade de código, apenas move um código que deveria existir de uma forma ou de outra. (obs.: mocks de DAOs são mesmo necessários, sendo que podemos simplesmente usar algum banco em memória, como o HSQLDB?)</p>
<p>A coisa fica complicada é quando alguém quer criar uma *abstração* sobre o Hibernate, fazendo de conta que tanto faz ser Hibernate, JDBC, iBatis, LDAP, XML, ou qualquer outra coisa. Das duas uma: ou ele nivela por baixo e perde as vantagens de se usar o framework, ou ele usa as features avançadas e torna a &#8216;abstração&#8217; totalmente amarrada com o Hibernate. E por &#8216;amarrada&#8217; não quero dizer que ele vá usar HQL diretamente (já que isto está &#8216;abstraído&#8217;), mas sim o lazy-loading, cache e relacionamentos, só pra citar o básico.</p>
<p>Então, já que é pra usar Hibernate, USE-O, não minta pra si mesmo. Mas não precisa espalhar imports org.hibernate.* por todo o código pra fazer isso :)</p>
<p>Quanto ao HibernateTemplate do Spring, ele não tenta abstrair o Hibernate, apenas facilita o seu uso. Mas claro, como o Hibernate já é uma abstração sobre JDBC, e tem uma API razoavelmente simples, um outro facilitador talvez seja desnecessário. (Já o JdbcTemplate é muitíssimo útil :))</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Fabio Kung</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-69</link>
		<dc:creator>Fabio Kung</dc:creator>
		<pubDate>Wed, 30 Aug 2006 21:58:08 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-69</guid>
		<description>Eu estava justamente falando sobre a abstração do Hibernate dentro dos DAOs. Não em criar outra camada de abstração (eu ODEIO o HibernateTemplate do Spring - isso além de odiar o Spring :D).

Acho que estamos falando a mesma coisa de formas diferentes. Quando eu falei sobre as chamadas a JDBC direto ou geração de XMLs, estava falando sobre novas implementações de seus DAOs, convivendo pacificamente com as implementações sobre o Hibernate / Toplink / iBatis...

Enfim, o que eu quero dizer é: não concordo com nada que não implemente a interface DAO (ou similares) usando Session / EntityManager.</description>
		<content:encoded><![CDATA[<p>Eu estava justamente falando sobre a abstração do Hibernate dentro dos DAOs. Não em criar outra camada de abstração (eu ODEIO o HibernateTemplate do Spring &#8211; isso além de odiar o Spring :D).</p>
<p>Acho que estamos falando a mesma coisa de formas diferentes. Quando eu falei sobre as chamadas a JDBC direto ou geração de XMLs, estava falando sobre novas implementações de seus DAOs, convivendo pacificamente com as implementações sobre o Hibernate / Toplink / iBatis&#8230;</p>
<p>Enfim, o que eu quero dizer é: não concordo com nada que não implemente a interface DAO (ou similares) usando Session / EntityManager.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Paulo Silveira</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-68</link>
		<dc:creator>Paulo Silveira</dc:creator>
		<pubDate>Wed, 30 Aug 2006 18:35:03 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-68</guid>
		<description>Eu to com o Michael e não abro mão. Kung, você pode muito bem encapsular essas chamadas a JDBC direto e geração de XMLs dentro do seu DAO, não precisa abstrair o hibernate em uma segunda camada....

Rubem, o Michael não tá falando em não usar o DAO! Interfacear o DAO é interessante para os testes sim! mas além disso você já está pagando um preço caro...</description>
		<content:encoded><![CDATA[<p>Eu to com o Michael e não abro mão. Kung, você pode muito bem encapsular essas chamadas a JDBC direto e geração de XMLs dentro do seu DAO, não precisa abstrair o hibernate em uma segunda camada&#8230;.</p>
<p>Rubem, o Michael não tá falando em não usar o DAO! Interfacear o DAO é interessante para os testes sim! mas além disso você já está pagando um preço caro&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Marcos Silva Pereira</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-67</link>
		<dc:creator>Marcos Silva Pereira</dc:creator>
		<pubDate>Wed, 30 Aug 2006 18:27:32 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-67</guid>
		<description>No meu caso, não é apenas abstrair o banco de dados, mas abstrair o acesso aos dados. Definir uma interface é mesmo desnecessario se vc já usa um ORM da vida, mas ao menos no meu caso, acho valido criar um componente para eu dizer: ei, me dê os dados e não me preocupar se ele usa criteria, hql, jdbc ou o que seja. A responsabilidade é dele, quero apenas os dados.

É justamente aí que talvez DAOs tenham uma utilidade que não seja necessariamente abstrair O banco de dados mas sim o acesso aos dados. É mais sobre Separation of Concerns do que sobre ter que mudar o tipo de repositorio.

valeuz...</description>
		<content:encoded><![CDATA[<p>No meu caso, não é apenas abstrair o banco de dados, mas abstrair o acesso aos dados. Definir uma interface é mesmo desnecessario se vc já usa um ORM da vida, mas ao menos no meu caso, acho valido criar um componente para eu dizer: ei, me dê os dados e não me preocupar se ele usa criteria, hql, jdbc ou o que seja. A responsabilidade é dele, quero apenas os dados.</p>
<p>É justamente aí que talvez DAOs tenham uma utilidade que não seja necessariamente abstrair O banco de dados mas sim o acesso aos dados. É mais sobre Separation of Concerns do que sobre ter que mudar o tipo de repositorio.</p>
<p>valeuz&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Emerson</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-66</link>
		<dc:creator>Emerson</dc:creator>
		<pubDate>Wed, 30 Aug 2006 18:07:10 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-66</guid>
		<description>No meu caso como é Oracle e VSAM o Hibernate não resolve meu problema heheh.</description>
		<content:encoded><![CDATA[<p>No meu caso como é Oracle e VSAM o Hibernate não resolve meu problema heheh.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Emerson</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-65</link>
		<dc:creator>Emerson</dc:creator>
		<pubDate>Wed, 30 Aug 2006 18:06:40 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-65</guid>
		<description>Eu uso a abstração para ler de duas fontes de dados de maneira transparente. Ex: Aqui onde trabalho usamos oracle e arquivos VSAM do mainframe. Determinado Business Object pode ser persistido ou em VSAM ou no Oracle. Pode ser feito um create() de um VSAM ou da base Oracle. Isso tudo por motivos que não vem ao caso aqui, porém é a nossa necessidade. Para nós é util essa abstração. Abraço ....</description>
		<content:encoded><![CDATA[<p>Eu uso a abstração para ler de duas fontes de dados de maneira transparente. Ex: Aqui onde trabalho usamos oracle e arquivos VSAM do mainframe. Determinado Business Object pode ser persistido ou em VSAM ou no Oracle. Pode ser feito um create() de um VSAM ou da base Oracle. Isso tudo por motivos que não vem ao caso aqui, porém é a nossa necessidade. Para nós é util essa abstração. Abraço &#8230;.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: kalecser</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-64</link>
		<dc:creator>kalecser</dc:creator>
		<pubDate>Wed, 30 Aug 2006 17:17:33 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-64</guid>
		<description>Se não abstrair o acesso aos dados, seja ele via framework OR ou não, é impossível testar unitariamente o código, é impossível entregar uma funcionalidade sem modelar a parte de acesso a dados e a sua aplicação terá, de cara, uma dependência estática ainda mais gosmenta que as ditas interfaces e abstrações, o banco de dados :P</description>
		<content:encoded><![CDATA[<p>Se não abstrair o acesso aos dados, seja ele via framework OR ou não, é impossível testar unitariamente o código, é impossível entregar uma funcionalidade sem modelar a parte de acesso a dados e a sua aplicação terá, de cara, uma dependência estática ainda mais gosmenta que as ditas interfaces e abstrações, o banco de dados :P</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Gyowanny</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-63</link>
		<dc:creator>Gyowanny</dc:creator>
		<pubDate>Wed, 30 Aug 2006 17:00:49 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-63</guid>
		<description>Todos os argumentos são válidos, mas e se eu não quiser usar Hibernate? Se vocês só trabalharam a vida toda com aplicações de grande porte, usando JEE e tudo o mais, com certeza um framework de mapeamento O/R se faz necessário, mas já tive casos, com aplicações JSE de médio porte, onde o Hibernate deixou a aplicação pesada e então fez-se necessário utilizar o acesso a JDBC direto, ou seja, se eu tivesse abolido as interfaces DAO da aplicação o esforço para efetuar essa mudança seria muito maior, sem contar que eu perco a liberdade de poder usar outros frameworks de persistência. 
Alguns esquecem que um dos requisitos básicos para um sistema bem projetado é a existência de acomplamento fraco ou abstração entre as camadas , principalmente na camada em questão</description>
		<content:encoded><![CDATA[<p>Todos os argumentos são válidos, mas e se eu não quiser usar Hibernate? Se vocês só trabalharam a vida toda com aplicações de grande porte, usando JEE e tudo o mais, com certeza um framework de mapeamento O/R se faz necessário, mas já tive casos, com aplicações JSE de médio porte, onde o Hibernate deixou a aplicação pesada e então fez-se necessário utilizar o acesso a JDBC direto, ou seja, se eu tivesse abolido as interfaces DAO da aplicação o esforço para efetuar essa mudança seria muito maior, sem contar que eu perco a liberdade de poder usar outros frameworks de persistência.<br />
Alguns esquecem que um dos requisitos básicos para um sistema bem projetado é a existência de acomplamento fraco ou abstração entre as camadas , principalmente na camada em questão</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Rubem Azenha</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-62</link>
		<dc:creator>Rubem Azenha</dc:creator>
		<pubDate>Wed, 30 Aug 2006 15:46:12 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-62</guid>
		<description>Michael, o problema é que o pessoal as vezes pode usar isso como desculpa para fazer as coisas mal feitas...

No caso o DAO por exemplo, eu prefiro usar DAOs, com interface, abstraido e tudo mais. A questão não é só &quot;e se a gente trocar de banco&quot; mas também da testabilidade e da manutenabilidade (existe essa palavra?) da aplicação. Se você colocar no teu objeto de negócio a session direto do Hibernate, como  você vai fazer os seus testes unitários? E se der um problema? Será que é no  
DAO ou na classe de negócio? Com o código isolado, fica *bem* mais fácil encontrar o problema, bem mais fácil de dar manutenção, bem mais fácil de reaproveitar.

É claro que para uma aplicação simples, sem muitas pretenções, pode-se usar a session direto, ou até a Connection, sem Hibernate mesmo.

Mas para aplicações mais sérias, com finders mais complexos, isolar num DAO vai deixar o código mais testável, mais fácil de manter e mais organizado.</description>
		<content:encoded><![CDATA[<p>Michael, o problema é que o pessoal as vezes pode usar isso como desculpa para fazer as coisas mal feitas&#8230;</p>
<p>No caso o DAO por exemplo, eu prefiro usar DAOs, com interface, abstraido e tudo mais. A questão não é só &#8220;e se a gente trocar de banco&#8221; mas também da testabilidade e da manutenabilidade (existe essa palavra?) da aplicação. Se você colocar no teu objeto de negócio a session direto do Hibernate, como  você vai fazer os seus testes unitários? E se der um problema? Será que é no<br />
DAO ou na classe de negócio? Com o código isolado, fica *bem* mais fácil encontrar o problema, bem mais fácil de dar manutenção, bem mais fácil de reaproveitar.</p>
<p>É claro que para uma aplicação simples, sem muitas pretenções, pode-se usar a session direto, ou até a Connection, sem Hibernate mesmo.</p>
<p>Mas para aplicações mais sérias, com finders mais complexos, isolar num DAO vai deixar o código mais testável, mais fácil de manter e mais organizado.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Michael Nascimento Santos</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-61</link>
		<dc:creator>Michael Nascimento Santos</dc:creator>
		<pubDate>Wed, 30 Aug 2006 14:13:12 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-61</guid>
		<description>&lt;p&gt;Fabio,&lt;/p&gt;

&lt;p&gt;Na pr&#225;tica, o ideal &#233; modificar esses casos de exce&#231;&#227;o a medida que surgem e n&#227;o o contr&#225;rio. Al&#233;m disso, n&#227;o entendi muito bem como que a otimiza&#231;&#227;o JDBC geraria outra implementa&#231;&#227;o DAO ao inv&#233;s de substitui-la.&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>Fabio,</p>
<p>Na pr&aacute;tica, o ideal &eacute; modificar esses casos de exce&ccedil;&atilde;o a medida que surgem e n&atilde;o o contr&aacute;rio. Al&eacute;m disso, n&atilde;o entendi muito bem como que a otimiza&ccedil;&atilde;o JDBC geraria outra implementa&ccedil;&atilde;o DAO ao inv&eacute;s de substitui-la.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Fabio Kung</title>
		<link>http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-60</link>
		<dc:creator>Fabio Kung</dc:creator>
		<pubDate>Wed, 30 Aug 2006 13:58:15 +0000</pubDate>
		<guid isPermaLink="false">http://blog.michaelnascimento.com.br/2006/08/30/vale-a-pena-abstrair/#comment-60</guid>
		<description>Também acho que aquele monte de parafernália trazida pelo Abstract Factory inútil. Tudo isso *deve* ser trocado por injeção de dependências.

Aí não temos mais &quot;um monte&quot; de interfaces no código. Apenas a interface DAO e suas filhas (o que eu tb discordo um pouco, como você pode ver &lt;a href=&quot;http://blog.caelum.com.br/2006/08/26/ei-como-e-o-seu-dao-ele-e-tao-abstraido-quanto-o-meu/#comment-34&quot; rel=&quot;nofollow&quot;&gt;aqui&lt;/a&gt;.

Eu discordo no ponto de não abstrair o framework de ORM. Acho útil abstrair não para trocar fácil de banco de dados, mas sim para otimizações que possam ser necessárias. É comum acontecerem casos que você precisa abrir mão das vantagens do ORM e acessar o banco direto via jdbc, ou persistir o objeto em um lugar diferente (num arquivo xml, por exemplo) porque o banco é legado e você não pode criar outra tabela).

Além disso, pelo menos para mim, na prática abstrair o ORM não têm sido muito trabalhoso tampouco tem limitado o que posso fazer com ele.</description>
		<content:encoded><![CDATA[<p>Também acho que aquele monte de parafernália trazida pelo Abstract Factory inútil. Tudo isso *deve* ser trocado por injeção de dependências.</p>
<p>Aí não temos mais &#8220;um monte&#8221; de interfaces no código. Apenas a interface DAO e suas filhas (o que eu tb discordo um pouco, como você pode ver <a href="http://blog.caelum.com.br/2006/08/26/ei-como-e-o-seu-dao-ele-e-tao-abstraido-quanto-o-meu/#comment-34" rel="nofollow">aqui</a>.</p>
<p>Eu discordo no ponto de não abstrair o framework de ORM. Acho útil abstrair não para trocar fácil de banco de dados, mas sim para otimizações que possam ser necessárias. É comum acontecerem casos que você precisa abrir mão das vantagens do ORM e acessar o banco direto via jdbc, ou persistir o objeto em um lugar diferente (num arquivo xml, por exemplo) porque o banco é legado e você não pode criar outra tabela).</p>
<p>Além disso, pelo menos para mim, na prática abstrair o ORM não têm sido muito trabalhoso tampouco tem limitado o que posso fazer com ele.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
