UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
1
Quando um Auto-Relacionamento não é
mais um Auto-Relacionamento
!
1. Introdução !
!
Em algumas situações, durante o processo de modelagem, um relacionamento
deixa de ser um relacionamento. Isso acontece quando esse relacionamento possui
informações que devem ser registradas ou processadas. O relacionamento possui
detalhes que precisam ser armazenados.
!
Por exemplo, a classe Pessoa é reapresentada na Figura 1. Nessa figura, a classe
Pessoa é definida apenas pelos atributos Nome, CPF e Genero. Essa classe, se
investigada com “uma lente de aumento” poderia apresentar em seus autorelacionamentos alguns detalhes que poderiam ser interessantes.
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
2
Figura 1 - Classe Pessoa e seu Auto-relacionamento “casada-com”
!
Por exemplo, o auto-relacionamento “casada_com” registra apenas registra com
quem uma pessoa é casada. Esse auto-relacionamento poderia ser expandido de tal
forma a registrar outras informações, tais como:
• quando ocorreu o casamento?
• em que local?
• o casamento foi religioso ou não?
!
Nesses casos de necessidade de expansão, há a necessidade de se definir uma
nova classe para armazenar esses “novos” atributos. A Figura 2 representa uma possível
representação dessa classe que representa os detalhes do auto-relacionamento, a classe
Matrimonio.
Figura 2 - Classe Matrimonio que expande a representação do auto-relacionamento “casada_com”
!
Nesse exemplo, o auto-relacionamento “casadaCom” foi substituído pela classe
Matrimonio. O relacionamento escolhido e definido entre a classe Pessoa e a classe
Matrimonio foi a Agregação. Isso é representado na Figura 2 pelo símbolo “diamante” ao
lado da classe considerada “mais importante” da relação.
!
A Agregação deve ser utilizada quando houver a necessidade de representar um
todo (classe Matrimonio) que é composto por várias partes (classe Pessoa). As partes da
Agregação (classe Pessoa) também podem ser utilizadas em outros relacionamentos ou
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
3
partes de uma aplicação ou sistema computacional e podem ser referenciados por outros
objetos ou classes.
!
Por outro lado, o todo (classe Matrimonio) necessita das partes para a sua
definição. Não faz sentido uma representação de um matrimônio sem a presença de duas
instâncias da classe Pessoa. Para representar esse conceito, a classe que representa o
todo, recebe o símbolo diamante.
!
A implementação da classe Matrimonio poderia ser feita na linguagem Java da
seguinte maneira:
2. Exemplo de Implementação em Java:
2.1) Classe Matrimonio
public class Matrimonio
{
!
private int dia;
!
private int mes;
!
private int ano;
!
private String local;
!
private boolean religioso;
!
public Pessoa conjuges[] = new Pessoa[2];
/* por serem apenas dois conjuges e não haver nada no diagrama de
classes que defina a forma de implementação, optou-se por utilizar
um array de duas posições de elementos da classe Pessoa. */
!
!
public int getDia() {
!
public void setDia(int aDia) {
!
public int getMes() { return this.mes;}
!
public void setMes(int aMes)
!
!
{!
return this.dia;}
this.dia = aDia; }
if (aMes > 0) if (aMes < 12) this.mes = aMes; }
public int getAno() {
return this.ano; }
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
!
public void setAno(int aAno) { this.ano = aAno; }
!
public String getLocal() { return this.local; }
!
public void setLocal(String aLocal) { this.local = aLocal; }
!
public boolean getReligioso() { return this.religioso; }
!
public void setReligioso(boolean aReligioso)
!
{ this.religioso = aReligioso;}
4
/* métodos a seguir não foram definidos no diagrama de classe:
>> setConjuges(Pessoa, Pessoa)
>> getConjuge(int)
>> print()
*/
!
public void setConjuges(Pessoa p1, Pessoa p2)
!
{
if (conjuges[0] != null)
{
!
!
/* limpa as informações anteriores
!
antes de guardar as novas*/
conjuges[0].removeMatrimonio();
conjuges[1].removeMatrimonio();
}
p1.setMatrimonio(this); p2.setMatrimonio(this);
!
!
!
}
conjuges[1]=p1; conjuges[0]=p2;
public Pessoa getConjuge(int i)
{
!
!
if ( i < 0) return conjuges[0];
else if ( i > 1) return conjuges[1];
! !
!
else return conjuges[i];
}
public void print()
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
{
String texto ="Registro de Matrimonio entre:";
texto += "\n# Nome:" + conjuges[0].getNome() + "\t"
+ conjuges[0].getCPF();
texto += "\n# Nome:" + conjuges[1].getNome() + "\t"
+ conjuges[1].getCPF();
texto += "\n Realizado em " + this.dia
!
!
!
!
!
!
!
+ "/" + this.mes
!
!
!
!
!
!
!
+ "/" + this.ano;
if (religioso) ! texto += "\n Casamento religioso.";
else ! !
!
texto += "\n Casamento não religioso";
System.out.println(texto);
}
}
2.2) Código da Classe Pessoa:
import java.util.Vector;
public class Pessoa {
!
private String nome;
!
private String cpf;
!
private char genero;
!
public Vector<Pessoa> _amizadeCom = new Vector<Pessoa>();
!
public Matrimonio conjuges;
public boolean equals(Pessoa outra)
{ if (outra.nome.equalsIgnoreCase(this.nome))
if (outra.cpf.equalsIgnoreCase(this.cpf))
return true;
return false;
}
public void setMatrimonio(Matrimonio m)
{conjuges = m;}
5
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
6
/* o método removeMatrimonio a seguir não estava definido no
diagrama de classes. O programador (eu) decidiu inseri-lo, com a
concordância prévia do projetista da classe (de novo eu). */
public void removeMatrimonio() {conjuges = null;}
public Pessoa getConjuge()
{ Pessoa saida=null;
if (conjuges == null) return saida;
else { if (conjuges.getConjuge(0).equals(this) == false)
!!
else !
saida = conjuges.getConjuge(0);
saida = conjuges.getConjuge(1); }
return saida;
}
!
public String getNome() { return this.nome; }
!
public void setNome(String aAttribute) { this.nome = aAttribute; }
!
public String getCPF() { return this.cpf; }
!
public void setCPF(String aV) { this.cpf = aV; }
!
public char getGenero() { return this.genero; }
!
public void setGenero(char aV) { this.genero = aV; }
public void print()
{
String texto = "Dados da Pessoa:";
texto += "\n Nome:" + nome;
texto += "\n CPF:" + cpf;
texto += "\n Genero: " + genero;
if (conjuges != null)
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
7
texto += "\n Relação Matrimonial com " + getConjuge().nome;
System.out.println(texto);
}
}
2.3) Programa principal de teste das classes.
public class Main {
public static void main(String[] args) {
Pessoa p1 = new Pessoa();
p1.setNome("Jose da Silva"); p1.setGenero('M');
p1.setCPF("12345");
Pessoa p2 = new Pessoa();
p2.setNome("Maria Silva"); p2.setGenero('F');
p2.setCPF("67676");
Matrimonio m = new Matrimonio();
m.setDia(28); m.setAno(2010); m.setMes(3);
m.setReligioso(true);
m.setLocal("Igreja do Jesus Salvador");
m.setConjuges(p2, p1);
m.print();
System.out.println("\n\n Dados do Primeiro Conjuge:\n"); p1.print();
System.out.println("\n\n dados do Segundo Conjuge:\n"); p2.print();
}
}
3) Exercício.
3.1) Modifique o diagrama da Figura 2. Deseja-se armazenar também os detalhes da
relação “amizadeCom”. As informações a serem registradas são:
• Dia em que se conheceram
• Mes em que se conheceram
• Ano em que se conheceram
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ).
Prof. Robinson Vida Noronha e Danillo Belmonte
Tema: Quando um (auto)relacionamento não é mais um (auto)relacionamento.
8
• Local em que se conheceram
• Se é melhor amigo(a)
• Atividades que fizeram juntos
!
Desenhe o diagrama de classes com essas modificações e as implemente em uma
linguagem de programação
Download

Quando um Auto-Relacionamento não é mais um Auto