Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 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 2 3 Associação Professor Disciplina leciona Objetos de uma classe se associam a objetos de outra Nome da associação 4 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) 3 5 Multiplicidade: exemplo Professor Disciplina leciona 1..* 1 João José Maria Matemática Física quim História 6 Multiplicidade: exercício João José Maria FIAT AXY8704 FUSCA BHY9910 CORCEL ATT1020 Qual a representação em UML para o caso seguinte? Pessoa Carro 4 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. 8 Navegabilidade: unidirecional Professor Disciplina leciona Não navegável navegável 5 9 Navegabilidade: bidirecional navegável navegável Professor Disciplina leciona Direção de leitura 10 Navegabilidade: não especificada Professor Disciplina leciona Não especificada Não especificada 6 11 Papéis Empresa Pessoa Trabalha ou emprega ? Qual a interpretação desejada? pessoa trabalha para Empresa ou empresa trabalha (presta um serviço) para Pessoa; Trabalha Emprega (contrata) empresa emprega Pessoa ou pessoa emprega (contrata) Empresa 12 Papéis Empresa Pessoa empregador empregado Papel de empresa Papel de pessoa Uso de papéis pode suprimir ambigüidades 7 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) pai Mário é pai de Maria Quem é o pai de Mário? 8 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? 16 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. 9 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? Apostila UML, pg. 63, n. 1 10 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 20 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 11 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..* 22 Levantamento das associações �Examinar �Regras do negócio, �Modelo do domínio �Requisitos funcionais �Casos de uso �Diagramas de interação 12 23 Levantamento de associações �Exemplo: �regras do negócio de uma biblioteca �“um aluno pode emprestar no máximo quatro obras” Aluno Livro Empresta 0..4 0..1 24 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 Fahrenheitmostrar valor convertido valor Fahrenheit 13 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 DisciplinaLeciona 11 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. } 14 27 Unidirecional 0..1 : 0..5 class Professor Professor Disciplina 0..1 leciona 0..5 28 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 Disciplina 0..1 leciona 0..5 15 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 16 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 Pessoa +emprega 0..* +participa 0..* 32 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 +ehPreReqDe 17 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 associativa Projeto Pessoa Participacao - cargaHoraria: int - dataEntrada: Date - dataSaida: Date +emprega 0..* +participa 0..* Equivale à... Diagrama de classes na atividade de Análise 18 35 Classes Associativas (2) class classe associativ a (proj ) Projeto PessoaParticipacao - cargaHoraria: int - dataEntrada: Date - dataSaida: Date 1 possui 0..* 1 participa 0..* Implementação >>>> Diagrama de classes na atividade de Projeto 36 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.} 19 37 AGREGAÇÃO � Composição/pertinência �associação � Parte � Todo � Propagação class Classe Janela Botã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? 20 39 Tipos de agregação �Composição �Associação class Classe Janela Botão ComboBox ScrollBar 3 1 1 1 0..1 1 class Classe Time Jogador ** 40 Agregação por composição �Relação forte �Destruição do todo se propaga para as partes �Tempo de vida do todo = das partes 21 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 Ponto1 2 42 Agregação por associação �Relação mais fraca que anterior �Tempos de vida diferentes 22 43 Agregação: diferença 44 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 23 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? Apostila UML, pg. 64, n. 4 24 47 Agregação por composição class agregação por composição HistoricoPagsWeb URLVisitada - URL: String0..*1 Implementação >>> 48 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 >>> 25 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 � Idêntica à implementação de associação 26 51 GENERALIZAÇÃO � Classes compartilham atributos e comportamentos � É um tipo de � Herda atributos e métodos Relação de generalização 52 GENERALIZAÇÃO Sobreposição do método calcularIPVA 27 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 �Dica: respeitar o princípio da substituição 28 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. 56 Exemplo Círculo e polígonos podem ser tratados como FormaGeométrica 29 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 ObjetoVoador Av ião Helicóptero Pássaro Animal 30 59 Dependência �Variável local �Parâmetro de operação (método) � Instanciação �Atributos indicam associação 60 Dependência: exemplos class Dependência ClasseA + operacao(ClasseC) : void ClasseB ClasseC ClasseD «local» «parameter» «instantiate» 31 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 - 32 63 Realização «entity» Historico + adicionar(ConversaoCF) : void - writeObject() : void «interface» Serializable «instantiate» 1 «entity» Historico + adicionar(ConversaoCF) : void - writeObject() : void «interface» Serializable «instantiate» 1 1.public interface Serializable { 2. ... 3.} 4.public class Histórico implements Serializable { 5. ... 6.} 64 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. 33 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 34 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) 68 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: 35 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). 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 36 FORMAS E PERSISTÊNCIA �Banco de dados: relacional ou objetos �Arquivo: vários formatos (txt); �aqui nos interessa a forma serializable que permitesalvar 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 37 Exercício cliente email (cont.) � Tarefa 2 �Implementar e testar o programa �Persistir a agenda e as mensagens 73
Compartilhar