| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2005 11:16:37
|
Filipe Sabella
Forum Spammer
Membro desde: 12/03/2003 11:25:57
Mensagens: 4641
Offline
|
Oi pessoal, bom dia.
Depois que o cv me instigou a ler mais sobre o assunto, encontrei o seguinte artigo, que deveria ter lido tempos atrás:
http://www.javaworld.com/javaworld/jw-05-2001/jw-0518-encapsulation.html
Nele, entre outras coisas, o autor afirma o seguinte:
Encapsulation rule 1: Place data and the operations that perform on that data in the same class
Sendo assim, DAO não seria uma anti-pattern? Operações CRUD deveriam então ser realizadas dentro das próprias classes? Ou não?
E analisando a evolução do código do autor, percebi o uso de getters e setters pode ser arriscado, então deve-se pensar algumas vezes e escrever o código com cuidado.
Porém, ao usar frameworks como Hibernate, que provê muitas facilidades, o desenvolvedor é obrigado a definir getters/setters para todos os atributos a serem persistidos. E então? Usar ou não usar essas facilidades?
Obrigado pessoal.
|
Former LIPE. |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2005 11:39:40
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7817
Localização: São Paulo, SP
Offline
|
Colocar getters e setters pra satisfazer o framework nao te impede (bom, nao totalmente) de continuar com o encapsulamento bom - voce pode colocar as operacoes que lidam com aqueles dados na mesma classe mesmo assim.
Sobre o DAO, de certa forma eh um anti-pattern do jeito que normalmente se ve feito por ai. Uma alternativa seria o ActiveRecord, do tio Fowler: http://patternshare.org/default.aspx/Home.MF.ActiveRecord
PS: avatar comedia
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2005 11:49:18
|
Filipe Sabella
Forum Spammer
Membro desde: 12/03/2003 11:25:57
Mensagens: 4641
Offline
|
Beleza, entendi o lance dos getters/setters.
Mas cv, sobre o link que você me passou, bem ... como implementar isso de forma coerente?
Isso?
E como colocaria várias operações dentro de uma transação fazendo desta maneira? E se o meu domínio tem centenas de objetos, não fica meio complicado para manter essas classes que implementam ActiveRecord?
Obrigado cv
ps.: fala pro sr Flower aumentar o tamanho do texto do site dele
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/02/2005 13:01:45
|
Filipe Sabella
Forum Spammer
Membro desde: 12/03/2003 11:25:57
Mensagens: 4641
Offline
|
E mais uma dúvida: métodos que filtram os dados e retornam coleções do objeto em questão deveriam estar contidos na mesma classe? Se não, onde??
Lipe, que cada vez mais sabe que não sabe nada
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2005 19:01:50
|
AllMighty
JavaGuru
![[Avatar]](/images/avatar/c900197841211ba608f56.gif)
Membro desde: 16/08/2004 17:21:42
Mensagens: 265
Localização: São Paulo
Offline
|
Voltando ao assunto do encapsulamento, outros artigos que causaram alguma polêmica foram estes do Allen Holub:
Why getter and setter methods are evil
Building user interfaces for object-oriented systems
Nesse último ele argumenta que MVC não é OO. Eu acho que ele se apega demais ao encapsulamento. É uma diretriz, não uma lei. De qq forma é uma boa leitura.
|
Rafael de F. Ferreira
Blog: http://www.rafaelferreira.net/
Links miscelâneos: http://stoa.usp.br/rafaelferreira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2005 19:56:25
|
Rafael Steil
Administrador
![[Avatar]](/images/avatar/8e296a067a37563370ded05f5a3bf3ec.jpg)
Membro desde: 31/08/2002 02:35:53
Mensagens: 5974
Localização: São Paulo
Offline
|
Eh preciso saber absorver o conteudo de muitos desses artigos. Alguem pode ler e tomar atitudes "drasticas" se confiar cegamente no que o autor diz, aumentando a "complexidade da aplicacao" (ou qualquer outra coisa, nao vem mto ao caso) por querer seguir a risca todas as "boas praticas" que leu pela net.
Fico imaginando a cena de alguem que acabou de ler o artigo onde eh argumentado que "mvc nao eh OO" e, por tal razao, declara a todos da equipe de desenvolvimento que "..nao vamos mais usar mvc pq ele nao eh oo".
Rafael
|
"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"
http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2005 20:55:30
|
AllMighty
JavaGuru
![[Avatar]](/images/avatar/c900197841211ba608f56.gif)
Membro desde: 16/08/2004 17:21:42
Mensagens: 265
Localização: São Paulo
Offline
|
De fato, Rafael, é arriscado se fiar na opinião de qualquer um que escreve um artigo. Todo mundo precisa saber pensar sobre o que lê.
O que eu achei interessante é o "absurdo" a que se chega quando se toma uma diretriz como se fosse um axioma absoluto. O projeto de um sistema envolve uma série de de escolhas de engenharia - se privilegia um aspecto em detrimento de outro. Isso talvez seja menos visível em software do que em outras áreas, porque as limitações físicas são muito menos importantes do que, por exemplo, ao se construir uma ponte.
O Holub acha que encapsulamento é uma regra inviolável. Mas, como os milhões de programas escritos usando MVC desde o smalltalk-80 mostram, é possível obter sistemas elegantes e funcionais relaxando um pouco o encapsulamento.
|
Rafael de F. Ferreira
Blog: http://www.rafaelferreira.net/
Links miscelâneos: http://stoa.usp.br/rafaelferreira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2005 21:28:27
|
Rafael Steil
Administrador
![[Avatar]](/images/avatar/8e296a067a37563370ded05f5a3bf3ec.jpg)
Membro desde: 31/08/2002 02:35:53
Mensagens: 5974
Localização: São Paulo
Offline
|
Um dos pontos que o artigo da javaworld nao fala sobre os getters eh o "problema da imutabilidade" das classes. O que alguns alegam eh que, tendo getters como temos a maior parte do tempo, as classes podem ter o status alterado facilmente. Imagine um codigo como
digamos que o a intencao era nao permitir que a data interna fosse alterada, e portando nao foi adicionado um setXxx(). O problema eh que, por estar o getData() retornando a referencia para a instancia da classe Date, qualquer metodo podera ser chamado, mudando as prpriedades internas:
A solucao para isso retornar uma copia ao inves da referencia. Porem, fazer isso somente "por fazer" - ou seja, sem a necessidade real de imutabilidade - somente teria resultados mais "desfavoraveis" que a favor.
O problema, porem, eh fazer 90% dos desenvolvedores entender isso.
Rafael
|
"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"
http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2005 21:55:33
|
AllMighty
JavaGuru
![[Avatar]](/images/avatar/c900197841211ba608f56.gif)
Membro desde: 16/08/2004 17:21:42
Mensagens: 265
Localização: São Paulo
Offline
|
Rafael Steil wrote:
A solucao para isso retornar uma copia ao inves da referencia. Porem, fazer isso somente "por fazer" - ou seja, sem a necessidade real de imutabilidade - somente teria resultados mais "desfavoraveis" que a favor.
O problema, porem, eh fazer 90% dos desenvolvedores entender isso.
Sei lá. Eu acho que imutabilidade na verdade deveria ser mais usada. Simplifica bastante o contrato da classe e vc não precisa se preocupar muito com mudança de hash-code. Além de poder dar alguma vantagem minuscula de performance (isso é secundário).
edição: Ficar copiando na hora de entregar para o cliente geralmente quer dizer q a classe do objeto retornado deveria ter sido imutavel. Acho q foi mancada da sun fazer o Date mutável.
This message was edited 1 time. Last update was at 28/02/2005 21:59:05
|
Rafael de F. Ferreira
Blog: http://www.rafaelferreira.net/
Links miscelâneos: http://stoa.usp.br/rafaelferreira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2005 22:16:02
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
DAO pode ser visto como um antipattern, mas também é solução pro caso de classes "Canivete Suiço".
Eu acho que encapsulamento não pode ser tudo ou nada, tem que existir uma maior liberdade para outros objetos colaboradores olharem por traz da cortina.
Eu prefiro muito mais ter vários objetos colaborando entre sí que poucos objetos muito independentes. Essa é a velha discução de Coesão x Acoplamento e Spaghetti x Raviolli.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/03/2005 03:11:29
|
Filipe Sabella
Forum Spammer
Membro desde: 12/03/2003 11:25:57
Mensagens: 4641
Offline
|
Adorei ler o artigo, ótimo ver uma opinião bastante diferente do que se ve hoje em dia.
Contudo, mandar meu objeto Candidato se gravar no reposítório de dados me cheira muito mal
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/03/2005 06:52:49
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7817
Localização: São Paulo, SP
Offline
|
Voce pode mandar seu objeto Candidato se gravar no banco de dados usando um CandidatoStore tal
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/03/2005 09:26:55
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5169
Localização: Sydney - Australia
Offline
|
O problema de getters/setters é que eles foram criados para um modelo de componentes gambiarral (ou vocês realmente acham que JavaBeans não são uma gambiarra? Convenção de nomes só apra reflection?Habla sério...) que foge das boas práticas e tende para o aparecimento de objetos sem comportamento, só atributos.
O uso de boas práticas ou não realmente é uma decisão muito séria, mas acho que deve-se conehcer o máximo possível para se saber quando usar e quando não usar.
Não me lembro de nenhum padrão J2EE que não tenha sentido apenas para suprir uma deficiência da plataforma, mas o DAO, IMHO, é mais que isso, age na impedância (cadê o link apra aquele outro tópico?). É ideal? Claro que não, mas funciona (Como DTOs, que até hoje eu busco algo que possa eliminar).
Um DAO deve ler o estado de um objeto e persistí-lo, ou as outras letrinhas do CRUD. Extrair o estado de um objeto apenas com consultas quebra o encapsulamento (a menos que houvessem "friends" em Java), mas uma solução para quem procura se manter nas boas práticas é aplicar o pattern Memento e persistir o Memento. Isso é meio trabalhoso e agrega uma complexidade que, na prática, só vai ser útil para se persistir o objeto.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/03/2005 09:52:25
|
fabio.patricio
Forum Spammer
Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline
|
pcalcado wrote:...age na impedância (cadê o link apra aquele outro tópico?).
Este? http://www.guj.com.br/posts/list/20496.java
]['s
|
Fabio Patricio
http://blog.wansoft.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/03/2005 10:00:59
|
Filipe Sabella
Forum Spammer
Membro desde: 12/03/2003 11:25:57
Mensagens: 4641
Offline
|
cv, e nos casos de outras consultas que retornam coleções de objetos Candidato? Em que lugar enfio estes métodos sem doer?
Estou lendo o segundo artigo que o AllMighty postou, estou até achando perigoso de tanto que estou adorando o que o cara está escrevendo. Faz um monte de sentido pra mim
|
Former LIPE. |
|
|
 |
|
|