Você está na página 1de 37

Relações entre Classes

e Persistência
Prof. Cesar Augusto Tacla

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

1
Associação
Nome da
associação

Professor leciona Disciplina

Objetos de uma classe se associam a objetos de outra

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)

2
Multiplicidade: exemplo

Professor Disciplina
1 leciona 1..*

Matemática
João

Física
José
quim

Maria História

Multiplicidade: exercício

Qual a representação em UML para o caso seguinte?

Pessoa Carro

João FIAT AXY8704

José FUSCA BHY9910

Maria CORCEL ATT1020

3
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
Não navegável
navegável

Professor leciona Disciplina

4
Navegabilidade: bidirecional
navegável navegável

Professor leciona Disciplina

Direção
de leitura

Navegabilidade: não especificada


Não Não
especificada especificada

Professor leciona Disciplina

10

5
Papéis

Empresa Pessoa
Trabalha ou emprega ?

Qual a interpretação desejada?

Trabalha Emprega (contrata)


pessoa trabalha para Empresa empresa emprega Pessoa ou
ou pessoa emprega (contrata) Empresa
empresa trabalha (presta um
serviço) para Pessoa;

11

Papéis

Empresa empregador empregado Pessoa

Papel de
empresa Papel de
pessoa

Uso de papéis pode suprimir ambigüidades

12

6
Associações reflexiva

Objetos de uma classe se relacionam com


objetos da mesma classe

13

Associação reflexiva: exemplo 1


Pessoa filho

0..*

pai 0..1

Pessoas

Mário
Mário é pai de Maria
Filho(a) José pai
Quem é o pai de Mário?
Maria

Carlos

14

7
Associação reflexiva: exemplo 2

Empregado
subordinado
0..*

gerente 1

Gerente
João
subordinado João é gerente de Maria e José
Maria
José é gerente de Mário
José

Mário Quem é gerente de João?

15

Classes Associativas

Aluno Disciplina
1..* 1..*
-nome: String -nome: String
-matricula: int -código: String
-cargaHoraria: int

Inscrição

-semestre: int
-ano:int
-nota:float

Quando uma relação associativa possui atributos próprios


pode ser transformada em classe.
16

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

17

Exercício 1
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?
class Casa

Casa
é propriedade Pessoa

0..* 1

Casa Pessoa
+propriedade +proprietário

1..* 0..*

Apostila UML, pg. 63,


18 n. 1

9
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)?

class eleições

eleitor
0..* eleitor 0..*
Pessoa
Pessoa
vota > vota >

candidatoPresidente candidatoPresidente
0..1 0..1

Apostila UML, pg. 63, n. 2 19

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

 Passageiros recebem milhas por vôo em função da sua duração

20

10
Solução exercício

Vôo Passageiro
0..* 0..*
-num: int -nome: String
-data: Date -sobrenome: String
-duração: int -numCartao: int

CréditoMilha

quantidade: int

21

Levantamento das associações

 Examinar
Regras do negócio,
Modelo do domínio
Requisitos funcionais
Casos de uso
Diagramas de interação

22

11
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

23

Levantamento das associações


sd análise casos de uso

:meteorologista
:IUConv ersao :CtrlConv ersao :Historico :Conv ersaoCF

solicitar valor Celsius

valor Celsius?

converter valor c

guardar conversao

valor Fahrenheit
mostrar valor convertido

valor Fahrenheit

24

12
Implementação de associações
unidirecional 1:1

Professor 1 Leciona 1 Disciplina

class Professor {
private Disciplina disc = new Disciplina(“FP2”);
// disciplina pode ser instanciado em outro local
// outros atributos
// métodos
}
E se fosse bidirecional?
25

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

26

13
Unidirecional 0..1 : 0..5

class Professor

Professor Disciplina
leciona
0..1 0..5

27

Unidirecional 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.}

class Professor
A instanciação pode
ocorrer em outros Disciplina
Professor
pontos da classe leciona
0..1 0..5

28

14
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
leciona
0..1 0..5

29

Multiplicidade 1:*
class classes

Professor Disciplina

1 *

http://java.sun.com/docs/books/tutorial/java/generics/erasure.html
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.}
30

15
Bidirecional multiplicidade *:*
class muitos para muitos

Proj eto Pessoa


+emprega +participa

0..* 0..*

1.public class Projeto {


2. public Vector<Pessoa> emprega;
3. ...
4.}
5.public class Pessoa {
6. public Vector<Projeto> participa;
7. ...
8.}

31

Associações reflexivas
class associação reflexiv a

+temPrerequisito
+temComoPreReq
+ehPreReqDe
+preRequisito
0..*
0..*
Disciplina
Professor

1 *

1.public class Disciplina {


2. public Vector<Disciplina> temComoPreReq;
3. public Vector<Disciplina> ehPreReqDe;
4. ...
5.}
32

16
Exercício

 Implementar as relações da transparência


anterior de acordo com a grade do curso

Disciplina Professor Tem pré-requisitos é pré-requisito de

FP2 TACLA FP1 APOO


APOO ED
ED
FÍSICA

Solução JAssociaoReflexPrePosRequisitos
33

Classes Associativas
Diagrama de classes na atividade de Análise

class classe associativ a

Pessoa
Proj eto
+emprega +participa

