quando um relacionamento não é suficiente · figura 3a) - relacionamento “zero-para-muitos”...

12
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 ). 1 Prof. Robinson Vida Noronha e Danillo Belmonte Tema: Classes Associativas.

Upload: others

Post on 14-Nov-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 2: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 3: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 4: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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

Page 5: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 6: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 7: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 8: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 9: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 10: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 11: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.

Page 12: Quando um Relacionamento não é suficiente · Figura 3a) - Relacionamento “zero-para-muitos” entre a classe Turma e Aluno. Figura 3b) - Relacionamento “zero-para-muitos”

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.