Classes de dados e classes de lógica

Opa, segurem suas cartas!

[quote=pcalcado]Determinados objetos possuem uma relação de agregação com outros. Na verdade, eles são significativos apenas com um conjunto de outros objetos, e precisam destes outros objetos o tempo todo.

Se você passar apenas a “raiz” dessa árvore de objetos" para um nó remoto, o que vai acotnecer é que você vai ter diversas chamadas RPC para os objetos agregados desta, porque este objetonão consegue fazer nada sozinho.

Um DTO (aimeuzahldenovonao!) é um pacotão de objetos que vão ser necessários ao cliente remoto, com a finaldiade de evitar tantas chamadas RPC minúsculas e caras.

No finald as contas vai ser muito mais jogo você passar um grande e gordo objeto quase independente do que objetos magrinhos que vão precisar se comunicar na rede o tempo todo.[/quote]

Humm… o que você quer dizer com “passar” o objeto? Passar a referência (o objeto é uma representação remota)?
Ou passar o objeto em si? É disso que estou falando, acho que não me entendeu, veja:


// classe de dados

class SalaCinema {
    Cinema cinema;
    List<Pessoa> pessoas;
    Filme filme;
}

// classe de dados + logica

class PowerSalaCinema extends SalaCinema {

    public boolean isLegal() {
        return !(cinema instanceof ArtFilms);
    }

    public void limpar() {
        for each p in pessoas // assim ficava legal...
            if (p.isPorca()) {
                kickAss(p);
                p.limpaSujeira(this);
            }
        }
    }

    public Dinheiro passarFilme() {
        return filme.passar();
    }

    // etc...

}

O que eu perguntei é se criar mil instâncias da segunda classe dá no mesmo que da primeira. Sacaste? E também, se eu passar mil objetos da primeira classe (o objeto como valor, não uma referência remota) seria mais enxuto que os da segunda?? Entendestes?

Oi,

Acho que entendi agora. Faça o teste: serialize dois objetos desta classe. Note que o bloco de lógica é um só, para mil e uma instâncias, um só bloco lógico. Sinceramente, você dificilmente vai ter problemas se utilizar pass-by-copy.

Quanto ao exemplo, pensei em algo mais acadêmico agora na aula do McDonald’s:

interface Livro{

public void avancarPagina();
public void recuarPagina();
oublic void abrir();
public void fechar();
public Pagina getPagina();

}

Define um livro (duh!) sem se preocupar com implementação. Posso ler ele a vontade assim, correto?

Implementação:

class Brochura implements Livro{
private List paginas = new ArrayList();

public List getPaginas();
public void addPagina(Pagina p){...}
public void removerPagina(Pagina p){...}

/*
métodos da interface...
*/


}

Imagina o estrago que alguém pode fazer com a lista que mantêm as páginas saindo de um

public List getPaginas(){
 return paginas;
}

Mas para, por exemplo, persisitr um Livro, eu vou precisar saber mais o que a Interface me diz. A Interface não me dá detalhes de implementação, mas eu consigo pensar duas situações onde você vai precisar destes detalhes:

  • Criação (por uma Factory ou não)
  • Persistência

São dois casos isolados e, principalmente, são dois casos que não têm muito a ver com o su domínio, não estão mapeando nada no seu sistema, são apenas infra-estrutura e limitações. Para estas classes você pode utilizar a implementação diretamente.

Ainda sobre o Livro do Evans, eu diria que você tem algumas opções para começar a entender OO: uma delas é ler a bilbiografia que recomendei outro dia, uma outra é ler um livro bom de OO e depois ler o Evans. Ele compila o conhecimento espalhado por vários outros volumes de maneira bem prática, tirando a gordura que você não vai usar no dia a dia (mas que é sim importante, apesar de que pelo menos se as pessoas se preocuparem em saber o básico já está melhor que hoje em dia!).

Oi guariba.
O conceito que eu estava colocando se refere as limitações tecnológicas e conceituais que ainda temos para implementar OO.
Temos que nos perocupar com várias coias que não fazem parte da modelagem propriamente dita:
Persistencia, Tráfico de rede, funcionalidades.

E conceituais porque muitos analistas ainda pensam proceduralmente mesmo quando modelam OO.