0..* 0..*

Participacao

- cargaHoraria: int
- dataEntrada: Date
- dataSaida: Date

Equivale à...
34

17
Classes Associativas (2)

Diagrama de classes na atividade de Projeto


class classe associativ a (proj )

Proj eto Participacao Pessoa


possui participa
- cargaHoraria: int
1 0..* - dataEntrada: Date 0..* 1
- dataSaida: Date

Implementação >>>>

35

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. ...
16.}

36

18
AGREGAÇÃO

 Composição/pertinência
associação
 Parte class Classe

 Todo Janela

 Propagação
1
1
1
3 1 0..1
Exercício: desenhe
uma instância Botão ComboBox ScrollBar
possível da classe
janela

37

Agregação: adornos

class Classe

Time Jogador

* *

Qual a interpretação?

38

19
Tipos de agregação
class Classe

Janela

 Composição
1
1
1
3 1 0..1

Botão ComboBox ScrollBar

 Associação class Classe

Time Jogador

* *

39

Agregação por composição

 Relação forte
Destruição do todo se propaga para as partes
Tempo de vida do todo = das partes

40

20
Exemplo: agregação por composição

Linha 2 Ponto
1

class Linha {
public String id;
private Ponto pt1 = new Ponto(10, 20);
private Ponto pt2 = new Ponto(15, 30);
class Ponto {

}
} 41

Agregação por associação

 Relação mais fraca que anterior


 Tempos de vida diferentes

42

21
Agregação: diferença

43

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
semelhantes
44

22
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


45

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?

Apostila UML, pg. 64, n. 4


46

23
Agregação por composição

class agregação por composição

HistoricoPagsWeb
URLVisitada

1 0..* - URL: String

Implementação >>>
47

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 >>>
48

24
Agregação por composição (3)
1.class Historico {
2. private class URLVisitada {
Classe
3. private String url;
aninhada
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

49

Agregação por associação

 Idêntica à implementação de associação

50

25
GENERALIZAÇÃO

 Classes
compartilham
atributos e
comportamentos Relação de
generalização

 É um tipo de

 Herda atributos e
métodos

51

GENERALIZAÇÃO

Sobreposição do método calcularIPVA

52

26
Taxonomia: hierarquia de classes
Atributos e operações comuns

Atributos e operações específicas

53

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

 Dica: respeitar o princípio da substituição

54

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

55

Exemplo
Círculo e polígonos podem
ser tratados como
FormaGeométrica

56

28
Exemplo: taxonomia mal feita

Livro

LivroEmprestado LivroDisponível

Não construir hierarquias em função de estados das classes

57

Herança múltipla

Obj etoVoador Animal

Av ião Helicóptero Pássaro

58

29
Dependência

 Variável local
 Parâmetro de operação (método)
 Instanciação

 Atributos indicam associação

59

Dependência: exemplos
class Dependência

ClasseA ClasseB

+ operacao(ClasseC) : void
«local»

«parameter»
«instantiate»

ClasseC ClasseD

60

30
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();
...
}
}
61

Exercício (solução)

Multiplicidade no lado aluno não foi colocada


pois não temos informação – indefinida -

1
Aluno Curso
matriculado

<<local>> <<parâmetro>>

Date Endereço

62

31
Realização
«interface»
Serializable

1.public interface Serializable {


2. ...
«instantiate» 3.}

4.public class Histórico implements Serializable {


5. ...
1 6.}

«entity»
Historico

+ adicionar(ConversaoCF) : void
- writeObject() : void

63

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.

64

32
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.
65

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

66

33
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)

67

Exercício (exemplo de envio)


Ao enviar email, o usuário seleciona os destinatários da agenda

Agenda De:
João jl@uol.com.br Destinatários:
Maria ma@utfpr.edu.br
Assunto: nonono nono nono on
José jjj@bol.com.br
João e José,
Favor comparecer com urgência na sala B109.
[]s
Tereza

68

34
Exercício (exemplo de consulta)
Supor que o João foi selecionado na agenda. O programa mostra todos os emails
que lhe foram enviados (pode haver outros destinatários).

Agenda Emails enviados ao João


João jl@uol.com.br Destinatários data assunto
Maria ma@utfpr.edu.br João, José 14/4/2007 nono non onon ono
José jjj@bol.com.br João, Maria 14/4/2007 bla blalba

69

PERSISTÊNCIA

 Consiste em salvar os objetos de uma


sessão para tê-los disponíveis nas
sessões seguintes de uso do programa.

70

35
FORMAS E PERSISTÊNCIA

 Banco de dados: relacional ou objetos

 Arquivo: vários formatos (txt);

 aqui nos interessa a forma serializable


que permite salvar um objeto tal qual ele
está na memória.

71

SERIALIZABLE

 Exemplo em
 JAVARepositorio\SerializableExemplo
 Observar
Que os métodos writeObject e readObject são
opcionais. É interessante utilizá-los quando
quer-se modificar algo no objeto no momento
da escrita ou da leitura (fugir dos defaults)
Que é possível salvar mais de um objeto no
mesmo arquivo.

72

36
Exercício cliente email (cont.)
 Tarefa 2
Implementar e testar o programa
Persistir a agenda e as mensagens

73

37

Você também pode gostar