Sem entrar no m�tiro de como deveria ser modelado este caso espec�fico, gostaria de diser que uma classe pode referenciar outra sem que exista um relacionamento do tipo agrega��o entre elas.
 
Se isto n�o for verdade, como representariamos uma associa��o simples em c�digo? N�o representariamos? Ou ao inv�s de representar uma associa��o diretamente teriamos que criar uma outra classe que agregasse as duas classe associadas somente para ter um caminho, uma navegabilidade entre as duas classes associadas?
 
Tenho aqui uma apostila do curso Object Oriented Analysis and Design With C++ que mostra como implementar os modelos definidos usando UML em C++. Nesta apostila h� o seguinte exemplo sobre como implementar uma associa��o de multiplicidade 1 ou 0..1:
 
           0..*        1
Course ------------ Professor
 
class Professor {}
 
class Course {
   private:
   Professor *teacher; 
}
 
que em java seria:
 
class Professor {}
 
class Course {
   private Professor teacher; 
}
 
Ou seja, uma associa��o _�_  implementada como uma referencia.
 
Nesta mesma apostila � o seguinte sobre agrega��o:
 
Uma agrega��o _�_ uma especializa��o de uma associa��o em que o "todo" � relacionado a suas partes. A apostila ainda tr�s estes testes para identificar uma agrega��o:
 
A frase "parte de" � usada para descrever o relacionamento?
Algumas opera��es no todo se aplicam a parte? (ex: move o carro, move a porta)
Alguns valores de atributos se propagam do todo para as partes? (ex: o carro � azul, a porta � azul)
Existe uma assimetria intr�nsica no relacionamento, indicando uma subordina��o: (ex: Uma porta � parte do carro, o carro N�O � parte da porta)
 
Um relacionamento de agrega��o pode ser de dois tipos, por referencia e por valor. Uma agrega��o por valor implica que a "vida" dos objetos dependendes s�o restritos a "vida" do objeto que os agrega. Uma agrega��o por referencia implica que a "vida" dos objetos podem ser independentes.
 
Neste caso espec�fico de Aluno <-> Aula, creio que n�o exista agrega��o...
 
Sobre as classes de associa��o:
 
Durante o design, uma classe de associa��o se torna uma classe entreposta entre as duas classes antes diretamente associadas, sendo estabeleciadas associa��es entre a classe de associa��o e as outras duas classes com as devidas multiplicidades.
 
Leonardo Bueno.
....................................................
Leonardo Souza Mario Bueno
itera Inform�tica
[EMAIL PROTECTED]
Phone: 55 27 337 0317
Cell: 55 27 9971 1375
Visit our website at:
http://www.itera.com.br
....................................................
----- Original Message -----
Sent: Monday, March 19, 2001 1:33 PM
Subject: RES: [java-list] Para Alexandre: implementa��o de agrega��es e associa��es

 
Jorge,
 
Eu concordo com o Sven neste caso. A existencia de uma classe "Aula" ou
"Disciplina" retrata melhor o que queremos modelar. Um professor nao tem,
_necessariamente_ que estar associado a um aluno. "Professor" pode, inclusive
ser um titulo que o cara ostenta, sendo assim um conceito muito mais abrangente
do que simplesmente uma pessoa que da aulas (apesar de ser estranho, eh
possivel).
 
Acho que a interpretacao do codigo nao esta errada nao. Se voce diz que um
professor referencia um conjunto de alunos, voce esta _sim_ dizendo que
os Alunos "fazem parte" do Professor. Esta associacao eh, inclusive, problematica
sob o ponto de vista de implementacao. Eu explico:
 
1. Imagine que um professor mude de disciplina no meio do semestre ou ano letivo.
Com a sua modelagem teriamos que reassociar todos os alunos (centenas, talvez).
Com a classe "Aula" isso seria um procedimento trivial.
 
2. "Aula" (ou "Disciplina") eh uma entidade que independe de um professor especifico.
No seu caso, como modelariamos uma disciplina que eh ensinada por mais de um
professor? Teriamos que manter todos os conjuntos de associacoes simultaneamente,
o que nao eh muito eficiente. Digamos que duas disciplinas sao ensinadas, cada uma,
por tres professores e tem 100 alunos (cada). Teriamos, entao, 3 x 100 = 300 referencias
para representar uma aula. Se os professores trocassem de turma, teriamos que
atualizar 600 referencias. Um pensamento similar seria aplicado para o caso de termos
alunos cancelando disciplinas (fato extremamente comum).
 
3. Digamos que nao houve troca de professores; simplesmente o semestre acabou.
Teriamos que, novamente, atualizar MILHARES de referencias, ja que neste caso
TODOS os professores terao novos alunos. Em uma universidade com 50 mil alunos
e 5 mil professores isto pode ser um pouco caro.
 
