Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Avançada Prof. Anderson Pinheiro Conteúdo Conceitos básicos: Paradigma Orientado a Objetos • Classes. • Métodos. • Objetos. 2 Programação Avançada - Sistemas de Informação Programação Avançada - Sistemas de Informação 3 Classes, Objetos e Métodos O que é uma classe? O que são objetos? O que são métodos? Programação Avançada - Sistemas de Informação 4 Classes, Objetos e Métodos Programação Avançada - Sistemas de Informação 5 Classes, Objetos e Métodos Programação Avançada - Sistemas de Informação 6 Classes Modelo ou esquema abstrato Classes definem os objetos que compõem o sistema de software: Comportamento (métodos) Dados (atributos) Representa um ou mais objetos com características afins Programação Avançada - Sistemas de Informação 7 Objetos Um objeto é uma instância de uma classe Classe : Pessoa Objetos : Anderson, Maria, … Seu estado é dado através de seus atributos Basicamente o que caracteriza o objeto. Ex. altura, RG, … Objeto: Anderson → altura=175, RG=1111111111 Comunica-se com outros objetos através de seus métodos Chamadas de métodos entre objetos, trocando ou não informações Programação Avançada - Sistemas de Informação 8 Métodos Definem o comportamento do objeto, suas ações: Anderson fala, anda, come, bebe … Permite a comunicação entre objetos: Interface externa; Recebe argumentos (parâmetros) que podem ser utilizados para definir a ação: anda(“direita”); anda(“esquerda”); Podem alterar o estado do objeto (seus atributos) Programação Avançada - Sistemas de Informação 9 Construtor de classe Método publico com o mesmo nome da classe: Permite a instanciação dos objetos Pode receber parâmetros como entrada Em Java a instanciação ocorre pelo construtor new : Pessoa anderson = new Pessoa (“Anderson”, 1.75); Programação Avançada - Sistemas de Informação 10 Visibilidade Nos diagramas UML: (+) público – outras classes possuem acesso (-) privado – acesso somente pela própria classe (#) protegido – acessado somente por classes dentro de um mesmo pacote ou por herança Na linguagem Java: public, private, protected Programação Avançada - Sistemas de Informação 11 Sintaxe Java public class Pessoa{ String nome; float altura; Pessoa(String nome, float altura){ this.nome = nome; this.altura = altura; } public void anda(String direcao){ System.out.println(“Andei para a “+direcao); } } Programação Avançada - Sistemas de Informação 12 Sintaxe Java public class Pessoa{ String nome; float altura; Pessoa(String nome, float altura){ this.nome = nome; this.altura = altura; } public void anda(String direcao){ System.out.println(“Andei para a “+direcao); } } Corpo da Classe Atributos Método Identificador Programação Avançada - Sistemas de Informação 13 Sintaxe Java public class Pessoa{ String nome; float altura; Pessoa(String nome, float altura){ this.nome = nome; this.altura = altura; } public void anda(String direcao){ System.out.println(“Andei para a “+direcao); } } Programação Avançada - Sistemas de Informação 14 Métodos – Parâmetros Programação Avançada - Sistemas de Informação 15 Identificando Classes Regra básica Procurar substantivos e verbos na análise do problema. Todos substantivos são candidatos para classes Os verbos são candidatos para operações Classes idealmente deve estar claramente associadas a uma abstração relevante para o sistema: “Desenvolver um sistema de pedidos: cada pedido deve conter informações sobre os produtos (preço, quantidade,...), o endereço e o nome do destinatário. O sistema deve permitir que as informações sobre nome e endereço do destinatário sejam inseridas ao cabeçalho do pedido, para a área de itens deverá ser possível adicionar informações sobre os produtos como descrição, quantidade e valor.” Programação Avançada - Sistemas de Informação 16 Herança Mecanismo para estender as classes existentes adicionando novos métodos e campos; verificarSaldo() depositar(float valor) sacar(float valor) Programação Avançada - Sistemas de Informação 17 Herança Mecanismo para estender as classes existentes adicionando novos métodos e campos; verificarSaldo() depositar(float valor) sacar(float valor) O problema é que ContaBancaria não possui nenhum recurso para calcular os juros sobre os depósitos; Por isso estamos interessados em implementar a classe ContaPoupanca, a qual deverá possuir características mais específicas que um conta bancária; Programação Avançada - Sistemas de Informação 18 Herança verificarSaldo() depositar(float valor) sacar(float valor) saldo calcularJuros() taxa Programação Avançada - Sistemas de Informação 19 Herança Programação Avançada - Sistemas de Informação 20 Herança Superclasse: classe mais geral Subclasse: classe especializada Toda classe que não estende especificamente outra classe é uma subclasse da classe Object; A classe Object possui alguns métodos que são comuns a todos os objetos: toString Programação Avançada - Sistemas de Informação 21 Herança Programação Avançada - Sistemas de Informação 22 Herança Programação Avançada - Sistemas de Informação 23 Herança Programação Avançada - Sistemas de Informação 24 Herança Por que o método calculaJuros chama os métodos getSaldo e depositar em vez de atualizar diretamente o campo balance da superclasse? Programação Avançada - Sistemas de Informação 25 Herança Por que o método calculaJuros chama os métodos getSaldo e depositar em vez de atualizar diretamente o campo balance da superclasse? Consequência do encapsulamento; O campo saldo é definido como private na superclasse ContaBancaria O método calculaJuros é definido na subclasse, logo não tem permissão para acessar um campo privado mesmo na superclasse Programação Avançada - Sistemas de Informação 26 Hierarquia de Classes Ao projetar uma hierarquia de classes devemos pensar nos recursos e comportamentos comuns a todas as classes na hierarquia; Essas propriedades comuns devem ser implementadas em uma superclasse Programação Avançada - Sistemas de Informação 27 Hierarquia de Classes Programação Avançada - Sistemas de Informação 28 Construindo subclasses Para chamar o construtor da superclasse existe um instrução especial “super”: Seguido dos parâmetros de construção da superclasse Pode ser utilizada seguida por um “.”, ou seja, acessando um método da subclasse em qualquer ponto da subclasse; Programação Avançada - Sistemas de Informação 29 Construindo subclasses •public class ContaEmergencia extends ContaBancaria{ • public ContaEmergencia(double inicial){ • // Constrói a superclasse • super(inicial); • // Inicializa a contagem de transações • transactionCount = 0; • } •} Se não é realizada uma chamada super() para a superclasse essa será instanciada a partir do construtor padrão; Programação Avançada - Sistemas de Informação 30 Subclasses Ocasionalmente podemos instanciar objetos a partir de subclasses: ContaEmergencia contaColegio = new ContaEmergencia(10000); ContaBancaria umaConta = contaColegio; Object umObjeto = contaColegio; Agora as três referências a objeto armazenadas em contaColegio, umaConta e umObjeto referenciam o mesmo objeto do tipo ContaEmergencia Programação Avançada - Sistemas de Informação 31 Subclasses •Por que alguém iria querer conhecer menos sobre um objeto e armazenar uma referência em um campo de objeto de uma superclasse? Programação Avançada - Sistemas de Informação 32 Subclasses •Por que alguém iria querer conhecer menos sobre um objeto e armazenar uma referência em um campo de objeto de uma superclasse? Isso pode acontecer se você quiser reutilizar o código que conhece a superclasse, mas não a subclasse. Programação Avançada - Sistemas de Informação 33 Subclasses•Bem mais raro, mas ainda assim possível, podemos partir de um conversão de uma superclasse para uma subclasse: •ContaBancaria conta = (ContaBancaria) object; Programação Avançada - Sistemas de Informação 34 Subclasses •Bem mais raro, mas ainda assim possível, podemos partir de um conversão de uma superclasse para uma subclasse: •ContaBancaria conta = (ContaBancaria) object; •Cuidado!! •Se você estiver errado e object, na verdade, •referir-se a um objeto de um tipo não-relacionado, uma exceção será lançada. Programação Avançada - Sistemas de Informação 35 Subclasses Para se proteger de coerções ruins, você pode utilizar o operador instanceof: Testa se um objeto pertence a um tipo específico; object instanceof ContaBancaria if (object instanceof ContaBancaria) { ContaBancaria conta = (ContaBancaria) object; } Programação Avançada - Sistemas de Informação 36 Herança vs Interfaces A herança diferencia-se da implementação de uma interface: Subclasses herdam comportamento e o estado da superclasse; Interfaces definem métodos que devem ser implementados, trata-se de um esboço; A vantagem da herança é a reutilização de código: Não é necessário replicar o esforço na implementação dos métodos; Ao estender devemos apenas nos preocupar em adicionar as novas funcionalidades Todas as imagens foram retiradas de internet 37 Programação Avançada - Sistemas de Informação Coleções em Java Coleções • Java fornece vários mecanismos de mais alto nível para manipular conjuntos de elementos • Permitindo a reutilização de software com qualidade e desempenho • Minimizando a quantidade de código • Essas estruturas são baseadas em interfaces de alta ordem Interface Descrição Collection Interface-raiz na hierarquia de coleções Set Uma coleção que não tem duplicatas List Uma coleção ordenada que pode conter duplicatas Map Associa chaves e valores e não pode conter chaves duplicadas Queue Primeiro elemento a entrar é o primeiro a sair Coleções - Listas • List é uma Collection ordenada: Primeiro índice também é 0 • Principais implementações de List são: • ArrayList – lista dinâmica • LinkedList – lista encadeada • Vector – lista dinâmica • ArrayList vs Vector: Objetos da classe Vector são sincronizados ArrayList por não ser sincronizado é mais eficiente, não possui overhead de sincronização de threads • LinkedList são utilizados para criar estruturas como pilhas, filas, árvores Coleções - Listas Coleções – ArrayList e Iterator • Criando um ArrayList, adicionando e removendo elementos: Um ArrayList é uma classe genérica, logo é possível especificar o tipo de elemento que está sendo armazenado na lista List<String> nomes = new ArrayList<String>(); nomes.add(“Anderson”); nomes.add(“Maria”); System.out.println(“Nome: “+nomes.get(0)); System.out.println(“Nome: “+nomes.get(1)); Coleções – ArrayList e Iterator(19.3) • Criando um ArrayList, adicionando e removendo elementos: Um ArrayList é uma classe genérica, logo é possível especificar o tipo de elemento que está sendo armazenado na lista List<String> nomes = new ArrayList<String>(); nomes.add(“Anderson”); nomes.add(“Maria”); System.out.println(“Nome: “+nomes.get(0)); System.out.println(“Nome: “+nomes.get(1)); Adicionando elementos na lista obtendo elementos da lista Coleções – ArrayList e Iterator • Iterator: Um ArrayList é permite obter um objeto iterador sobre a lista List<String> nomes = new ArrayList<String>(); nomes.add(“Anderson”); nomes.add(“Maria”); Iterator<String> itr = nomes.iterator(); while (itr.hasNext()) { String element = itr.next(); // ou itr.remove(); System.out.print(element + " "); } Coleções – LinkedList(19.5) • Criando um LinkedList, adicionando e removendo elementos: LinkedList<String> cores = new LinkedList<String>(); cores.add(“Rosa”); cores.add(3,“Azul”); cores.addFirst(“Vermelho”); cores.addLast(“Preto”); Coleções – LinkedList(19.5) •Criando um LinkedList, adicionando e removendo elementos: LinkedList<String> cores = new LinkedList<String>(); cores.add(“Rosa”); cores.add(3,“Azul”); cores.addFirst(“Vermelho”); cores.addLast(“Preto”); String coresVetor [] = cores.toArray( new String[links.size()] ); Coleções – Vector (19.6) • Criando um Vector adicionando e removendo elementos: Vector<Integer> idade = new Vector<Integer>(); idade.add(32); idade.add(31); idade.add(41); System.out.println(idade.firstElement()); System.out.println(idade.get(0)); Coleções – Vector (19.6) •Métodos importantes add(e) get() firstElement() lastElement() contains(e) size() indexOf(e) Todas as imagens foram retiradas de internet 49 Programação Avançada - Sistemas de Informação Porque Utilizar Padrões? • Mesmo em um conjunto de sistemas corporativos diferentes podemos encontrar diversas características semelhantes • Dado um problema comum que deve ser contornado em 100 aplicações com finalidades diferentes; • A primeira vista teríamos 100 diferentes soluções para o mesmo problema. Porque Utilizar Padrões? • Códigos com centenas de linhas? – Como localizar as modificações • Desperdício de tempo para entender a função de um método simples? • Muitos desvios condicionais e repetições em um mesmo método com inúmeras variáveis? Porque Utilizar Padrões? Sim!!! Código complexo e obscuro!!! • Certezas no desenvolvimento de software • Evolução, Elasticidade; • Novas funcionalidades ou mudanças nas já existentes. Porque Utilizar Padrões? • Para não perder tempo e dinheiro, podemos escolher uma solução como padrão e utilizá-la toda vez que nos depararmos com um dado problema; • Essa estratégia além de reduzir o trabalho de implementação pode facilitar a comunicação entre as equipes envolvidas: • Melhorando o entendimento técnico do sistema; Padrão de Projeto • Um padrão de projeto é uma solução adotada como padrão: • Sempre que um determinado problema ocorrer utilizamos essa solução; • Frequentemente utilizado em desenvolvimento orientado a objetos; Padrão de Projeto “Design Patterns: Elements of Reusable Object-Oriented Software” (Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides) (Gang of Four) Dando origem ao nome padrões GoF Padrão GoF • Os padrões GoF são divididos em 3 grupos: • Criação - relacionado a criação de objetos; • Estruturais – relacionados as interações entre os objetos; • Comportamentais – relacionados as ações sobre os objetos. Padrões de Criação • Criar objetos em um sistema orientado a objetos pode ser uma tarefa complexa: • Definir qual classe concreta deve ser utilizada para criar o objeto; • Definir quais objetos devem ser criados e como eles se relacionam com outros objetos do sistema; Padrões de Criação • Encapsulamento – esse princípio tem por objetivo isolar essa complexidade na criação dos objetos: • A ideia é utilizar padrões de projeto durante a criação dos objetos Padrões de Criação Factory Method: Encapsular a escolha da classe concreta a ser utilizada na criação de objetos de um determinado tipo. Abstract Factory: Encapsular a escolha das classes concretas a serem utilizadas na criação dos objetos de diversas famílias. Builder: Separar o processo de construção de um objeto de sua representação e permitir a sua criação passo-a-passo. Diferentes tipos de objetos podem ser criados com implementações distintas de cada passo. Padrões de Criação Prototype: Possibilitar a criação de novos objetos a partir da cópia de objetos existentes. Singleton: Permitir a criação de uma única instância de uma classe e fornecer um modo para recuperá-la. Multiton: Permitir a criação de uma quantidade limitada de instâncias de determinada classe e fornecer um modo para recuperá-las. Object Pool: Possibilitar o reaproveitamento de objetos. Padrões de Projeto Estruturais Padrões Estruturais As interações entreos objetos de um sistema podem gerar fortes dependências Aumentando a complexidade de eventuais alterações do sistema Custo de manutenção aumenta Padrões estruturais buscam reduzir o acoplamento entre os objetos Padrões Estruturais Adapter – Permitir que um objeto seja substituído por outro que, apesar de realizar a mesma tarefa, possui uma interface diferente. Bridge – Separar uma abstração de sua representação, de forma que ambos possam variar e produzir tipos de objetos diferentes Composite – Agrupar objetos que fazem parte de uma relação parte-todo de forma a tratá-los sem distinção Decorator – Adicionar funcionalidades a um objeto dinamicamente Padrões Estruturais Facade – Prover uma interface simplificada para a utilização de várias interfaces de um subsistema Front Controller – Centralizar todas as requisições a uma aplicação web Flyweight – Compartilhar, de forma eficiente, objetos que são usados em grande quantidade Proxy – Controlar as chamadas a um objeto através de outro objeto de mesma interface Padrões de Projeto Comportamentais Padrões Comportamentais •Descrevem padrões de comunicação entre objetos: –Fluxos de comunicação complexos; –Foco na interconexão entre objetos; São baseados em • Escopo de Classe: Herança; • Escopo de Objeto: composição. Padrões Comportamentais “Preocupam-se com algoritmos e a delegação de responsabilidade entre objetos”
Compartilhar