UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 1 Quando um Relacionamento não é suficiente ! 1. Introdução ! ! Em alguns casos, durante o processo de modelagem, um relacionamento deixa de ser apenas um relacionamento. Isso acontece quando o relacionamento possui informações importantes que devem ser registradas ou processadas. São informações que caracterizam e especificam o relacionamento. ! Por exemplo, o diagrama de classes da Figura 1 a seguir, descreve uma situação típica onde isso poderia acontecer e quando isso não ocorre. Figura 1 - Classes Disicplina, Turma e Aluno e seus Relacionamentos UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 2 Quando apenas o Relacionamento é Suficiente para Representar as Informações: ! Na Figura 1, a classe Disciplina possui um relacionamento “1..*” com a classe Turma. Logo, conforme ilustram as Figuras 2a) e 2b), interpreta-se essa representação de relacionamento, da seguinte maneira: • Uma determinada Disciplina pode ser ofertada em uma ou mais turmas (Figura 2a) . • Uma determinada Turma está associada a uma única Disciplina (Figura 2b). Figura 2a) - Uma Disciplina “tem” uma ou mais turmas Figura 2b) - Uma Turma está relacionada a apenas uma Disciplina ! Ou seja, uma determinada disciplina chamada IF62C poderia ter várias turmas, conforme ilustra a Tabela 1. A Classe Turma permite representar que essa disciplina poderia ser ministrada em uma específica sala de aula (sala de aula Q203), possuir um determinado horário (“Quarta-feira e sexta-feira das 15:50 às 17:30” ) e ser ofertada no UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 3 2o. semestre de 2012. De maneira similar, uma outra turma da mesma disciplina poderia ser a turma S14. Essa turma poderia ser ofertada no horário de “sexta-feira das 08:20 às 12:00” em uma outra sala, por exemplo a sala Q103. Outras informações da relação entre disciplina e turma poderiam ser representadas ela estrutura, conforme ilustra a Tabela 1. Tabela 1 - Esttruruta de Informações do exemplo analisado Disciplina.Codigo Turma.codigo Turma.sala Turma.horario Turma.semestre Turma.Ano IF62C S13 Q203 Quarta-feira e 2 2012 2 2012 ... ... sexta-feira das 15:50 às 17:30 IF62C S14 Q103 sexta-feira das 08:20 às 12:00 ... ! ... ... ... Por uma questão de limitação de escopo, a propriedade que indicaria quem é o professor foi omitida desse exemplo. ! Como pode-se observar, o relacionamento Disciplina-Turma apenas indica uma relação entre essas duas classes. Não há informação complementar do relacionamento que foi definida como sendo importante. Uma turma relaciona-se com uma disciplina. Uma disciplina relaciona-se com várias turmas. Quando apenas o Relacionamento NÃO é Suficiente para Representar as Informações: ! Por outro lado, de acordo com a Figura 1, existe um relacionamento entre a classe Aluno e a classe Turma. Nessa representação os relacionamentos indicados permitem afirma que: • uma Turma pode ser cursada por nenhum ou por vários Alunos. Esse relacionamento é ilustrado na Figura 3a). • um Aluno pode cursar nenhuma ou várias turmas, conforme ilustra a Figura 3b). UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. ! 4 O relacionamento “cursa” apresenta a multiplicidade “0..*” nos dois lados da linha que liga as duas classes, conforme ilustra a Figura 1. A utilização da multipliciade “0..*” ou “1..*” não influencia na explicação a seguir. ! Algumas outras informações específicas desse relacionamento poderiam ser importantes o suficiente para serem registradas. Por exemplo, a “Nota” e a “Quantidade de Faltas” que o aluno teve durante o transcorrer das aulas na turma que ele está associado. ! As informações “Nota” e “Quantidade de Faltas” , ou simplesmente Falta, são específicas do Relacionamento entre os objetos da classe Aluno e da classe Turma. ! As informações Nota e Falta, de maneira isolada não pertencem apenas à classe Aluno nem apenas à classe Turma. ! Elas compõe, formam ou especificam o relacionamento que o Aluno tem, têve ou terá com a Turma. Nesse tipo de situação, há a necessidade de se modificar o diagrama da Figura 1 para permitir representar os detalhes dessa associação. ! Para representar essas informações específicas do relacionamento, uma outra classe deve ser definida. Essa classe recebe o nome de Classe Associativa. ! Uma Classe Associativa deve ser definida sempre que: * Houver necessidade de se registrar informações específicas do relacionamento e * houver um relacionamento “N para N” entre as duas classes em questão. O que é um relacionamento “N para N”? Quando duas classes se relacionam e a multiplicidade do relacionamento nos dois lados é “0..*” ou “1..*”, conforme exemplificado, diz-se que esse relacionamento é de “N para N”. ! No exemplo das Figuras 3a) e 3b), o relacionamento entre Turma e Aluno é de “N para N”. A presença do indicador de multiplicidade “0..*” nos dois lados do relacionamento caracteriza isso. Sendo o relacionamento de “N para N” entre as classes Aluno e Turma e havendo necessidade de registrar aspectos específicos dessa relação, nesse exemplo Nota e Faltas, define-se uma Classe Associativa para isso.! UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 5 Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos” entre a classe Aluno e Turma. ! A Classe Associativa, utilizada nesse exemplo, foi denominada “historico” na Figura 4. Optou-se por utilizar caracter minúsculo no início do nome da classe apenas para destacar que se trata de uma classe Associativa. A Classe Associativa é representada por UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 6 um símbolo de classe e possui uma linha tracejada ligando-a à relação que ela especifica ou complementa. ! Figura 4) - Diagrama de Classes da Figura 1 expandido com a Classe Associativa “historico” 2.Códigos das Classes na linguagem Java. ! Nas Seções 2.1 a 2.3 são apresentados a estrutura básica dos códigos na linguagem Java das classes Aluno, Turma e historico. Os atributos que definem o relacionamento entre as classes foram destacados pela cor vermelha e fonte itálica. ! Os métodos necesários para o registro do historico nas classes Aluno e Turma foram omitidos. UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 7 2.1 Classe Aluno /* O relacionamento com a classe associativa historico é destacado na cor vermelha */ package universidade; import java.util.Vector; import universidade.historico; public class Aluno { private String _codigo; private String _nome; private String _cPF; public Vector<historico> _registra = new Vector<historico>(); public String getCodigo() {return this._codigo;} public void setCodigo(String aCodigo) {this._codigo = aCodigo;} public String getNome() {return this._nome; } public void setNome(String aNome) {this._nome = aNome;} public String getCPF() {return this._cPF;} public void setCPF(String aCPF) {this._cPF = aCPF;} } // fim da definição da classe Aluno UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 8 2.2 Classe Turma /* O relacionamento com a classe associativa historico é destacado na cor vermelha */ package universidade; import java.util.Vector; import universidade.historico; public class Turma { private String _codigo; private String _sala; private String _horario; private char _semestre; private int _ano; public Disciplina _tem; public Vector<historico> _registra = new Vector<historico>(); public String getCodigo() {return this._codigo;} public void setCodigo(String aCodigo) {this._codigo = aCodigo;} public String getSala() {return this._sala;} public void setSala(String aSala) {this._sala = aSala;} public String getHorario() {return this._horario;} public void setHorario(String aHorario) {this._horario = aHorario;} public char getSemestre() {return this._semestre;} public void setSemestre(char aSemestre) {this._semestre = aSemestre;} public int getAno() {return this._ano;} public void setAno(int aAno) {this._ano = aAno;} }// fim da classe Turma 2.3 Classe “historico” package universidade; public class historico { private float private float public Turma public Aluno _nota; _faltas; _Turma_; _Aluno_; public float getNota() {return this._nota;} public void setNota(float aNota) {this._nota = aNota;} public float getFaltas() {return this._faltas;} public void setFaltas(float aFaltas) {this._faltas = aFaltas;} public void setTurma(Turma _Turma_) {this._Turma_ = _Turma_;} UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 9 public Turma getTurma() {return this._Turma_;} public void setAluno(Aluno _Aluno_) {this._Aluno_ = _Aluno_;} public Aluno getAluno() {return this._Aluno_;} }// fim da classe Associativa “historio”. 3.Códigos “.h” das Classes na Linguagem C++ ! Similar à Seção 2, os atributos que representam o relacionamento são apresentados com fonte na cor vermelha e em itálico. 3.1 Aluno.h #ifndef __Aluno_h__ #define __Aluno_h__ #include "historico.h" namespace universidade { class historico; class Aluno; } namespace universidade { class Aluno { private: String _codigo; private: String _nome; private: String _cPF; public: std::vector<universidade::historico*> _registra; public: String getCodigo(); public: void setCodigo(String aCodigo); public: String getNome(); public: void setNome(String aNome); public: String getCPF(); public: void setCPF(String aCPF); } }; #endif UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 10 3.2 Turma.h #ifndef __Turma_h__ #define __Turma_h__ #include "Disciplina.h" #include "historico.h" namespace universidade { class Disciplina; class historico; class Turma; } namespace universidade { class Turma { private: String _codigo; private: String _sala; private: String _horario; private: char _semestre; private: int _ano; public: universidade::Disciplina* _tem; public: std::vector<universidade::historico*> _registra; public: String getCodigo(); public: void setCodigo(String aCodigo); public: String getSala(); public: void setSala(String aSala); public: String getHorario(); public: void setHorario(String aHorario); public: void getAttribute(); public: void setAttribute(string aAttribute); public: char getSemestre(); public: void setSemestre(char aSemestre); public: int getAno(); } }; #endif public: void setAno(int aAno); UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 11 3.3 historico.h using namespace std; #ifndef __historico_h__ #define __historico_h__ #include "Turma.h" #include "Aluno.h" namespace universidade { class Turma; class Aluno; class historico; } namespace universidade { class historico { private: float _nota; private: float _faltas; public: universidade::Turma* _Turma_; public: universidade::Aluno* _Aluno_; public: float getNota(); public: void setNota(float aNota); public: float getFaltas(); public: void setFaltas(float aFaltas); public: void setTurma(universidade::Turma*_Turma_); public: universidade::Turma* getTurma(); public: void setAluno(universidade::Aluno*_Aluno_); } }; public: universidade::Aluno* getAluno_(); #endif 4.Exercício 1) Na Figura 1, a classe Disciplina possui um auto-relacionamento representado por “preRequisito”. Uma informação importante desse relacionamento para a secretaria da universidade ou para o coordenador do curso, seria informar o período das disciplinas na grade. A tabela a seguir exemplifica essas informações. ! Nessa tabela, a disciplina IF61C, pertencente à grade 1, no período 1 é pré-requisito da disciplina IF62C também da grade 1 e do período 2. Nesse instante, vamos supor que tenha ocorrido uma reforma da grade curricular e outra grade foi defina, a grade 2. Na grade 2, essas duas disciplinas estão posicionadas em períodos diferentes da grade 1. UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas. 12 DisciplinaPre GradePre PeriodoPre Disciplina IF61C 1 1 IF62C 1 2 IF61C 2 2 IF62C 2 4 .... .... .... ... ... ... ! Quais modificações são necessárias no diagrama da Figura 1? ! Implemente essas modificações. Grade Periodo 2) A bilbiografia e outros livros de computação apresentam diversos exemplos de relacionamento N para N entre duas classes. Por exemplo, o relacionamento “Paciente-Médico” ou “Música - CD” ou “Ator-Filme”. a) Escolha um desses exemplos e defina as duas classes e a correspondente Classe Associativa. b) Implemente as classes em uma linguagem de programação OO.