[quote=pcalcado]Oi,

Acho que entendi agora. Faça o teste: serialize dois objetos desta classe. Note que o bloco de lógica é um só, para mil e uma instâncias, um só bloco lógico. [/quote]

Ah isso que estava pensando. Então quando 200 objetos são transferidos na rede, a definição dos métodos é copiada uma única vez? A JVM é “inteligente” nesse ponto?

Agora ficou melhor. É como se cada interface fosse um aspecto diferente da mesma classe. Creio que seja meio massante (apesar de funcional) trabalhar assim, não? Imagina que o livro seja um pouco mais complexo, e que os “aspectos” a serem expostos, mais variantes? Criar (e gerenciar) trocentas interfaces pra isso deve ser bem chato hein?

Aquela lista de dez livros de OO? Tenho ela no meu favoritos :smiley:

Alguma novidade por aqui? Qual a conclusão?

A conclusão é o seguinte, pelo menos na minha opinião. Qual é a idéia do desenvolvimento de sistemas? É resolver problemas de negócio. Para onde estamos caminhando? Para que as coisas fiquem cada dia mais simples, e o software fique cada dia mais próximo do negócio. O mundo perfeito seria se o próprio gerente comercial alterasse regras de negócio, integrasse dados, mudasse a sua organização sem a dependência de um time de TI para “implementar as coisas”. No mundo perfeito, o usuário tem controle sobre a informação sem a necessidade de nós, arquitetos, programadores, analistas, testers e etc…

A leitura do Eric Evans é super importante. Ter uma camada de negócio é super importante. A questão não é só sofrer de Anemic Domain Model, ou deixar regras de negócio espalhadas, ou trabalhar procedural. A questão é que uma camada de negócio é algo próximo do usuário. Suas classes possuem nome de conhecimento do usuário. As operações de uma entity podem ser compreendidas e fazem sentido ao negócio. É o software próximo do problema. O resto, as telas, façades, os webservices, a infra-estrutura são só complicações que o paradigma atual nos impõe. No futuro, o próprio gerente do negócio vai mudar o domain model, ou o seu processo, sem a necessidade do time de TI.

Imagino que no futuro vamos nos aproximar cada vez mais do mundo perfeito. A OO aproximou. Uma maneira de mapear objetos para a sua persistência também… SOA, MDA, BPM, tudo caminha para esse mundo perfeito (não quero entrar em discussão a respeito da MDA).

Espero ter contribuído com alguma coisa, mesmo sem ter respondido nada especificamente.

Caraca, tiraram o tópico da cova hein! :smiley:

Taz, eu conversei com o lozano por e-mail e ele falou bastante coisa também, algum dia vou ver se publico porque tem que organizar aquilo lá.

Bom a conclusão que eu cheguei é que classes de lógica e classes de dados separadas é um troço esquisito :smiley:

Há uns dez anos eu ouvi falar dessa história de o usuário criar seu próprio programa. Até agora não vi nada acontecer nesse sentido e sinceramente acho que estamos ultra distantes disso.

Não tinha visto que o tópico tinha ressurgido das cinzas :smiley:

Já ví pessoas comuns fazendo sistemas departamentais em Access. Já ví gestores fazendo sistemas java com o antigo RRD (Rational Rapid Development). As ferramentas MDA* como o OptimalJ da Compuware também estão bem próximas disso. Ainda não é realidade. Como falei, é um futuro. Você não concorda que o mundo perfeito seria esse que “pintei”?

Além disso, como ainda estamos longe, um Domain Model, e principalmente, entities ricas em comportamento de negócio trazem outros benefícios:

  • Menor necessidade de documentação do projeto
  • O trabalho de análise é mais produtivo e focado
  • Melhor separação de responsabilidades no time
  • Mudanças são mais rápidas (menor necessidade de “rastreabilidade”)

Rodrigo,

faço minhas as suas palavras. Eu diria que a leitura do eric Evans é essencial. :wink:

