Relações entre Classes e Persistência Prof. Cesar Augusto Tacla 1 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 2 1
Associação Nome da associação Professor leciona Disciplina Objetos de uma classe se associam a objetos de outra 3 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) 4 2
Multiplicidade: exemplo Professor 1 leciona 1..* Disciplina João Matemática José Física quim Maria História 5 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 6 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. 7 Navegabilidade: unidirecional Não navegável navegável Professor leciona Disciplina 8 4
Navegabilidade: bidirecional navegável navegável Professor leciona Disciplina Direção de leitura 9 Navegabilidade: não especificada Não especificada Não especificada Professor leciona Disciplina 10 5
Papéis Empresa Trabalha ou emprega? Pessoa Qual a interpretação desejada? Trabalha pessoa trabalha para Empresa ou empresa trabalha (presta um serviço) para Pessoa; Emprega (contrata) empresa emprega Pessoa ou pessoa emprega (contrata) Empresa 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 Filho(a) Pessoas Mário José Maria Carlos Mário é pai de Maria pai Quem é o pai de Mário? 14 7
Associação reflexiva: exemplo 2 Empregado 0..* subordinado gerente 1 subordinado João Maria José Mário Gerente João é gerente de Maria e José José é gerente de Mário Quem é gerente de João? 15 Classes Associativas Aluno -nome: String -matricula: int 1..* 1..* Disciplina -nome: String -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 +propriedade +proprietário Pessoa 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..* vota > Pessoa vota > Pessoa candidatopresidente 0..1 candidatopresidente 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 -num: int -data: Date -duração: int 0..* 0..* Passageiro -nome: String -sobrenome: String -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 0..1 Empresta 0..4 Livro 23 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 mostrar valor convertido valor Fahrenheit 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 leciona Disciplina 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.} A instanciação pode ocorrer em outros pontos da classe class Professor Professor leciona Disciplina 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 0..1 leciona 0..5 Disciplina 29 Multiplicidade 1:* class classes Professor Disciplina 1 * 1.class Professor { 2. private Vector<Disciplina> disciplinas = 3. new Vector<Disciplina>(5, 3); http://java.sun.com/docs/books/tutorial/java/generics/erasure.html 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 Projeto +emprega +participa Pessoa 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 Professor +temcomoprereq +temprerequisito 0..* Disciplina +ehprereqde +prerequisito 0..* 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 APOO ED FÍSICA TACLA FP1 APOO ED Solução JAssociaoReflexPrePosRequisitos 33 Classes Associativas Diagrama de classes na atividade de Análise class classe associativa Projeto +emprega +participa Pessoa 0..* 0..* Participacao - cargahoraria: int - dataentrada: Date - datasaida: Date Equivale à... 34 17
Classes Associativas (2) Diagrama de classes na atividade de Projeto class classe associativa (proj) Projeto 1 possui Participacao participa - cargahoraria: int 0..* - dataentrada: Date 0..* 1 - datasaida: Date Pessoa 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 Todo Propagação class Classe Janela Exercício: desenhe uma instância possível da classe janela 1 1 1 3 1 0..1 Botão ComboBox ScrollBar 37 Agregação: adornos class Classe Time Jogador * * Qual a interpretação? 38 19
Tipos de agregação class Classe Composição Janela 3 1 1 1 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 1 2 Ponto 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 { 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.} Classe aninhada 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 ObjetoVoador Animal Aviã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 - Aluno matriculado 1 Curso <<local>> <<parâmetro>> Date Endereço 62 31
Realização «interface» Serializable e» 1.public interface Serializable { 2.... 3.} 1 4.public class Histórico implements Serializable { 5.... 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 João Maria José jl@uol.com.br ma@utfpr.edu.br jjj@bol.com.br De: Destinatários: Assunto: nonono nono nono on 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 João Maria José jl@uol.com.br ma@utfpr.edu.br 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 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