quando um relacionamento não é suficiente · figura 3a) - relacionamento “zero-para-muitos”...
TRANSCRIPT
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 ). 1Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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 ). 2Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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 sexta-feira
das 15:50 às 17:30
2 2012
IF62C S14 Q103 sexta-feira das 08:20 às
12:00
2 2012
... ... ... ... ... ...
! 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 ). 3Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
! 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 ). 4Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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 ). 5Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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 ). 6Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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 ). 7Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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 _nota; private float _faltas; public Turma _Turma_; public Aluno _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 ). 8Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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 ). 9Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
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();
public: void setAno(int aAno); };}
#endif
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 10Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
3.3 historico.husing 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ício1) 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 ). 11Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.
DisciplinaPre GradePre PeriodoPre Disciplina Grade Periodo
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.
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.
UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 12Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.