Por outro lado, o que tenho visto no mercado é que desenvolvedores e projetos inteiros acabam por usar a arquitetura Orientada à Serviços (SOA) como desculpa para justificar um “anemic model” e, com ele, a velha abordagem de análise estruturada. Acho que SOA tem sido MUITO mal-interpretada. Os profissionais deveriam encarar SOA como mais uma ferramenta que tem suas vantagens e desvantagens e que é apropriada para resolver alguns tipos de problema. SOA não joga fora o paradigma OO. SOA é somente mais uma camada de abstração em relação ao que desenvolvemos/conhecemos até hoje sobre compenentes.

Não li todos os posts mas ja discuti muito esse assunto.

Existe um livro muito bom, chamado “Pojos in Action”. Ele explica e compara o domain model, com outros paradigmas de desenvolvimento, como os procedurais e outros.

Não existe um certo ou errado e acho que todos já sabem disso. O difícil é saber escolher o mais adequado pra cada situação, sendo q as vezes nem podemos fazer isso por imposições tecnológicas do tipo “não pode usar hibernate” hehe

quanto ao livro… deem uma olhada… muito bom mesmo!

O POJos in Action é bom, mas em duas sitções:

  • Tenho pressa
  • Já li Eric Evans e Martin Fowler

Ele msotra como implementar alguns conceitos de DDD utilizando tecnologias leves, bem legal mesmo, mas nem só de prática vive o programador.

[quote=pcalcado]O POJos in Action é bom, mas em duas sitções:

  • Tenho pressa
  • Já li Eric Evans e Martin Fowler

Ele msotra como implementar alguns conceitos de DDD utilizando tecnologias leves, bem legal mesmo, mas nem só de prática vive o programador.[/quote]

ou…

“eu quero apenas ter uma visao pratica sobre as diferentes formas de estruturar um sistema”

hehehehe 8)

mas vc esta certo… ele nao se aprofunda nos topicos… mas a serie “in action” é pra isso mesmo né

:smiley:

Galera vendo o tópico sobre classes persistentes e não persistentes(as de lógica de negócio).
Pensei que isso seria uma ótima prática, pois usando um private nos atributos da classe persistente geraria encapsulamento, fazendo com que o programa fique uma autêntica O.O. Pois na regra de O.O. jamais deve ser quebrado o encapsulamento…
Imagina um get e set nas classes persistentes e as classes não persistentes faz delegação/solicitação para realizar um set ou get nas persistentes. Que código organizado né?!

Segundo meus conhecimentos, se estiver errado me corrigem…

Vou pensar nesta idéia de classes persistentes e não persistentes daqui em diante…

Abraços a todos

Olá,

Não entendi muito bem o que você propôs. Classes não persistentes seriam as que contêm lógica e as persistente as que contêm dados?

[quote=pcalcado]Olá,

Não entendi muito bem o que você propôs. Classes não persistentes seriam as que contêm lógica e as persistente as que contêm dados?[/quote]

Isso mesmo, é que o olhando o tópico sobre: Classes de dados e classes de lógica

Veio logo em mente, utilizar uma classe que é persistente (acesso direto ao B.D.) ou seja, só faz get e set.
E uma não persistente(está só na memória RAM, não tem acesso direto ao B.D.) que só processa recebe dados do usuário.

exemplo:
classe “Cliente” realiza persistentência em tabela cliente

classe “TransacaoCliente” processa dados enviados por usuário, realiza consulta de dados fazendo uma solicitação a classe Cliente, assim como inserção e etc…

pelo que entendi essa é a idéia do tópico ou não?

Eu estou iniciando em JAVA.
Isso é uma boa prática não é?

abraços

Não, João, na verdade geralmente é uma péssima prática :wink:

O tópico discute exatamente isso, sobre a inexistência desta divisão num programa OO. Leia a discussão e siga as referências apra artigos para entender melhor.

Ok, valeu pela dica, vou verificar um pouco mais no fórum.
Mais porque não é recomendado???

Tirando o tópico da cova outra vez, aqui tá a conversa com o Lozano (ou parte dela, não lembro…)

Primeira coisa que ele já peca na resposta é afirmar que em “OO clássico”, usar herança é reutilização de código.

[quote=FL]
O estilo “clássico” de desenvolvimento OO super-valorisava a colocação de todo o comportamento
de um objeto nele mesmo e o uso de herança como forma de reutilizar código.[/quote]