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