Classes de dados e classes de lógica

É o que falei no final, modelar o banco ou deixá-lo como coadjuvante. É uma questão de decisão. Na verdade acho que esse caso de reuso que tentei explicar não é comum acontecer, acho que são mais para sistemas separados que compartilham uma mesma base de dados.

Imagine a base de dados dos micros da empresa, só que não existe apenas um sistema que faz tudo, mas vários cada um especializado em certa área, mas compartilhando o mesmo BD. Um usa para controle de ordens de serviço, outro para o próprio gerenciamento de micros, outro para chamados técnicos. Pra mim faria sentido definir Micro como um simples micro, não um micro que conhece OS, conhece chamados, conhece impressoras. Ficaria estranho reusar isso ou reescrever os atributos em cada sistema. Mas como disse acho que é raro esse “compartilhamento de BD”.

Uma coisa que seria uma solução para unir os dois jeitos de pensar seria definir uma classe genérica Micro e extendê-la de maneira apropriada a cada sistema. O que acha Lipe?

Como disse, se estes dados podem ser caracterizados como uma entidade existente por si só, e principalmente (o que como disse acima parece ser raro) podem ser utilizados de várias maneiras (independente de lógica), acho que vale a pena modelá-los como uma entidade separada (classe de dados, struct, bean etc.)

Depende. Como disse:

[quote] 2) Os dados representam informações de estado ou suporte a uma classe de negócios (não especificamente de aplicações de banco de dados), ou seja, elas só têm sentido se associadas a uma determinada lógica, e não como representantes de uma entidade de informação existente por si só:

Neste caso não vou criar uma classe separada com os dados, vou colocá-los juntos com a classe de lógica, pois os dados são uma característica, uma propriedade da classe. [/quote]

:shock: Não importa nem se seu salário ir embora junto com a memória RAM ?? :mrgreen:

Isso é uma parada sinistra. Assunto de novo tópico. Alguém conhece algum antigo que já tenha discutido isso? Se valer a pena, qualquer dia alguém podia abrir um…

Lipe, me parece que o melhor jeito, caso se queira ser “legalzinho” com o BD, caso se queira modelá-lo, no entanto “OOzando” - sem deboche, “melhorando” - seria criar as classes de dados e quando criar as classes de lógica, em vez de ser separadas das de dados, estendê-las. O que acha?

No livro que eu citei (sugestão do cv, BTW), o Evans fala sobre isso.

Você pdoe até separar seus objetos dessa maneira, ams qual a real vantagem?

No final das contas, você acaba com um domínio de aplicação artifical desnecessariamente. O objeto individual do mundo real é dividido em N objetos no seu sistema, o que causa uma confusão emntal enorme, além do acoplamento entre esses objetos ser tão grande que eles deveriam claramente ser um objeto só.

A idéia em trabalhar com objetos é justamente manter as coisas simples e coesas.

Ahhhhhhhh!!! Era sobre isso que estava pensando!! Esse problema se chama permissões de segurança. O Windows tem, as classes ainda não. Agora entendo porque você diz que é feio mas funciona :smiley: Realmente uma interface para cada aspecto de segurança de uma classe pode se tornar esquisito caso hajam muitos.

Muito interessante essa observação…

[quote=jprogrammer]É o problema da metodologoia “híbrida”.
Meia OO - Meia Estruturada/Relacional.[/quote]

Na verdade acho que o problema é a coexistência das duas, quando precisam interoperar, onde OO é o lado mais fraco.

Alguém já desenvolveu alguma solução de BI em java ?
Como fica isso orientado a objetos ?
Esse tipo de aplicação é muito dependente do base de dados (Data Warehouse).

Sei que o java suporte inúmeros recursos OLAP, etc.
Mas isso orientado a objetos.
Nesse tipo de aplicação a lógica de dados é bem mais forte que a lógica de negócios.
Compensa fazer isso OO ?

Não exatamente segurança, ams sim abstração. Os dados estão lá, se o cara quiser manipular ele vai dar um jeito, nem que seja manipulando byutecode. O que você precisa é não fazer seu cliente se preocupar com o que não é da conta dele :wink:

HUhahauahuahauhauahuah :lol:

Exatamente! :smiley:

Na verdade, estou tentando me livrar dela! :smiley:

[quote=jprogrammer]Alguém já desenvolveu alguma solução de BI em java ?
Como fica isso orientado a objetos ?
Esse tipo de aplicação é muito dependente do base de dados (Data Warehouse).

Sei que o java suporte inúmeros recursos OLAP, etc.
Mas isso orientado a objetos.
Nesse tipo de aplicação a lógica de dados é bem mais forte que a lógica de negócios.
Compensa fazer isso OO ?
[/quote]

Nao seria melhor um outro post, pra nao misturar os assuntos?

