<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Últimas mensagens do tópico "Fugindo do modelo anêmico"]]></title>
		<link>http://www.guj.com.br/posts/list/12.java</link>
		<description><![CDATA[Últimas mensagens enviadas no tópico "Fugindo do modelo anêmico"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Fugindo do modelo anêmico</title>
				<description><![CDATA[ Trabalho no desenvolvimento de um sistema desde 2005. Desde então o sistema cresceu muito e sempre que posso procuro criar formas de otimizar o nosso trabalho, identificando oportunidades de melhorias para que seja possível fazer mais e melhor em menos tempo. O sistema utiliza Struts 1.2 (pretendemos iniciar uma migração para Struts 2 no primeiro semestre de 2008 ) e Hibernate 3.2.<br /> <br /> Algo que tem incomodado ultimamemente é a utilização do chamado "Modelo Anêmico". Já melhoramos um pouco, mas algumas classes continuam bastante anêmicas, hehehe. Por exemplo, imaginem que eu quero inserir um objeto da classe [b]Pessoa[/b]. Hoje a requisição é recebida por uma classe  [b]Action[/b] (ex: PessoaAction), que encaminha os dados para uma classe que costumam chamar de "Service" (ex: PessoaService) que valida as informações e chama uma classe estática que fica responsável pela persistência dos objetos com o Hibernate. O maior problema que eu vejo nessa solução é que as regras de negócio da classe [b]Pessoa[/b] estão em [b]PessoaService[/b]. Na minha visão, PessoaService continuaria existindo apenas para diminuir a dependência do Struts, mas ao invés de validar as regras e chamar a classe estática para persistência, ela apenas invocaria o método (não estático) [b]Pessoa.inserir()[/b].<br /> <br /> Para tornar isso realidade tenho que solucionar uma questão. Como poderia fazer com que minha classe de modelo [b]Pessoa[/b] conseguisse persistir os objetos sem criar uma dependência? Eu andei lendo um pouco sobre injeção de dependências, não sei se este é o caminho da solução. Se alguém souber de algo e puder ajudar eu ficarei muito feliz! :D<br /> <br /> Muito obrigado, amigos, bom fim de semana pra vcs!]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396399/fugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396399/fugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sat, 24 Nov 2007 11:02:18]]> GMT</pubDate>
				<author><![CDATA[ bonfarj]]></author>
			</item>
			<item>
				<title>Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=bonfarj]<br /> Algo que tem incomodado ultimamemente é a utilização do chamado "Modelo Anêmico". Já melhoramos um pouco, mas algumas classes continuam bastante anêmicas, hehehe. Por exemplo, imaginem que eu quero inserir um objeto da classe [b]Pessoa[/b]. Hoje a requisição é recebida por uma classe  [b]Action[/b] (ex: PessoaAction), que encaminha os dados para uma classe que costumam chamar de "Service" (ex: PessoaService) que valida as informações e chama uma classe estática que fica responsável pela persistência dos objetos com o Hibernate. O maior problema que eu vejo nessa solução é que as regras de negócio da classe [b]Pessoa[/b] estão em [b]PessoaService[/b]. Na minha visão, PessoaService continuaria existindo apenas para diminuir a dependência do Struts, mas ao invés de validar as regras e chamar a classe estática para persistência, ela apenas invocaria o método (não estático) [b]Pessoa.inserir()[/b].<br /> <br /> [/quote]<br /> <br /> Pessoa.inserir é o padrão ActiveRecord. Usar esse padrão não é uma boa. Continue usando a sua classe estática (acho que quiz dizer metodo estático) para fazer a persistencia ou seja arrojado e crie um DAO. Regra de negocios de pessoa... qual seria um exemplo de regra de negocios de pessoa ?<br /> Se essa regra usar entidades que não estão no grafo de pessoa então vc precisa de um Service. Mova para Pessoa todas as regras que dependem apenas do objeto pessoa e daqueles que estão no seu grafo e deixe em service aqueles que usam outras entidades. O nome do service deve ser [objetivo]Service ou [acção]Service e não [entidade]Service por isso foque nas acções/objetivos e agrupe os que são comuns ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396403/fugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396403/fugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sat, 24 Nov 2007 11:22:44]]> GMT</pubDate>
				<author><![CDATA[ sergiotaborda]]></author>
			</item>
			<item>
				<title>Fugindo do modelo anêmico</title>
				<description><![CDATA[ [size=9][duplicado][/size]]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396405/fugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396405/fugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sat, 24 Nov 2007 11:25:54]]> GMT</pubDate>
				<author><![CDATA[ sergiotaborda]]></author>
			</item>
			<item>
				<title>Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=sergiotaborda]Continue usando a sua classe estática (acho que quiz dizer metodo estático)[/quote]<br /> Exatamente, não me expressei bem, quis dizer que tenho uma classe composta apenas por métodos estáticos. <img src="http://www.guj.com.br/images/smilies/3b63d1616c5dfcf29f8a7a031aaa7cad.gif" border="0"><br /> <br /> [quote=sergiotaborda]Regra de negocios de pessoa... qual seria um exemplo de regra de negocios de pessoa ? Se essa regra usar entidades que não estão no grafo de pessoa então vc precisa de um Service. Mova para Pessoa todas as regras que dependem apenas do objeto pessoa e daqueles que estão no seu grafo e deixe em service aqueles que usam outras entidades.[/quote]<br /> Na verdade o sistema não tem classe Pessoa, foi apenas um exemplo. O que você chamou de grafo são os relacionamentos de dependência? Eu não acho legal essa idéia de passar as coisas para uma classe Service, pois o conhecimento sobre o negócio está deixando as classes de modelo. Por exemplo, eu não posso excluir um objeto da classe Cliente se ele está relacionado a um objeto da classe Pedido. Eu gostaria de um modelo que eu pudesse olhar e entender ali todas as regras de negócio, evitando que elas fiquem espalhadas. Este exemplo com Cliente/Pedido que citei é trivial, mas existem regras que envolvem estados dos objetos que são bem mais complexas, essa descentralização tem trazido problemas.<br /> <br /> [quote=sergiotaborda]Pessoa.inserir é o padrão ActiveRecord. Usar esse padrão não é uma boa.[/quote]<br /> Eu não sabia que isso não era uma boa. Se não estou enganado isso é usado no queridinho do momento Ruby On Rails, não sei se traz algum problema que eu ainda não tenha conseguido visualizar. Você pode exemplificar algo nesse sentido?<br /> <br /> Abraços e muito obrigado pela sua resposta!]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396422/fugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396422/fugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sat, 24 Nov 2007 13:05:05]]> GMT</pubDate>
				<author><![CDATA[ bonfarj]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ ActiveRecord não é legal para o design de sua modelagem. Pense da seguinte forma, Fornecedores não se salvam nem se deletam.<br /> Se você tenta modelar os objetos de forma que façam sentido para o negócio, os métodos das classes tem que fazer sentido também.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396433/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396433/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sat, 24 Nov 2007 13:51:56]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=bonfarj]<br /> [quote=sergiotaborda]Regra de negocios de pessoa... qual seria um exemplo de regra de negocios de pessoa ? Se essa regra usar entidades que não estão no grafo de pessoa então vc precisa de um Service. Mova para Pessoa todas as regras que dependem apenas do objeto pessoa e daqueles que estão no seu grafo e deixe em service aqueles que usam outras entidades.[/quote]<br /> Na verdade o sistema não tem classe Pessoa, foi apenas um exemplo. O que você chamou de grafo são os relacionamentos de dependência?<br /> [/quote]<br /> <br /> Não. Em O não ha "relacionamentos", ha objetos contendo objetos. Isso é um grafo.<br /> <br /> [quote]<br />  Eu não acho legal essa idéia de passar as coisas para uma classe Service, pois o conhecimento sobre o negócio está deixando as classes de modelo. Por exemplo, eu não posso excluir um objeto da classe Cliente se ele está relacionado a um objeto da classe Pedido. Eu gostaria de um modelo que eu pudesse olhar e entender ali todas as regras de negócio, evitando que elas fiquem espalhadas. Este exemplo com Cliente/Pedido que citei é trivial, mas existem regras que envolvem estados dos objetos que são bem mais complexas, essa descentralização tem trazido problemas.<br /> [/quote]<br /> <br /> Cuidado com o que vc pensa. <br /> 1) CRUD não é regra de negocio. Isto que fique bem claro. "Não posso excluir o cliente quando ele tem pedidos" é um regra de consistencia de dados e não de dominio/negocio. <br /> 2) A relação entre cliente e pedido não forma um grafo fixo. <br /> <br /> [code]Cliente c = ... <br /> Set&lt;Pedidos&gt; pedidos = c.getPedidos() ;<br /> [/code]<br /> <br /> pode parecer que c contém a coleção de pedidos, mas não. Aquele método de dominio que mostra a relação entre cliente e pedido <br /> apenas consulta o repositorio de pedidos por aqueles cujo cliente é c. Não ha necessidade do cliente andar com uma lista de pedidos às costas.<br /> Ainda mais quando essa lista muda a qq momento.<br /> <br /> DDD dix-lhe para criar o método getPedidos() e outros do mesmo tipo e isso que é uma regra de dominio. Isto não tem nada a ver com CRUD.<br /> O crud do pedido é independente do crud do cliente.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396596/fugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396596/fugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 11:28:23]]> GMT</pubDate>
				<author><![CDATA[ sergiotaborda]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=Lezinho]ActiveRecord não é legal para o design de sua modelagem. Pense da seguinte forma, Fornecedores não se salvam nem se deletam.<br /> Se você tenta modelar os objetos de forma que façam sentido para o negócio, os métodos das classes tem que fazer sentido também.[/quote]<br /> Entendo o que você diz, faz sentido. [:(]<br /> Estou começando a acreditar que o que temos hoje no sistema não é tão ruim, embora seja necessário melhorar algumas coisas.<br /> <br /> [quote=sergiotaborda]Não. Em O não ha "relacionamentos", ha objetos contendo objetos. Isso é um grafo.<br /> (...)<br /> 2) A relação entre cliente e pedido não forma um grafo fixo.[/quote]<br /> Eu realmente fiquei confuso com essa concepção de grafo, não entendi. Imagine que uma classe [b]Pedido[/b] possui um atributo [b]Cliente[/b]. Isso não pode ser visto como um relacionamento entre as duas classes? Seguindo o que você falou, Cliente pertence ou não ao grafo de Pedido? Se você tiver um link falando sobre grafos nesse contexto eu gostaria de ver, não consegui entender bem.<br /> <br /> [quote=sergiotaborda]<br /> [code]Cliente c = ... <br /> Set&lt;Pedidos&gt; pedidos = c.getPedidos() ;<br /> [/code]<br /> <br /> pode parecer que c contém a coleção de pedidos, mas não. Aquele método de dominio que mostra a relação entre cliente e pedido <br /> apenas consulta o repositorio de pedidos por aqueles cujo cliente é c. Não ha necessidade do cliente andar com uma lista de pedidos às costas.<br /> Ainda mais quando essa lista muda a qq momento.[/quote]<br /> Agora que eu não entendi mesmo. Necessidade de andar com uma lista? Mas isso não está relacionado a forma como você implementa? Também não entendi o porquê de Cliente não conter uma coleção de pedidos, porque o que você descreveu, para mim, indica claramente que existe um relacionamento bidirecional entre as duas classes.<br /> <br /> Abraços a todos!]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396610/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396610/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 12:14:48]]> GMT</pubDate>
				<author><![CDATA[ bonfarj]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ Acho que essa questão seria facilmente resolvido com o uso de um PessoaRepository.<br /> A classe Pessoa deve conter regras do tipo que elas tem no mundo real. Disso consiste a abstração.<br /> Por exemplo, Pessoa.pedirMercadoriaParaEstoque(String mercadoria). Já o codigo pertinente a salvar uma Pessoa ou não vai no PessoaRepository.<br /> <br /> Mas aí fica uma outra dúvida, é bom chamar o repository direto da Action do Struts?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396642/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396642/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 14:07:49]]> GMT</pubDate>
				<author><![CDATA[ feliperod]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=feliperod]Acho que essa questão seria facilmente resolvido com o uso de um PessoaRepository.<br /> A classe Pessoa deve conter regras do tipo que elas tem no mundo real. Disso consiste a abstração.<br /> Por exemplo, Pessoa.pedirMercadoriaParaEstoque(String mercadoria). Já o codigo pertinente a salvar uma Pessoa ou não vai no PessoaRepository.<br /> <br /> Mas aí fica uma outra dúvida, é bom chamar o repository direto da Action do Struts?[/quote]<br /> <br /> Cabe a decisão da equipe, contudo repository faz parte do negócio. Qualquer livro de DDD você vai ler a recomendação de isolar camada de negócio de camada de aplicação (Actions, ManagedBeans, etc), geralmente isso é o mais indicado. ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396644/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396644/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 14:12:55]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=Lezinho]<br /> <br /> ...<br /> <br /> Cabe a decisão da equipe, contudo repository faz parte do negócio. Qualquer livro de DDD você vai ler a recomendação de isolar camada de negócio de camada de aplicação (Actions, ManagedBeans, etc), geralmente isso é o mais indicado. [/quote]<br /> <br /> Concordo contigo em isolar o domain da camada de application. E isso não é nem do DDD só, vem dos Patterns J2EE mesmo e está sendo reforçado no DDD. Mas aí o cara cai na utilização de um Service pra fazer esse isolamento (É o que eu uso, ou utilizo uma Entity chamando o repository). Alguém pode postar um exemplo de como vocês fazem?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396647/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396647/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 14:18:09]]> GMT</pubDate>
				<author><![CDATA[ feliperod]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ Não existe mal em vc chamar Repositories de um Entity ou Service. Tanto um como outro são da camada de negócio, esta tudo ok.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396650/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396650/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 14:27:58]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=Lezinho]Não existe mal em vc chamar Repositories de um Entity ou Service. Tanto um como outro são da camada de negócio, esta tudo ok.[/quote]<br /> <br /> Mas aí caímos no Entity.insert() falado acima. Só que a logica dentro de Entity.insert() seria uma simples chamada ao repository.<br /> <br /> A verdade é que o modelo anêmico está mais relacionado com o que a classe não faz do que com o que ela faz. Caso ela esteja fazendo coisas que não estão no seu escopo, aí o problema é de classes obesas, e não anêmicas. <img src="http://www.guj.com.br/images/smilies/283a16da79f3aa23fe1025c96295f04f.gif" border="0"><br /> <br /> Mas essas discussões são sempre ótimas para reafirmar o conceitos que temos e a forma que fazemos as coisas.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396661/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396661/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 15:03:33]]> GMT</pubDate>
				<author><![CDATA[ feliperod]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[  [quote]Mas aí caímos no Entity.insert() falado acima.[/quote]<br /> <br /> Não necessariamente. Um repository não faz apenas CRUD, eles realizam buscas necessárias para os entities. *Nestes e outros casos* um repository dentro de um entity faz todo sentido do mundo.<br /> <br /> Outra situação é ocorrer em meio de um processamento de método de negócio, um objeto (um Aggregate) persistir outro objeto (composto pelo Aggregate), ou até mesmo requisitar sua própria persistencia. A grande diferença é o contrato de sua assinatura, ela não faz sentido ter um save ou persist. Mas se em meio a sua lógica for necessário guardar sua informação no repositorio, não te pq não faze-lo.<br /> <br /> Normalmente, mas não por regra, os CRUDs acabam por cair nas costas de um Service.<br /> <br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396676/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396676/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 16:10:04]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=bonfarj]<br /> [quote=sergiotaborda]Não. Em O não ha "relacionamentos", ha objetos contendo objetos. Isso é um grafo.<br /> (...)<br /> 2) A relação entre cliente e pedido não forma um grafo fixo.[/quote]<br /> Eu realmente fiquei confuso com essa concepção de grafo, não entendi. Imagine que uma classe [b]Pedido[/b] possui um atributo [b]Cliente[/b]. Isso não pode ser visto como um relacionamento entre as duas classes? Seguindo o que você falou, Cliente pertence ou não ao grafo de Pedido? Se você tiver um link falando sobre grafos nesse contexto eu gostaria de ver, não consegui entender bem.<br /> [/quote]<br /> <br /> Pedido contém um atributo do tipo Cliente. Sim. Cliente pertence ao grafo de Pedido e eu faço pedido.getCliente().<br /> O cliente do pedido reponde a "Quem fez o pedido?" <br /> Mas se eu quiser responder a "Quais pedidos o cliente fez?" ai eu uso cliente.getPedidos(). <br /> Com estas duas coias eu posso responder a "Que pedidos o cliente que fez este pedido, fex?" apenas com pedido.getCliente().getPedidos().<br /> Isto é uma regra de dominio. <br /> <br /> O facto de pedido ter um atributo ter um cliente sim pode ser encarado como um relacionamento entre as duas entidades, mas esse relacionamento é "virtual" ou seja, não existe um objeto Relacionamento que tenha um referencia a cada um. (Poderia haver, mas normalmente não ha). O que ha é uma Referencia de pedido a cliente , mas não de cliente a pedidos. Quando executa Cliente.getpedidos() vc está executando uma regra de negocio que  é muito mais complexa que pedido.getCliente(). cliente.getPedido() implica num raciocinio "procura os pedidos onde o cliente é this" <br /> <br /> Em codigo :<br /> <br /> [code]class Pedido {<br /> <br />    Cliente cliente; // attributo. Cliente pertence ao grafo fixo de Pedido<br /> }<br /> <br /> class Cliente {<br /> <br />    // não ha nenhuma referencia ao Set&lt;Pedido&gt;<br />    <br />        public Set&lt;Pedido&gt; getPedidos(){<br /> <br />                return PedidoRepository.findByClient(this);<br />       }<br /> <br /> }[/code]<br /> <br /> <br /> Embora do lado de fora pareça que Set&lt;Pedidos&gt; existe dentro de cliente, ele não existe de fato. Isso é a vantagem de encasulação.<br /> O que tudo isto interessa? <br /> Quando vc salva o pedido , ha um campo na tabela Pedido que diz respeito ao cliente. Logo o sistema tem que averiguar se o cliente está tb salvo. Se não, salva-o ( ou salva-o logo por default e pronto) <br /> Mas quando o sistema salva o cliente ele não salva a coleção de pedidos. Porque ele não salava? porque não ha nenhum atributo desse tipo em cliente. <br /> Então getPedidos() parece igual a getCliente(), mas não são. Mas o objetivo do DDD é exatamente que pareçam, mesmo que internamente não sejam.<br /> <br /> [quote]<br /> Agora que eu não entendi mesmo. Necessidade de andar com uma lista? Mas isso não está relacionado a forma como você implementa? Também não entendi o porquê de Cliente não conter uma coleção de pedidos, porque o que você descreveu, para mim, indica claramente que existe um relacionamento bidirecional entre as duas classes.<br /> ![/quote]<br /> <br /> Se o cliente contivesse um lista de pedidos cada vez que vc salva o cliente salvaria os pedidos e cada vez que retorna um cliente, retorna todos os pedidos tb. Entenda que isso cria um cliclo vicioso. Salvar o pedido  salva o cliente que salva o pedido, que salva o cliente ... Claro que a sua ferramente de persistencia pode evitar isso, mas o ponto aqui é que Pedido não pertence ao grafo de cliente. Pedido não especifica o cliente. Mas cliente especifica o pedido. Essa é a diferença. <br /> E não, ninguém anda com uma lista. Sim, depende de como implementa. Mas se vc implementar diferente vai ter muita dor de cabeça por causa do paradoxo que falei antes.<br /> <br /> Em termos de banco de modelo E-R existe um relacionamento bidirecional, mas em termos de DDD e OO não. Isso porque não é a mesma coisa vc obter pedidos a partir de um cliente e o cliente ter uma [b]referencia[/b] a esses pedidos. E em OO o que conta são as referencias e não os relacionamentos. <br /> <br /> Pense assim : vc poderia executar PedidosRepository.findByCliente(Cliente c) sempre que precisasse em qq ponto da aplicação. Mas isso é uma falha de encasulamento. Isso é equivalente a usar o objeto cliente como um DTO e isso é contra a ideia do DDD. É mais claro , e simples , que seja cliente.getPedidos(). <br /> <br /> Espero ter esclarecido.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396756/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396756/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 20:11:28]]> GMT</pubDate>
				<author><![CDATA[ sergiotaborda]]></author>
			</item>
			<item>
				<title>Fugindo do modelo anêmico</title>
				<description><![CDATA[ Oi, sergiotaborda, gostei muito do seu último post. Agora eu entendi melhor o que você quis dizer, embora algumas coisas não tenham ficado perfeitamente claras. Atribuo isso a minha inexperiência com DDD, tenho procurado ler sobre o assunto.<br /> <br /> Abraços,]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/396758/fugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/396758/fugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 25 Nov 2007 20:30:56]]> GMT</pubDate>
				<author><![CDATA[ bonfarj]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=Lezinho]Pense da seguinte forma, Fornecedores não se salvam nem se deletam.[/quote]<br /> <br /> Isso não seria um pouco controverso?<br /> <br /> Seguindo o Padrão GRASP Especialista na Informação, poderiamos dizer que: Quem tem os dados deve ser responsável por manipula-los. Com isso, conseguimos um boa divisão de responsábilidades, conseguimos fornecer um bom encapsulamento, evitamos inveja dos dados enfim, conseguimos evitar modelos anêmicos.<br /> <br /> Muitas vezes olhando para o Especialista da Informação fiz reflexões parecidas com esta: O objeto Fornecedor conhece seus dados logo seria responsabilidade dele se salvar, assim manteriamos o encapsulamento etc.. etc...<br /> <br /> Mas como persistência é um problema de infra vamos voltar lá no mundo de bobject... <br /> <br /> reflexões...]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397168/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397168/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 14:03:13]]> GMT</pubDate>
				<author><![CDATA[ brunohansen]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=brunohansen][quote=Lezinho]Pense da seguinte forma, Fornecedores não se salvam nem se deletam.[/quote]<br /> <br /> Isso não seria um pouco controverso?<br /> <br /> Seguindo o Padrão GRASP Especialista na Informação, poderiamos dizer que: Quem tem os dados deve ser responsável por manipula-los. Com isso, conseguimos um boa divisão de responsábilidades, conseguimos fornecer um bom encapsulamento, evitamos inveja dos dados enfim, conseguimos evitar modelos anêmicos.<br /> <br /> Muitas vezes olhando para o Especialista da Informação fiz reflexões parecidas com esta: O objeto Fornecedor conhece seus dados logo seria responsabilidade dele se salvar, assim manteriamos o encapsulamento etc.. etc...<br /> <br /> Mas como persistência é um problema de infra vamos voltar lá no mundo de bobject... <br /> <br /> reflexões...[/quote]<br /> É, Bruno, controverso. Eu entendo os dois lados, não é fácil decidir. Neste momento, eu vejo mais benefícios em fazer com que a classe [b]Fornecedor[/b] saiba como salvar e recuperar seus objetos. Com AspectJ eu vi uma forma bem legal de fazer isso, o código na classe Fornecedor não seria alterado, ela apenas herdaria uma interface.<br /> <br /> Como o Bruno falou, reflexões... <img src="http://www.guj.com.br/images/smilies/3b63d1616c5dfcf29f8a7a031aaa7cad.gif" border="0">]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397196/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397196/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 14:19:48]]> GMT</pubDate>
				<author><![CDATA[ bonfarj]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ Se trabalhar com Domain Model não é pré-requisito para a modelagem, tbm não vejo problema em utilizar Active Record. <br /> Ë puramente uma questão de escolha de design.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397228/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397228/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 14:47:39]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=brunohansen][quote=Lezinho]Pense da seguinte forma, Fornecedores não se salvam nem se deletam.[/quote]<br /> <br /> Isso não seria um pouco controverso?<br /> <br /> Seguindo o Padrão GRASP Especialista na Informação, poderiamos dizer que: Quem tem os dados deve ser responsável por manipula-los. Com isso, conseguimos um boa divisão de responsábilidades, conseguimos fornecer um bom encapsulamento, evitamos inveja dos dados enfim, conseguimos evitar modelos anêmicos.<br /> <br /> Muitas vezes olhando para o Especialista da Informação fiz reflexões parecidas com esta: O objeto Fornecedor conhece seus dados logo seria responsabilidade dele se salvar, assim manteriamos o encapsulamento etc.. etc...<br /> [/quote]<br /> <br /> Isso é uma falácia.<br /> O fornecedor realmente tem conhece os seus dados, mas não conhece a localização da persistência. Entenda que essa localização pode mudar e ver variada. Se o fornecedor conhecer essa localização ele está puxando para si uma responsabilidade que não lhe cabe. Não é que o forncedor não se possa persistir, é que ele não sabe onde.<br /> Compara com Serializable. Vc pode implementar no objecto um write e um read para substituir a seriaização padrão. Aqui o objeto está chamando para si a responsabilidade de quais dados e em que ordem os vai serializar, mas o processo não é da responsabilidade dele, o Objectstream que sabe a localização e o algoritmo para a serialização.<br /> <br /> No caso do fornecedor ele não tem meios de sobreecrever as operações crud, mas tb não precisa, já que tudo é feito pelo sistema de persistência.<br /> <br /> Então sim, existem uma forte necessidade de separar a persistencia da entidade porque ela não detalhes da persistencia e como tal não pode ter essa responsabilidade.<br /> <br /> O encapsulamento não tem nada a ver com o problema já que tanto em entidade.save() como em algo.save(entidade) ninguem está vendo como o save acontece realmente.<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397245/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397245/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 14:58:06]]> GMT</pubDate>
				<author><![CDATA[ sergiotaborda]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=sergiotaborda][quote=bonfarj]<br /> [quote=sergiotaborda]Não. Em O não ha "relacionamentos", ha objetos contendo objetos. Isso é um grafo.<br /> (...)<br /> 2) A relação entre cliente e pedido não forma um grafo fixo.[/quote]<br /> Eu realmente fiquei confuso com essa concepção de grafo, não entendi. Imagine que uma classe [b]Pedido[/b] possui um atributo [b]Cliente[/b]. Isso não pode ser visto como um relacionamento entre as duas classes? Seguindo o que você falou, Cliente pertence ou não ao grafo de Pedido? Se você tiver um link falando sobre grafos nesse contexto eu gostaria de ver, não consegui entender bem.<br /> [/quote]<br /> <br /> Pedido contém um atributo do tipo Cliente. Sim. Cliente pertence ao grafo de Pedido e eu faço pedido.getCliente().<br /> O cliente do pedido reponde a "Quem fez o pedido?" <br /> Mas se eu quiser responder a "Quais pedidos o cliente fez?" ai eu uso cliente.getPedidos(). <br /> Com estas duas coias eu posso responder a "Que pedidos o cliente que fez este pedido, fex?" apenas com pedido.getCliente().getPedidos().<br /> Isto é uma regra de dominio. <br /> <br /> O facto de pedido ter um atributo ter um cliente sim pode ser encarado como um relacionamento entre as duas entidades, mas esse relacionamento é "virtual" ou seja, não existe um objeto Relacionamento que tenha um referencia a cada um. (Poderia haver, mas normalmente não ha). O que ha é uma Referencia de pedido a cliente , mas não de cliente a pedidos. Quando executa Cliente.getpedidos() vc está executando uma regra de negocio que  é muito mais complexa que pedido.getCliente(). cliente.getPedido() implica num raciocinio "procura os pedidos onde o cliente é this" <br /> <br /> Em codigo :<br /> <br /> [code]class Pedido {<br /> <br />    Cliente cliente; // attributo. Cliente pertence ao grafo fixo de Pedido<br /> }<br /> <br /> class Cliente {<br /> <br />    // não ha nenhuma referencia ao Set&lt;Pedido&gt;<br />    <br />        public Set&lt;Pedido&gt; getPedidos(){<br /> <br />                return PedidoRepository.findByClient(this);<br />       }<br /> <br /> }[/code]<br /> <br /> <br /> Embora do lado de fora pareça que Set&lt;Pedidos&gt; existe dentro de cliente, ele não existe de fato. Isso é a vantagem de encasulação.<br /> O que tudo isto interessa? <br /> Quando vc salva o pedido , ha um campo na tabela Pedido que diz respeito ao cliente. Logo o sistema tem que averiguar se o cliente está tb salvo. Se não, salva-o ( ou salva-o logo por default e pronto) <br /> Mas quando o sistema salva o cliente ele não salva a coleção de pedidos. Porque ele não salava? porque não ha nenhum atributo desse tipo em cliente. <br /> Então getPedidos() parece igual a getCliente(), mas não são. Mas o objetivo do DDD é exatamente que pareçam, mesmo que internamente não sejam.<br /> <br /> [quote]<br /> Agora que eu não entendi mesmo. Necessidade de andar com uma lista? Mas isso não está relacionado a forma como você implementa? Também não entendi o porquê de Cliente não conter uma coleção de pedidos, porque o que você descreveu, para mim, indica claramente que existe um relacionamento bidirecional entre as duas classes.<br /> ![/quote]<br /> <br /> Se o cliente contivesse um lista de pedidos cada vez que vc salva o cliente salvaria os pedidos e cada vez que retorna um cliente, retorna todos os pedidos tb. Entenda que isso cria um cliclo vicioso. Salvar o pedido  salva o cliente que salva o pedido, que salva o cliente ... Claro que a sua ferramente de persistencia pode evitar isso, mas o ponto aqui é que Pedido não pertence ao grafo de cliente. Pedido não especifica o cliente. Mas cliente especifica o pedido. Essa é a diferença. <br /> E não, ninguém anda com uma lista. Sim, depende de como implementa. Mas se vc implementar diferente vai ter muita dor de cabeça por causa do paradoxo que falei antes.<br /> <br /> Em termos de banco de modelo E-R existe um relacionamento bidirecional, mas em termos de DDD e OO não. Isso porque não é a mesma coisa vc obter pedidos a partir de um cliente e o cliente ter uma [b]referencia[/b] a esses pedidos. E em OO o que conta são as referencias e não os relacionamentos. <br /> <br /> Pense assim : vc poderia executar PedidosRepository.findByCliente(Cliente c) sempre que precisasse em qq ponto da aplicação. Mas isso é uma falha de encasulamento. Isso é equivalente a usar o objeto cliente como um DTO e isso é contra a ideia do DDD. É mais claro , e simples , que seja cliente.getPedidos(). <br /> <br /> Espero ter esclarecido.<br /> [/quote]<br /> <br /> Uau. Excelente explicação Sérgio.<br /> Com código ainda que facilita bastante o entendimento.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397254/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397254/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 15:03:14]]> GMT</pubDate>
				<author><![CDATA[ fabim]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=sergiotaborda]Isso é uma falácia.<br /> O fornecedor realmente tem conhece os seus dados, mas não conhece a localização da persistência. Entenda que essa localização pode mudar e ver variada. Se o fornecedor conhecer essa localização ele está puxando para si uma responsabilidade que não lhe cabe.[/quote]<br /> Concordo plenamente, sem ressalvas.<br /> <br /> [quote=sergiotaborda]Não é que o forncedor não se possa persistir, é que ele não sabe onde.[/quote]<br /> E se fizermos isso com DI? A classe [b]Fornecedor[/b] continua sem saber como persistir, isso seria injetado nela. Isso é uma boa solução?]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397257/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397257/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 15:08:22]]> GMT</pubDate>
				<author><![CDATA[ bonfarj]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ Domain Model com Entidades contendo save, persist, ... ?<br /> Se você acredita que estas assinaturas de métodos faz sentido estar nas entidades, sua equipe e Expert Domain concordarem com você, tudo bem.<br /> <br /> Eu simplemente acho que um EntidadeRepository.add(entidade) resolve o problema, sem ter que comprometer a modelagem da Entidade a.k.a. ActiveRecord desnecessário.<br /> <br /> Isso não é falácia, é ponto de vista.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397307/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397307/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 15:48:40]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=Lezinho]Eu simplemente acho que um EntidadeRepository.add(entidade) resolve o problema, sem ter que comprometer a modelagem da Entidade a.k.a. ActiveRecord desnecessário.[/quote]<br /> Uma pergunta: nesse caso, como vc faz a validação dos dados do objeto?<br /> <br />  <img src="http://www.guj.com.br/images/smilies/d6741711aa045b812616853b5507fd2a.gif" border="0"> Cria um método entidade.validar() e chama dentro do EntidadeRepository.add(entidade)?<br /> <br /> []'s<br /> <br /> Rodrigo C. A.<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397352/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397352/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 16:45:44]]> GMT</pubDate>
				<author><![CDATA[ Rodrigo Carvalho Auler]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=bonfarj]<br /> [quote=sergiotaborda]Não é que o forncedor não se possa persistir, é que ele não sabe onde.[/quote]<br /> E se fizermos isso com DI? A classe [b]Fornecedor[/b] continua sem saber como persistir, isso seria injetado nela. Isso é uma boa solução?[/quote]<br /> <br /> Se vc usar injeção de dependência vc continua tendo dependência. Apenas não é vc que seta as referencias dos objetos manualmente. Não muda nada em termos de responsabilidade.<br /> Se vc injetar um objeto que tenha essa responsabilidade de saber onde persistir vc estará implicitamente retirando essa responsabilidade de Fornecedor. Ai fica pior, a responsabilidade é de outro objeto mas vc está forçando o uso atravéz de Fornecedor como um façade. Ou seja se vc tiver<br /> <br /> <br /> [code]class Fornecedor {<br /> <br />         DAO dao ; // injetado pela infraestrutura<br />  <br />  // atributos<br /> <br />  public void save (){<br />        dao.save(this);<br />  }<br /> }[/code]<br /> <br /> Vc está usando Fornecedor  como um Façade para DAO só porque vc gostaria de escrever:<br /> <br /> [code]fornecedor.save();[/code]<br /> <br />  Porque não fazer logo:<br /> [code]<br /> dao.save(fornecedor);[/code]<br /> <br /> Em vez de complicar a vida com ActiveRecord ?<br /> <br /> Eu concordo com a afirmação do Lezinho:<br /> <br /> [quote=Lezinho] <br />  Eu simplemente acho que um EntidadeRepository.add(entidade) resolve o problema, sem ter que comprometer a modelagem da Entidade a.k.a. ActiveRecord desnecessário. <br /> [/quote]<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397353/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397353/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 16:45:49]]> GMT</pubDate>
				<author><![CDATA[ sergiotaborda]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=sergiotaborda]<br /> Isso é uma falácia.<br /> [/quote]<br /> <br /> Rs... Engraçada essa afirmação!<br /> <br /> Você esta dizendo que um padrão GRASP é uma falácia?<br /> <br /> Eu discordo. Acho que os padrões de responsábilidades GRASP nos ajudam a aplicar a base da orientação a objeto, ainda mais se tratando do especialista da informação que é o mais importante.<br /> <br /> [quote=sergiotaborda]<br /> O fornecedor realmente tem conhece os seus dados, mas não conhece a localização da persistência. Entenda que essa localização pode mudar e ver variada. Se o fornecedor conhecer essa localização ele está puxando para si uma responsabilidade que não lhe cabe. Não é que o forncedor não se possa persistir, é que ele não sabe onde.<br /> [/quote]<br /> <br /> Ele não precisa saber onde se persitir... é só criar uma indireção e utilizar injeção de dependencia...<br /> <br /> [quote=sergiotaborda]<br /> O encapsulamento não tem nada a ver com o problema já que tanto em entidade.save() como em algo.save(entidade) ninguem está vendo como o save acontece realmente.<br /> [/quote]<br /> <br /> Acho que você esta enganado. Há uma quebra de encapsulamento! Sorte que a quebra é feita com reflexão ou aspectos... Senão teriamos que fazer fazer manutenção com espingarda!<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397371/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397371/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 16:58:30]]> GMT</pubDate>
				<author><![CDATA[ brunohansen]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=brunohansen]<br /> Seguindo o Padrão GRASP Especialista na Informação, poderiamos dizer que: Quem tem os dados deve ser responsável por manipula-los. Com isso, conseguimos um boa divisão de responsábilidades, conseguimos fornecer um bom encapsulamento, evitamos inveja dos dados enfim, conseguimos evitar modelos anêmicos.<br /> <br /> Muitas vezes olhando para o Especialista da Informação fiz reflexões parecidas com esta: O objeto Fornecedor conhece seus dados logo seria responsabilidade dele se salvar, assim manteriamos o encapsulamento etc.. etc...<br /> <br /> Mas como persistência é um problema de infra vamos voltar lá no mundo de bobject... <br /> <br /> reflexões...[/quote]<br /> <br /> Manipular os dados não significa persisti-los mas aplicar invariantes e regras de negócio. Isso que torna o modelo não anêmico.<br /> <br /> Eu vejo que no DDD essa coisa de persistir a si mesmo é desestimulada. Eu (digamos entity) posso até usar o repositório para ler a persistencia e resolver alguma regra de negocio, ou seja, eu [b]conheco[/b] a persistencia (por meio do repositorio), mas eu nao me persisto porque não é minha [b]responsabilidade[/b], eu faco parte de uma [i]unit of work[/i].<br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397442/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397442/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 18:33:58]]> GMT</pubDate>
				<author><![CDATA[ cmoscoso]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=Rodrigo Carvalho Auler][quote=Lezinho]Eu simplemente acho que um EntidadeRepository.add(entidade) resolve o problema, sem ter que comprometer a modelagem da Entidade a.k.a. ActiveRecord desnecessário.[/quote]<br /> Uma pergunta: nesse caso, como vc faz a validação dos dados do objeto?<br /> <br />  :arrow: Cria um método entidade.validar() e chama dentro do EntidadeRepository.add(entidade)?<br /> <br /> []'s<br /> <br /> Rodrigo C. A.<br /> [/quote]<br /> <br /> A questão da validação é relativa a cada caso. <br /> Se a validação é sobre invariantes simples do contrato, eu utilizo Hibernate Validator (para contratos nulos, tamanho de campos, datas futuras ou passadas, regex, etc)<br />    <br /> Ex:<br /> <br /> [code]<br /> @Entity<br /> public class Entidade{<br /> <br />     @Future<br />      private Date apenasDataFutura<br /> <br />     @NotNull<br />      private Object objetoQualquerNaoNulo<br /> <br />     ...      <br /> <br /> }<br /> [/code]<br /> <br /> <br /> Se a validação para um contrato for quanto a permissão de papeis do usuário, eu uso o Seam com Drools :<br /> [code]<br /> //somente usuarios com o papel `admin` pode acessar este método<br /> @Restrict("#{s:hasRole('admin')}")<br /> public void meuMetodoDeNegocio(Object obj){<br />     ....<br /> }<br /> [/code]<br /> <br /> ... agora se o contrato for algo que exige mais do negócio, entao eu evito colocar validações nos clientes e implemento no próprio negócio (por exemplo, quando um Entity faz um pedido ao Repository, quem vai verificar o contrato é o Repository).<br /> <br /> Eu tento manter o código o mais limpo possível dos contratos, mas quando não é possível não se pode fazer muita coisa.<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397491/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397491/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 20:08:34]]> GMT</pubDate>
				<author><![CDATA[ Alessandro Lazarotti]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=brunohansen][quote=sergiotaborda]<br /> Isso é uma falácia.<br /> [/quote]<br /> <br /> Rs... Engraçada essa afirmação!<br /> <br /> Você esta dizendo que um padrão GRASP é uma falácia?<br /> [/quote]<br /> <br /> Não. Estou dizendo que a frase a seguir é uma falácia.<br /> <br /> [quote=brunohansen]]  O objeto Fornecedor conhece seus dados [b]logo[/b]seria responsabilidade dele se salvar, assim manteriamos o encapsulamento etc.. etc... <br /> [/quote]<br /> <br /> 'A' conhecer seus dados não implica em que é responsabilidade de 'A' fazer algo com eles.<br /> Se formos por esse caminho eu poderia dizer que:<br /> <br /> "O DefaultTableModel  do Swing  conhece seus dados logo ele teria a responsabilidade de se mostrar na tela." <br /> <br /> Acho que é simples de entender que esse tipo de construção lógica é uma falácia.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397497/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397497/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 20:32:29]]> GMT</pubDate>
				<author><![CDATA[ sergiotaborda]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ Fornecedor.insert() é errado do pontode vista de Domain Driven Design. <br /> <br /> Porque? <br /> <br /> Porque você não chega no mundo real e pede pelo telefone pra um fornecedor inserir dados, mas pede pra um fornecedor preencher um formulário. Portanto, Fonecerdor.preencheFormulario() seria cogitável, porém a melhor forma é colocar o metodo de inserção num repository ou num service. <br /> <br /> Pense num repository como uma classe que administra uma coleção de objetos de um determinado tipo. Se você que adicionar um fornecedor a uma coleção (DB por exemplo), tem que adicionar pelo repository.<br /> <br /> Nomes importam muito na abastração. Aliás acho que é isso que diferencia arquitetos de desenvolvedores. A capacidade de abstrair.<br /> <br /> PS.: Você não é obrigado a utilizar DDD, mas não diga que está utilizando quando na verdade não está.]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/397526/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/397526/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Mon, 26 Nov 2007 21:12:59]]> GMT</pubDate>
				<author><![CDATA[ feliperod]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ Qualquer padrão possui as contra-indicações, além de ser importante saber onde aplicar, devemos saber também onde não aplicar.<br /> <br /> No caso, as classes de persistência são mais Especialistas na Informação para a tarefa de inserir no BD.<br /> E você teria um problemas de Coesão Baixa e Alto Acoplamento, além de uma lógica similar fique duplicada em muitas classes persistêntes.<br /> <br /> Por exemplo: uma venda pode informar seu total, mas ela não saber onde persistir (penso que ela nem deveria saber da existência do DAO), o DAO sabe onde persistir um objeto, e traze-lo de volta.<br /> <br /> Estou com saudades do tempo que eu fazia tudo da minha cabeça.  <img src="http://www.guj.com.br/images/smilies/3b63d1616c5dfcf29f8a7a031aaa7cad.gif" border="0">  IMHO.<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/636094/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/636094/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Sun, 8 Feb 2009 15:06:53]]> GMT</pubDate>
				<author><![CDATA[ F?io Henrique]]></author>
			</item>
			<item>
				<title>Re:Fugindo do modelo anêmico</title>
				<description><![CDATA[ [quote=brunohansen]<br /> Isso não é controverso?<br /> [/quote]<br /> <br /> [quote=sergiotaborda]<br /> Isso é uma falácia.<br /> [/quote]<br /> <br /> [b]<br /> <br /> Nem falácia nem controverso!<br /> <br /> Não se pode confundir um objeto de invenção pura, com o Data Transfer Objects.<br /> <br /> Um objeto não deve persistir a si mesmo; isso viola o principio de Separação de Interesses.<br /> <br /> O padrão Separação de Interesses tem prioridade sobre o Especialista na Informação.<br /> <br /> Existe uma prioridade nos padrões; Primeiro Grasp (básicos) depois GoF, e todo padrão tem contra-indicação...<br /> <br /> [/b]]]></description>
				<guid isPermaLink="true">http://www.guj.com.br/prepost/75388/672750/refugindo-do-modelo-anemico
</guid>
				<link>http://www.guj.com.br/prepost/75388/672750/refugindo-do-modelo-anemico
</link>
				<pubDate><![CDATA[Tue, 21 Apr 2009 20:44:08]]> GMT</pubDate>
				<author><![CDATA[ F?io Henrique]]></author>
			</item>
	</channel>
</rss>
