1
Relações entre Classes
e Persistência
Prof. Cesar Augusto Tacla
2
Diagrama de classes
Estrutura do sistema (classes)
Representação estática da colaboração
(relações)
Relações
associação (mais comum)
agregação (um tipo de associação),
generalização/especialização
dependência
3
Associação
Professor leciona Disciplina
Objetos de uma classe se associam a objetos de outra Nome da
associação
Multiplicidade das relações
Repr Significado
1
Exatamente uma
0.. *
*
Zero ou mais
1.. *
Uma ou mais
0..1
Zero ou uma
5..8
Faixa específica (5, 6, 7, or 8)
4..7,9 Combinação (4, 5, 6, 7, or 9)
5
Multiplicidade: exemplo
Professor Disciplina leciona 1..* 1 João José Maria Matemática Física quim História 6Multiplicidade: exercício
João José Maria FIAT AXY8704 FUSCA BHY9910 CORCEL ATT1020Qual a representação em UML para o caso seguinte?
7
Multiplicidade: exemplo
Qual a representação em UML para o caso seguinte?
Faça um exemplo com instâncias que ilustre a representação.
Uma pessoa participa de no máximo 3
projetos, mas pode ser que não participe
de nenhum.
Um projeto pode ter vários participantes
e somente começa a existir quando o
primeiro participante é designado.
Navegabilidade: unidirecional
Professor
leciona
Disciplina
Não navegável
9
Navegabilidade: bidirecional
navegável navegável
Professor
leciona
Disciplina
Direção de leitura
10
Navegabilidade: não especificada
Professor
leciona
Disciplina
Não especificada
Não especificada
11
Papéis
Empresa Trabalha ou emprega ? Pessoa
Qual a interpretação desejada?
pessoa trabalhapara Empresa ou
empresa trabalha(presta um serviço) para Pessoa;
Trabalha Emprega (contrata)
empresa empregaPessoa ou
pessoa emprega(contrata) Empresa
Papéis
Empresa empregador empregado Pessoa
Papel de
empresa Papel de
pessoa Uso de papéis pode suprimir ambigüidades
13
Associações reflexiva
Objetos de uma classe se relacionam com
objetos da mesma classe
14
Associação reflexiva: exemplo 1
Pessoas
Pessoa
0..*
filho
pai 0..1
Mário José Maria Carlos Filho(a) paiMário é pai de Maria
15
Associação reflexiva: exemplo 2
João Maria
José Mário
Gerente
subordinado João é gerente de Maria e José
Empregado
0..* gerente
subordinado
1
José é gerente de Mário
Quem é gerente de João?
Classes Associativas
Aluno -nome: String -matricula: int Disciplina -nome: String -código: String -cargaHoraria: int Inscrição -semestre: int -ano:int -nota:float 1..* 1..*Quando uma relação associativa possui atributos próprios pode ser transformada em classe.
17
Classes associativas: características
Normalmente
em relações de
multiplicidade *:*
Não é nomeada
: somente a classe
associativa
Classes associativas podem estar
relacionadas
a outras classes.
18
Exercício 1
class Casa Casa Pessoa Casa Pessoa 0..* é propriedade 1 +propriedade 1..* +proprietário 0..* Em relação aos relacionamentos abaixo responda:1. Qual a representação mais correta – a primeira ou a segunda relação? Por quê?
2. O que é preciso mudar na segunda relação para representar que uma casa possui diversos proprietários ao longo do tempo?
19
Exercício 2
Qual a diferença de interpretação entre as duas representações? Qual seria mais indicada para um tribunal regional eleitoral (identidade do eleitor não deve ser conhecida)? Apostila UML, pg. 63, n. 2 class eleições Pessoa Pessoa eleitor 0..* vota > candidatoPresidente 0..1 eleitor 0..* vota > candidatoPresidente 0..1
Exercício 4: classes associativas
Modele num diagrama de classes:
Uma companhia aérea oferece vôos
Número do vôo
Data e horário de partida
Duração
Passageiros tem programa de fidelidade
Número do cartão de fidelidade
Nome
Sobrenome
21
Solução exercício
Vôo -num: int -data: Date -duração: int Passageiro -nome: String -sobrenome: String -numCartao: int CréditoMilha quantidade: int 0..* 0..* 22Levantamento das associações
Examinar
Regras do negócio,
Modelo do domínio
Requisitos funcionais
Casos de uso
Diagramas de interação
23
Levantamento de associações
Exemplo:
regras do negócio de uma biblioteca
“um aluno pode emprestar no máximo quatro
obras”
Aluno Empresta 0..4 Livro
0..1
Levantamento das associações
sd análise casos de uso:meteorologista
:IUConv ersao :CtrlConv ersao :Historico :Conv ersaoCF
solicitar valor Celsius valor Celsius? c c converter valor c guardar conversao valor Fahrenheit mostrar valor convertido
25
Implementação de associações
unidirecional 1:1
class
Professor
{
private Disciplina disc = new Disciplina(“FP2”);
// disciplina pode ser instanciado em outro local
// outros atributos
// métodos
}
E se fosse bidirecional?
Professor 1 Leciona 1 Disciplina
26
Implementação bidirecional 1:1
1. class Professor{
2. private Disciplina disc;
3. public associar (Disciplina disc) { 4. this.disc = disc;
5. } 6. // métodos 7. }
8. class Disciplina{
9. private Professor prof;
10. public associar (Professor prof) { 11. this.prof = prof;
12. } 13. // métodos 14.}
27
Unidirecional 0..1 : 0..5
class Professor Professor Disciplina 0..1 leciona 0..5Unidirecional 0..1 : 0..5
Implementação 1
1.class Professor {2. private Disciplina[] disciplinas = {
3. new Disciplina(), 4. new Disciplina(), 5. new Disciplina(), 6. new Disciplina(), 7. New Disciplina(), 8. }; 9.} A instanciação pode ocorrer em outros pontos da classe class Professor Professor Disciplina 0..1 leciona 0..5
29
Unidirecional 0..1 : 0..5
Implementação 2
1.class Professor{
2. private Disciplina[] disciplinas; 3.
4. public void associar(Disciplina[] disc) {
5. 6. if (disc.length > 5) 7. return; 8. disciplinas = disc; 9. } 10.} class Professor Professor Disciplina 0..1 leciona 0..5 30
Multiplicidade 1:*
1.class Professor{2. private Vector<Disciplina>disciplinas =
3. new Vector<Disciplina>(5, 3);
4. public void adicionarDisciplinas(Disciplina[] disc){
5. for (int i=0; i < disc.length; i++)
6. disciplinas.add(disc[i]); 7. ... 8. } 9.} class classes Professor Disciplina 1 * http://java.sun.com/docs/books/tutorial/java/generics/erasure.html
31
Bidirecional multiplicidade *:*
1.public class Projeto {
2. public Vector<Pessoa> emprega; 3. ...
4.}
5.public class Pessoa {
6. public Vector<Projeto> participa; 7. ...
8.}
class muitos para muitos
Projeto +emprega Pessoa
0..*
+participa 0..*
Associações reflexivas
class associação reflexiv a
Professor Disciplina 1 * +preRequisito 0..* +temPrerequisito 0..*
1.public class Disciplina {
2. public Vector<Disciplina> temComoPreReq; 3. public Vector<Disciplina> ehPreReqDe; 4. ...
5.}
+temComoPreReq
33
Exercício
Implementar as relações da transparência
anterior de acordo com a grade do curso
Disciplina FP2 APOO ED FÍSICA Tem pré-requisitos FP1 é pré-requisito de APOO ED Professor TACLA Solução JAssociaoReflexPrePosRequisitos 34
Classes Associativas
class classe associativ a
Proj eto Pessoa
Participacao - cargaHoraria: int - dataEntrada: Date - dataSaida: Date +emprega 0..* +participa 0..* Equivale à...
35
Classes Associativas (2)
class classe associativ a (proj)
Projeto Participacao Pessoa
- cargaHoraria: int - dataEntrada: Date - dataSaida: Date 1 possui 0..* 1 participa 0..* Implementação >>>>
Diagrama de classes na atividade de Projeto
Classes Associativas (3)
1.public class Projeto {
2.public Vector<Participacao> m_Participacao;
3. ...
4. }
5.public class Pessoa {
6. public Vector<Participacao> m_Participacao;
7. ...
8.}
9.public class Participacao {
10.private int cargaHoraria;
11.private Date dataEntrada;
12.private Date dataSaida;
13. public Projeto projeto;// se relação for bidirecional
14. Public Pessoa pessoa; // se relação for bidirecional
15. ...
37
AGREGAÇÃO
Composição/pertinência
associação
Parte
Todo
Propagação
class Classe JanelaBotão ComboBox ScrollBar
3 1 1 1 0..1 1 Exercício: desenhe uma instância possível da classe janela 38
Agregação: adornos
class Classe Time Jogador * * Qual a interpretação?39
Tipos de agregação
Composição
Associação
class Classe JanelaBotão ComboBox ScrollBar 3 1 1 1 0..1 1 class Classe Time Jogador * *
Agregação por composição
Relação forte
Destruição do todo se propaga para as partes
Tempo de vida do todo = das partes
41
Exemplo: agregação por composição
class Linha {
public String id;
private
Ponto pt1 = new Ponto(10, 20);
private
Ponto pt2 = new Ponto(15, 30);
class Ponto {
…
}
}
Linha 1 2 Ponto 42Agregação por associação
Relação mais fraca que anterior
Tempos de vida diferentes
43
Agregação: diferença
Levantamento de agregações
Decomposição
dividir classe complexa
Composição
Coleção de objetos reunidos
barra de rolagem + menu + text area = janela
Partes comuns
classes com subconjunto de atributos
45
Exercício 1
Qual a diferença de interpretação entre os relacionamentos livro-sobrecapa e livro-páginas?
Apostila UML, pg. 64, n. 4
46
Exercício 2
Todo aluno matriculado em trabalho de diplomação será orientado por um professor. Alguns professores orientam vários alunos e outros, nenhum.
Qual dos diagramas melhor representa esta relação?
47
Agregação por composição
class agregação por composição
HistoricoPagsWeb URLVisitada
- URL: String
0..* 1
Implementação >>>
Agregação por composição (2)
1.class URLVisitada {
2. private String url; 3.
4. URLVisitada (String url) { 5. this.url = url;
6. } 7.}
8.class Historico {
9. // cria três objetos da classe URLVisitada
10. private URLVisitada[] historico = { // ou coleção 11. new URLVisitada("http://www.uol.com.br"), 12. new URLVisitada("http://www.terra.com.br"), 13. new URLVisitada("http://www.lemonde.fr"), 14. }; 15.… 16.} Implementação >>>
49
Agregação por composição (3)
1.class Historico {
2. private class URLVisitada { 3. private String url; 4. private Date data; 5. private int freq;
6. URLVisitada (String umaURL) { 7. url = umaURL;
8. }
9. ... 10. }
11. private Vector<URLVisitada> historico =
12. new Vector<URLVisitada>(4, 2);
13. ... 14. 15.}
como private, a URLVisitada só pode ser instanciada dentro do escopo do todo
Classe aninhada
50
Agregação por associação
51
GENERALIZAÇÃO
Classes
compartilham
atributos e
comportamentos
É um tipo de
Herda atributos e
métodos
Relação de generalizaçãoGENERALIZAÇÃO
53
Taxonomia: hierarquia de classes
Atributos e operações comuns
Atributos e operações específicas
54
Qualidade de uma hierarquia
Estável
: critérios de classificação não
mudam ao longo do tempo.
Extensível
: é fácil incluir novas classes
derivadas na hierarquia
55
Princípio da substituição
Qualquer instância de uma classe derivada
pode ser tratada como se fosse uma instância
de uma classe base
sem alterar a semântica
de um programa escrito para a classe base.
Exemplo
Círculo e polígonos podem ser tratados como
57
Exemplo: taxonomia mal feita
Livro
LivroEmprestado LivroDisponível
Não construir hierarquias em função de estados das classes
58
Herança múltipla
Obj etoVoador
Av ião Helicóptero Pássaro
59
Dependência
Variável local
Parâmetro de operação (método)
Instanciação
Atributos indicam associação
Dependência: exemplos
class Dependência ClasseA + operacao(ClasseC) : void ClasseB ClasseC ClasseD «local» «parameter» «instantiate»61
Exercício
Desenhe o diagrama de classes para as
relações das classes marcadas em
vermelho
public class Aluno { public Curso curso; public int CEP;
public void setCEP(Endereco end) {
CEP = end.CEP; }
public int calcularIdade() { // retorna idade em meses
Date d = getCurrentDate(); ... } } 62
Exercício (solução)
Aluno Date Endereço Curso 1 matriculado <<parâmetro>> <<local>>Multiplicidade no lado aluno não foi colocada pois não temos informação – indefinida
-63
Realização
«entity» Historico + adicionar(ConversaoCF) : void - writeObject() : void «interface» Serializable «instantiate» 1 «entity» Historico + adicionar(ConversaoCF) : void - writeObject() : void «interface» Serializable «instantiate» 11.public interface Serializable {
2. ...
3.}
4.public class Histórico implements Serializable {
5. ...
6.}
Exercício (enunciado)
Programa cliente para envio de emails O programa deve permitir ao usuário:
1. enviar emails a um ou mais destinatários selecionados de uma agenda composta por contatos no formato (nome, endereço email). A agenda pode ser definida no próprio código, mas deve ser mostrada para que o usuário possa selecionar os destinatários.
2. consultar todos os emails enviados a um determinado destinatário. Ao clicar em uma entrada da agenda, o programa deve mostrar todos os emails enviados ao destinatário selecionado sem ter que percorrer toda a lista de emails enviados. Detalhes
Um email é composto pelos três campos a seguir: remetente, destinatários, assunto e corpo.
65
Exercício (cont.)
Para enviar emails
Utilizar a API JavaMail (há várias implementações desta API)
Uma delas (e suas diferentes versões) são encontradas em
http://java.sun.com/products/javamail/downloads/index.html
Baixar o .zip Extrair o mail.jar
Colocar na pasta de projeto No NetBeans, importar biblioteca
alternativa ao JavaMail
http://commons.apache.org/email/
JAVARepositorio\JMailClient: solução que envia email. Tem um frame , mas ainda não funciona.
66
Exercício (tarefas)
Tarefa 1
No enunciado dado, marque todos os substantivos
candidatos a classes (entregar o texto marcado)
Refletir sobre quais classes são necessárias e
como elas conversam para que o programa realize
sua função.
Construir um diagrama de classes em um editor
qualquer de UML. Não esquecer dos
relacionamentos, multiplicidade e nome nas
associações
67
Exercício (instruções)
Instruções gerais:
Pode ser feito em <x>
Valor <v>
Data de entrega/apresentação: <dd/mm>
Apresentar
Enunciado com os substantivos candidatos a classes
marcados (impresso)
diagrama de classes preliminar (impresso)
diagrama de classes final (impresso)
código fonte e funcionamento (em sala)
Exercício (exemplo de envio)
Agenda
João jl@uol.com.br Maria ma@utfpr.edu.br José jjj@bol.com.br
Destinatários:
Assunto: nonono nono nono on João e José,
Favor comparecer com urgência na sala B109. []s
Tereza
Ao enviar email, o usuário seleciona os destinatários da agenda De:
69
Exercício (exemplo de consulta)
Agenda
João jl@uol.com.br Maria ma@utfpr.edu.br José jjj@bol.com.br
Emails enviados ao João
Destinatários data assunto
João, José 14/4/2007 nono non onon ono João, Maria 14/4/2007 bla blalba
Supor que o João foi selecionado na agenda. O programa mostra todos os emails que lhe foram enviados (pode haver outros destinatários).