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.
Download

Classes Associativas