Encapsulamento  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
Filipe Sabella
Forum Spammer

Membro desde: 12/03/2003 11:25:57
Mensagens: 4639
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.

[ICQ]
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7769
Localização: London, UK
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
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
Filipe Sabella
Forum Spammer

Membro desde: 12/03/2003 11:25:57
Mensagens: 4639
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.

[ICQ]
Filipe Sabella
Forum Spammer

Membro desde: 12/03/2003 11:25:57
Mensagens: 4639
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.

[ICQ]
AllMighty
JavaGuru
[Avatar]

Membro desde: 16/08/2004 17:21:42
Mensagens: 263
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
    [Email] [WWW] [MSN] [ICQ]
    Rafael Steil
    Administrador
    [Avatar]

    Membro desde: 31/08/2002 02:35:53
    Mensagens: 5798
    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://www.jforum.net
    http://www.flickr.com/photos/rafaelsteil
    [Email] [WWW]
    AllMighty
    JavaGuru
    [Avatar]

    Membro desde: 16/08/2004 17:21:42
    Mensagens: 263
    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
    [Email] [WWW] [MSN] [ICQ]
    Rafael Steil
    Administrador
    [Avatar]

    Membro desde: 31/08/2002 02:35:53
    Mensagens: 5798
    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://www.jforum.net
    http://www.flickr.com/photos/rafaelsteil
    [Email] [WWW]
    AllMighty
    JavaGuru
    [Avatar]

    Membro desde: 16/08/2004 17:21:42
    Mensagens: 263
    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
    [Email] [WWW] [MSN] [ICQ]
    louds
    Moderador
    [Avatar]

    Membro desde: 29/04/2003 23:09:15
    Mensagens: 3953
    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
    [ICQ]
    Filipe Sabella
    Forum Spammer

    Membro desde: 12/03/2003 11:25:57
    Mensagens: 4639
    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.

    [ICQ]
    cv
    Moderador
    [Avatar]

    Membro desde: 04/04/2003 00:32:12
    Mensagens: 7769
    Localização: London, UK
    Offline

    Voce pode mandar seu objeto Candidato se gravar no banco de dados usando um CandidatoStore tal
    [Email] [WWW] [Yahoo!] [MSN] [ICQ]
    pcalcado
    Moderador
    [Avatar]

    Membro desde: 08/03/2004 17:19:35
    Mensagens: 5103
    Localização: Melbourne - 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
    [Email] [WWW] [Yahoo!] [MSN]
    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

    [WWW] [MSN] [ICQ]
    Filipe Sabella
    Forum Spammer

    Membro desde: 12/03/2003 11:25:57
    Mensagens: 4639
    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.

    [ICQ]
     
    Índice dos Fóruns » Arquitetura de Sistemas
    Ir para:   
    Apoiado e desenvolvido por Caelum Cursos Java - Powered by JForum 2.1.8 © JForum Team