Mas ja respondendo, eu nunca usei e nem fiz algo do genero com Java, mas se nao me engano tem uma JSR nesse sentido (parece que a Oracle é uma das Owner).

]['s

[quote=pcalcado][quote=Email]Phillip Calçado to fernando
More options 11:02 am (34 minutes ago)
Olá, Fernando,

Estamos discutindo no GUJ um texto seu na Java Magazine deste mês
(creio). Se quiser dar uma olhada e responder, seria muito bom para
trocarmos experiências.

O thread está em:

http://www.guj.com.br/posts/list/23735.java

[]s


Phillip Calçado
ICQ: 1110nine38six5
M$N: pcalcado@gmail.com
Y!: pcalcado@yahoo.com
http://www.jablo.com.br/blogs/page/pcalcado
http://www.jroller.com/page/pcalcado
Crux Sacra Sit Mihi Lux[/quote][/quote]

Já que o Lozano não apareceu por aqui para nos explicar melhor o que ele quis dizer no artigo, quem se candidata a mandar uma carta para a revista questionando o artigo? :smiley:

[]'s
Marco Campêlo

[quote=mcampelo]
Já que o Lozano não apareceu por aqui para nos explicar melhor o que ele quis dizer no artigo, quem se candidata a mandar uma carta para a revista questionando o artigo? :smiley:

[]'s
Marco Campêlo[/quote]

A tartaruga do DQO sempre pode mandar umas cartinhas…

[quote=louds]
A tartaruga do DQO sempre pode mandar umas cartinhas…[/quote]

Clotilde,

cadê você? :smiley:

[]'s
Marco Campêlo

[quote=pcalcado]Para persistir a senha desse Usuario, eu vou precisar acessar o valor desse atributo (seja com um get ou outro treco) certo?

Mas e se eu não quiser expôr minha senha a outras classes? Na verdade, segundo mei domínio, a senha não deveria ser exposta a ninguém, é valor de somente escrita e comparação. Como eu persistiria algo assim com a tecnologia que temos hoje?[/quote]

Shoes, tem outro exemplo? Nesse caso da senha acho que o ideal é guardar o hash da mesma.

Mas aí “magro” pra você quer dizer com menos campos, não? Eu estou falando de métodos, objetos com métodos + dados. Tem certeza que transferir na rede ou criar um objeto com 10 campos e 200 métodos é a mesma coisa que um objeto apenas com os 10 campos?

[quote=mcampelo]Já que o Lozano não apareceu por aqui para nos explicar melhor o que ele quis dizer no artigo, quem se candidata a mandar uma carta para a revista questionando o artigo? :smiley:
[/quote]

Até pensei nisso. Se ninguém mandar talvez eu mande. Um outro dia tinha um cara dizendo que software livre no fundo é exatamente a mesma coisa que open source, e que todo open source é software livre. Esquisito…

Putz, adorei o tópico. Vcs não sabem o quanto estes conceitos tem dado um verdadeiro nó na minha cabeça e admito depois de muitos anos trabalhando somente procedural que passar para um modelo OO não é fácil. E o grande nó tem sido a separação dados e regras de negócio. Ainda não consegui entender bem o conceito estando ainda amarrado a exatamente o que o Jprogrammer colocou.

Shoes, desculpe-me se a pergunta for redundante, mas o livro que vc sugeriu trata exatamente da essência deste tópico?

Ok, vamos pensar… já te respondo.

Acho que me confundi aqui.

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.

TU ta falando deste livro?

Bom, digamos bem sucinto que este livro trata de como criar os modelo de dominio mais “rico” nao separando logica de negocio dos dados.
Tem mais info no site deles da uma olhada por la.

www.domaindrivendesign.org

]['s

[quote=guariba]
Shoes, desculpe-me se a pergunta for redundante, mas o livro que vc sugeriu trata exatamente da essência deste tópico?[/quote]

Esse livro mostra padrões simples (estilo Craig Larman) para aplicar um bom projeto de domínio no seu sistema 9com exemplo em Java).

Ele vai te dar boas idéias sobre como e porque você deve modelar as entidades em classes e agregações, e te encher de padrões para fazer isso. Muitos exemplo, explicações e causos.

Se você quer aprender teoria OO, esse livro não é indicado, ele é bem prático para quem já tem um bom conhecimento (que a maioria dos programadores Java que conheço não tem). O lviro do Craig pode ser um bom início para ele. :wink:

Obrigado.

Usando este modelo que o Shoes mostrou. Eu até ja usei ele algumas vezes, mas nunca me atentei pra um detalhe e agora fiquei com uma duvida.

Supondo que eu tenho as seguintes Interfaces.

[code]public interface Usuario {
void setLogin(String login);

String getLogin();

boolean usuarioValido();
}

public interface UsuarioCompleto extends Usuario {
//TO-DO Aqui todos get e set e mais as manipulacoes necessarias para o User.
}

public class UsuarioImpl implements UsuarioCompleto {
//TO-DO Implementacao de todos os metodos da Interface.
}
[/code]

Supondo que eu queira mandar somente login e senha para minha view eu faria o seguinte.

... Usuario usuario = usuarioImpl; ...

E enviaria este “usuario” para minha view, logo estarei disponibilizando para minha view somente os metodos da Interface Usuario.
Minha duvida: por mais que meus outros attributos estejam preenchidos eles serao trafegados pela rede ou somente o que compoe a Interface Usuario?

Nunca pensei em fazer um teste assim.

Alguem?

]['s

Tem um cast a toa no seu exemplo (ja que UsuarioImpl implementa Usuario, vc nao precisa do cast), e sim, tudo vai ser trafegado, pq a JVM nao tem inteligencia pra saber que ela pode serializar so metade do objeto. :wink:

Arrumado tks. Pois é seria pedir demais pra VM neh. :stuck_out_tongue: