Codificando classe e associções

Caro amigos,

 Pesquisei sobre o assunto no forum e encontrei diversos tópicos sobre o assunto, contudo todos eles pareciam tópicos de experts, e como sou junior em Java fiquei com mais dúvidas que respostas. A minha dúvida é bem simples. Imaginem um diagrama de classes que há uma estrutura muito parecida com a estrutura de País->Estado->Município, ou seja, uma classe A possui diversas B (que estão associadas somente a uma A) e B possui diversas C (que estão associadas somente a uma B). Ver diagrama em anexo (área 1 -> 1..* disciplina e disciplina 1 -> 1..* atividade. Quando o usuário faz um lançamento ele irá selecionar uma área o sistema filtra todas as disciplinas que são da área selecionada, depois o usuário seleciona a disciplina e o sistema responde com todas as ativdades daquela disciplina. Feita esta seleção, a atividade é associada ao lançamento Até aqui tudo bem, a parte do filtro é bem simples (adotei um MOR de cada classe é uma tabela no SGBD).

 Minha dúvida surge nos metodos get e set do objeto que está associado. No caso do getObjeto é ele quem irá ao banco recuperar o objeto associado? Neste exemplo o diagrama é bem simples mas no caso de um diagrama complexo com muitas associações não tem porque "levantar" todos os objetos associados em uma recuperação de dados. Imagino que o melhor a fazer seja o objeto que é alvo de consulta teria de alguma forma uma "navegação" para os objeto associados a ele. No meu caso o usuário seleciona um lançamento e mostro a atividade deste lançamento, se o usuário quiser qual é a disciplina desta atividade o sistema "pergunta" a ativadede sua disciplina, ou seja, atividade.getDisciplina é este método que ai ao bando e recupera o objeto disciplina? Estou usando DAO/JDBC por ser meu primeiro projeto e é bem simples.

 Outra dúvida é quando a necessidade do métodos setObjeto. Por exemplo o usuário seleciona a área o sistema lista todas as disciplinas ai ele escolhe a disciplina...é nete momento que dou o newDisciplina e executo area.setDisciplina (disciplina)?

Abraços a todos.


Kara, vc ta perdidão mesmo!

get vc obtem o determinado atributo - caracteristica do objeto

set vc coloca determinado atributo ou caracteristica no objeto

No final de vc setar, fika parecendo uma lista encadeada, como acho q vc viu em C++

e essa relação de 1… para *, ateh onde sei, não eh interessante aplicar a classes, seria legal aplicar em banco de dados orientados à objetos se eh isso q vc vai usar! Pois desconheço!

O java trabalha bem se for orientado a objetos, mas veja bem, dependendo como for se o projeto for simples, faça em uma linguagem basic, use o visual basic para fazer

A orientação á objetos e o Java são dificeis! quase sempre vc se perde em erros bobos^^

Quer uma dica, leia, mais sobre a orientação a objetos…

Suas classes estão diagramas corretamente, achei legal o bom senso q vc teve em separar tudo!

[quote=nato.soumaisweb]Kara, vc ta perdidão mesmo!

get vc obtem o determinado atributo - caracteristica do objeto

set vc coloca determinado atributo ou caracteristica no objeto

No final de vc setar, fika parecendo uma lista encadeada, como acho q vc viu em C++

e essa relação de 1… para *, ateh onde sei, não eh interessante aplicar a classes, seria legal aplicar em banco de dados orientados à objetos se eh isso q vc vai usar! Pois desconheço!

O java trabalha bem se for orientado a objetos, mas veja bem, dependendo como for se o projeto for simples, faça em uma linguagem basic, use o visual basic para fazer

A orientação á objetos e o Java são dificeis! quase sempre vc se perde em erros bobos^^

Quer uma dica, leia, mais sobre a orientação a objetos…

Suas classes estão diagramas corretamente, achei legal o bom senso q vc teve em separar tudo![/quote]

Caro nato,

 Obrigado pela resposta. Mas deixa eu explicar melhor a situação. De orientação a objetos em entendo e muito bem, o que estou em dúvida é quanto a codificação. Estou tentando não alterar o modelo de dados em relação do modelo de classes, ou seja, meu MOR é sempre 1 pra 1. O projeto é simples pq somente coloquei uma pequena parte dele, é um projeto grandes com um grafo de mais ou menos 50 classes. Não acho Java dificil e convenhamos, tentar convencer alguém a usar VB!!!!

 Compreendo o que vc falou sobre o get obter o uma característica de um objeto, mas e se esta caracaterística for um outro objeto, ou até mesmo a sua referência? É isso que estou em dúvida... o getObjeto somente retorna a referência do objeto ou o objeto em si?

Abraços.

Bom dia marcelo,

Cara isso é uma regra da linguagem…vc nunca retorna o objeto. e sempre a referencia que foi dada a ele.

Olá,

P: Minha dúvida surge nos metodos get e set do objeto que está associado. No caso do getObjeto é ele quem irá ao banco recuperar o objeto associado?
R: Depende da implementação do seu DAO e da sua entidade. Pelo o que você falou, a obtenção das entidades que estão amarradas a uma outra vai ser feita sob demanda, então vc teria que implementar isso. Eu sinceramente acho que se você usar algum framework ORM (hibernate por exemplo) vc vai poupar trabalho pq a carga normalmente é sob demanda (lazy loading). Se o seu projeto for ser pequeno e as entidades não forem ter muitas amarrações, acho que seria legal na carga do objeto (pelo DAO) vc já trazer tudo que está ligado, pois como eu falei, implementar um lazy loading não é trivial.

P: Neste exemplo o diagrama é bem simples mas no caso de um diagrama complexo com muitas associações não tem porque “levantar” todos os objetos associados em uma recuperação de dados. Imagino que o melhor a fazer seja o objeto que é alvo de consulta teria de alguma forma uma “navegação” para os objeto associados a ele. No meu caso o usuário seleciona um lançamento e mostro a atividade deste lançamento, se o usuário quiser qual é a disciplina desta atividade o sistema “pergunta” a ativadede sua disciplina, ou seja, atividade.getDisciplina é este método que ai ao bando e recupera o objeto disciplina?
R: Métodos das entidades não devem conversar com o banco. Como falei, se quiser um comportamento de carga sob demanda, use um framework ORM.

P: Outra dúvida é quando a necessidade do métodos setObjeto. Por exemplo o usuário seleciona a área o sistema lista todas as disciplinas ai ele escolhe a disciplina…é nete momento que dou o newDisciplina e executo area.setDisciplina (disciplina)?
R: Não. Se vc selecionou uma área e as disciplinas foram trazidas, quer dizer que area.setDisciplina(disciplina) e new Disciplina() já foi feito em algum momento não é? Ou então vc populou o banco manualmente.

P: Compreendo o que vc falou sobre o get obter o uma característica de um objeto, mas e se esta caracaterística for um outro objeto, ou até mesmo a sua referência? É isso que estou em dúvida… o getObjeto somente retorna a referência do objeto ou o objeto em si?
R: Sempre a referência. Em Java, o valor das variáveis para objetos guardam referências para os objetos e não o objeto em sí.

O que é MOR? Modelo relacional? Se o seu modelo é todo 1 para 1 vc deve ter vários erros conceituias… Sugiro pensar melhor o molelo. O seu exemplo de disciplina que você menciounou não é 1x1. O seu diagram de classes não tem relacionamentos 1x1.

[]´s

[quote=davidbuzatto]Olá,

P: Minha dúvida surge nos metodos get e set do objeto que está associado. No caso do getObjeto é ele quem irá ao banco recuperar o objeto associado?
R: Depende da implementação do seu DAO e da sua entidade. Pelo o que você falou, a obtenção das entidades que estão amarradas a uma outra vai ser feita sob demanda, então vc teria que implementar isso. Eu sinceramente acho que se você usar algum framework ORM (hibernate por exemplo) vc vai poupar trabalho pq a carga normalmente é sob demanda (lazy loading). Se o seu projeto for ser pequeno e as entidades não forem ter muitas amarrações, acho que seria legal na carga do objeto (pelo DAO) vc já trazer tudo que está ligado, pois como eu falei, implementar um lazy loading não é trivial.

P: Neste exemplo o diagrama é bem simples mas no caso de um diagrama complexo com muitas associações não tem porque “levantar” todos os objetos associados em uma recuperação de dados. Imagino que o melhor a fazer seja o objeto que é alvo de consulta teria de alguma forma uma “navegação” para os objeto associados a ele. No meu caso o usuário seleciona um lançamento e mostro a atividade deste lançamento, se o usuário quiser qual é a disciplina desta atividade o sistema “pergunta” a ativadede sua disciplina, ou seja, atividade.getDisciplina é este método que ai ao bando e recupera o objeto disciplina?
R: Métodos das entidades não devem conversar com o banco. Como falei, se quiser um comportamento de carga sob demanda, use um framework ORM.

P: Outra dúvida é quando a necessidade do métodos setObjeto. Por exemplo o usuário seleciona a área o sistema lista todas as disciplinas ai ele escolhe a disciplina…é nete momento que dou o newDisciplina e executo area.setDisciplina (disciplina)?
R: Não. Se vc selecionou uma área e as disciplinas foram trazidas, quer dizer que area.setDisciplina(disciplina) e new Disciplina() já foi feito em algum momento não é? Ou então vc populou o banco manualmente.

P: Compreendo o que vc falou sobre o get obter o uma característica de um objeto, mas e se esta caracaterística for um outro objeto, ou até mesmo a sua referência? É isso que estou em dúvida… o getObjeto somente retorna a referência do objeto ou o objeto em si?
R: Sempre a referência. Em Java, o valor das variáveis para objetos guardam referências para os objetos e não o objeto em sí.

O que é MOR? Modelo relacional? Se o seu modelo é todo 1 para 1 vc deve ter vários erros conceituias… Sugiro pensar melhor o molelo. O seu exemplo de disciplina que você menciounou não é 1x1. O seu diagram de classes não tem relacionamentos 1x1.

[]´s[/quote]

Caro David,

 Obrigado pelas respostas... ajudaram em muito. O que eu realmente estava querendo fazer era implementar algo igual ao lazy loading do Hibernate, usando JDBC/DAO na mara... mas vi que isso seria uma boa estratégia de aprendizado mas para produtividade é 0. Já estou seriamente cogitando o uso do Hibernate.

 Quanto ao que comentei sobre o MOR (é Mapeamento Objeto Relacional, o que o Hibernate faz) é que a estratégia que adotei foi uma classe uma tabela, ate mesmo para coisas do tipo muitos-para-um... não quero ficar tendo que fazer de<>para entre modelo de classes e modelo de dados... quero algo fácil... bateu o olho na classe A sabe que existirá uma tabela A no banco, entendeu?

 Por fim para sacramentar... no meu modelo existem alguns métodos do tipo, na classe Disciplina, getArea(): Area, ou seja um método que retorna a área de uma disciplina. A minha dúvida, em cima do que voce comentou sobre sempre retornar a referência e não o objeto, a lógica ficaria algo deste tipo....

RETORNANDO A REFERENCIA
objetoDisciplina.getArea => retornando o ID da area
Area a = new Area()
service.find(area, ID) => aqui teria o objeto Area “populado” e na memória

OU

RETORNANDO O OBJETO
Area a = new Area()
a = objetoDisciplina.getArea => neste caso o getArea retornou o objeto area referente ao objeto disciplina.

Mais uma vez obrigado pelas respostas de todos.

Abraços,