Padrões de Projeto 2 – Revisão de Programação Orientada a Objetos PROGRAMAÇÃO ORIENTADA A OBJETOS Padrões de Projeto - Revisão de POO Revisão rápida com análise acerca de algumas de suas implicações em Padrões de Projeto 2 1. 2. 3. 4. 5. Composição, agregação, associação Herança Reescrita Sobrecarga Polimorfismo PARTE 2 Padrões de Projeto - Revisão de POO "O homem absurdo é aquele que nunca muda.“ - Georges Clemenceau 3 Composição, Agregação e Associação • Composição • Agregação • Uma locomotiva (todo) tem um farol (parte), mas não deixa de existir se não o tiver; • Associação • Um trem usa uma estrada de ferro (a estrada não faz parte do trem, mas ele depende dela). Padrões de Projeto - Revisão de POO • Um trem é formado por 1 locomotiva e n vagões; • Relacionamento tem-um; 4 Herança • Praticando! (10 minutos) • Imagine o sistema de um banco... Nesse sistema precisamos armazenar dados de funcionários (que podem exercer diferentes funções, ex.: secretário ou gerente) e clientes. • Vamos modelar essa parte do sistema! Padrões de Projeto - Revisão de POO • Objetivo 1: reuso de código. 5 Herança Padrões de Projeto - Revisão de POO • Relacionamento É-UM em java, instanceof 6 Herança • Objetivos: Reuso de código; Polimorfismo. • Palavras-chave: • extends: para herdar as caraterísticas de uma classe; • Instanceof: para testar relacionamentos É-UM entre objetos Padrões de Projeto - Revisão de POO 1. 2. 7 Quais seriam as implicações dessa nova abordagem? Padrões de Projeto - Revisão de POO Se não houvesse herança em Java, como você poderia reaproveitar o código de outra classe? 8 Herança vs Composição • Exemplo: Carro • Imagine que você criou um carro com vários utilitários, ex.: GPS, direção hidráulica, injeção eletrônica. Então, no seu sistema você percebe que precisa lidar com carros Opala, mas Opala não tem GPS nem inj. eletrônica. • Como poderíamos resolver isso? Próxima aula aprenderemos uma solução com o nosso 1º padrão de projeto. Padrões de Projeto - Revisão de POO • Herança: quando uma classe herda a outra, ela está muito ligada à outra • Composição: estende uma classe através da delegação de trabalho a ela 9 Overriding • Outros nomes: sobrescrever (overwriting), reescrever, sobrepor... • No exemplo anterior, suponha que os funcionários, de modo geral, ganhem uma bonificação de 10%. Mas, devido o fato do gerente ter mais responsabilidade, seria justo que ele ganhasse uma bonificação de 20% de seu salário. Como nós alteraríamos o nosso modelo para satisfazer essa nova especificação? (modele/implemente apenas as classes Funcionário e Gerente) Padrões de Projeto - Revisão de POO • Praticando! (10 minutos) 10 Padrões de Projeto - Revisão de POO Overriding 11 Overriding • Objetivo: especializar um método herdado. 1. A assinatura deve ser igual ou bem similar: 1. 2. 3. 2. Lista de argumentos exatamente igual; Tipo de retorno deve ser “igual” (lembrar da relação É-UM, pois subtipos também são aceitos); Modificador de acesso pode ser menos restritivo; Para haver reescrita deve, primeiramente, haver herança. Padrões de Projeto - Revisão de POO • Regras para sobrescrever um método: Mais regras em: Livro de Certificação Java • SCJP Sun Certified Programmer for Java 6 • OCP Java SE 6 Programmer 12 Overloading Padrões de Projeto - Revisão de POO • Outro nome: sobrecarregar, ... 13 Overloading • Objetivo: prover ao usuário a possibilidade de executar uma funcionalidade do sistema passando diferentes inputs (tipos de dados) • Regras para sobrecarregar um método... 1. 2. 3. 4. Os métodos sobrecarregados devem alterar a lista de argumentos; Os métodos sobrecarregados podem alterar o tipo de retorno; Os métodos sobrecarregados podem alterar o modificador de acesso; Um método pode ser sobrecarregado na mesma classe ou em uma subclasse. • Também é possível sobrecarregar um construtor. Padrões de Projeto - Revisão de POO • É basicamente a uma outra implementação de um método já existente mas com argumentos diferentes. Mais regras em: Livro de Certificação Java • SCJP Sun Certified Programmer for Java 6 • OCP Java SE 6 Programmer 14 Polimorfismo Polivárias morfoformas • O que guarda uma variável do tipo Funcionário? Gerente g = new Gerente(); Funcionario f = g; f.setSalario(1000); Gerente Gerente g get/setNome() get/setIdade() get/setSalario() Senha numFuncionariosGerenciados getBonificacao() Autentica() Funcionario f Padrões de Projeto - Revisão de POO • Uma referência para um funcionário... 15 Polimorfismo • O que guarda uma variável do tipo Funcionário? Gerente g = new Gerente(); Funcionario f = g; f.setSalario(1000); System.out.println(f.getBonificacao()); Gerente Gerente g get/setNome() get/setIdade() get/setSalario() Senha numFuncionariosGerenciados getBonificacao() Autentica() Decidido em tempo de execução Funcionario f Padrões de Projeto - Revisão de POO • Uma referência para um funcionário. 16 Polimorfismo • Por que polimorfismo? public void registra(Funcionario funcionario) { this.totalDeBonificacoes += funcionario.getBonificacao(); } public double getTotalDeBonificacoes() { return this.totalDeBonificacoes; } Padrões de Projeto - Revisão de POO class ControleDeBonificacoes { private double totalDeBonificacoes = 0; } 17 Polimorfismo • Por que polimorfismo? • O que acontece se futuramente precisarmos criar outros tipos de funcionários? • Não importa como nos referenciamos aControleDeBonificacoes(); um objeto, o ControleDeBonificacoes controle = new método que será invocado é Gerente funcionario1 = new Gerente(); funcionario1.setSalario(1000); sempre o do objeto em questão. controle.registra(funcionario1); •Funcionario Programe pra uma funcionario2 = newsempre Funcionario(); funcionario2.setSalario(1000); superclasse! controle.registra(funcionario2); System.out.println(controle.getTotalDeBonificacoes()); Padrões de Projeto - Revisão de POO • Dicas sobre polimorfismo: 18 • Essa aula utilizou alguns exemplos modificados das apostilas caelum além de alguns conceitos e exemplos abordados na apostilas para certificação java (SCJP e OCJP). • Ahhh, alguns destes exemplos também saíram da minha cabeça. Padrões de Projeto - Revisão de POO Referências 19