4. Mais: depois que o semestre terminar, onde iremos buscar as informacoes a
respeito de uma determinada disciplina, ensinada em um determinado semetre?
Ou se um aluno cursou esta disciplina ou quando ele a cursou? A classe "Aula"
(cujo semestre faria parte de seu identificador -- o metodo equals() ajudaria) resolve
o problema de uma maneira elegante.
 
Acho que, por estas razoes, a existencia da classe "Aula" eh de fundamental
importancia e associar um professor diretamente a um aluno nao eh muito
eficiente.
 
Cordialmente,
 
Andre Mendonca
Sakonnet Technology, LLC
596 Broadway, Suite 1008
New York City, NY 10012
 
 

N�o concordo.
 
Um refer�ncia em java n�o representa que um objeto t�m um outro. Este objeto n�o � do outro, apenas h� uma refer�ncia para ele, coerente com a defini��o de associa��o.
 
N�o discordamos do conceito, seja dito. Mas sua interpreta��o do c�digo est� equivocada. O fato do Professor ter uma (ou mais refer�ncias) para um Aluno n�o representa que o Aluno fa�a parte do professor. E sim o comportamento destas entidades.
 
E voc� pode perceber que no meu modelo est� implementado uma rela��o bidirecional e em nenhum momento aluno faz parte de professor. Apenas n�o h� uma classe descrevendo esta associa��o.
 
N�o tenho a m�o o Rational Rose, mas acredito que uma associa��o sem "association class" ser� modelada como eu descrevi.
 
De qualquer forma esta � uma boa discuss�o, pois trata-se da implementa��o e visualiza��o de modelos em c�digo java.
 
abra�os
 
Jorge
 
 
-----Original Message-----
From: Sven van �t Veer [mailto:[EMAIL PROTECTED]]
Sent: sexta-feira, 16 de mar�o de 2001 18:09
To: [EMAIL PROTECTED]
Subject: Re: RE: RE: RES: [java-list] Para Alexandre: implementa��o de agrega��es e associa��es

Jorge Martins wrote:
[EMAIL PROTECTED]" type="cite">
Sven,
 
N�o � necess�rio ter uma classe que descreve a associa��o para ser uma associa��o. Ela s� � necess�ria quando o relacionamento det�m alguma informa��o ou possui algum comportamento pr�prio que precisa ser encapsulado.
 
A implementa��o em java para a associa��o tipicamente � uma refer�ncia para o objeto da outra classe. O que define como associ��o ou agrega��o � o comportamento das entidades.
 
abra�os

Jorge
 
ps: veja em ferramentas UML como o Together e perceba como o c�digo gerado para ambas as op��es s�o iguais, apenas com um coment�rio ao lado indicando o tipo do relacionamento.
Association de acordo com Rational:


Association
A relationship that models a bi-directional semantic connection among instances.

Aggregation
An association that models a whole-part relationship between an aggregate and its parts.

Por�m, quando uma classe faz parte de uma outra classe (a tem b) falamos de uma agrega��o. Ae, cualquer coisa assim:
class Professor{
   private Collection alunos;
}
ou
class Professor{
   private Aluno[] alunos;
}

� por defini��o uma agrega��o, ja que agora o aluno �faz parte do� professor. No caso de um relacionamento de professores e alunos n�o � a situa��o que vc quer. A informa��o sobre o relacionamento de professor com o aluno n�o � apropriado para ser contido dentro das classes. Um professor n�o *tem* alunos e o alnuno n�o *tem* professores, apesar do fato que eles tem *algum tipo* de relacionamento. Ai vem a Aula. O professor d� aula e os alunos recebem as aulas, portanto pode dizer que:
Uma aula *tem* zero ou varias professor(es) e *tem* zero ou varias alunas:
class Aula{
  private Collection alunos;
  private Collection professores;
}

Uma cone�ao semantica de uma classe com a outra (o professor que d� aulas aos alunos) � uma associa��o.

Testei ambos no Rose e no Together, mas infelizmente o Together nem d� para definir um �association class�, por�m esse modelo n�o pode ser modelado no Together, mas o Rose gera:
//Source file: c:\\temp\\Professor.java


public class Professor
{
 
  public Professor()
  {
  }
}
e
//Source file: c:\\temp\\Aluno.java


public class Aluno
{
 
  public Aluno()
  {
  }
}

e

//Source file: c:\\temp\\Aula.java


public class Aula
{
 
  public Aula()
  {
  }
}

No caso de uma associa��o bidirectional ae ter� que modelar ainda a agrega��o Aula-Aluno e Aula->Professor
ai gera:
//Source file: c:\\temp\\Aula.java


public class Aula
{
  public Professor theProfessor[];
  public Aluno theAluno[];
 
  public Aula()
  {
  }
}


Sven

[EMAIL PROTECTED]" type="cite">
 
 
 

Responder a