Programação Orientada
a Objetos
Prof. André de Carvalho PAE: Humberto de Sousa
Principais Tópicos
Introdução
Abstração
Encapsulamento
Heranças
Polimorfismo
Interfaces
Introdução
Principal furo de linguagens imperativas
Variáveis globais podem ser acessadas de qualquer parte de um programa
y Grandes programas sem disciplina para acesso a variáveis globais tendem a ser impraticáveis y Nenhum módulo que acessa uma variável global pode
ser desenvolvido e entendido independentemente de outros módulos que também acessam esta variável global
Introdução
“O remédio é esconder informação” (David
Parnas, 1970)
Encapsular cada variável em um módulo, junto com um grupo de operações que sozinhas têm acesso direto à variável
Outros módulos podem acessar a variável apenas indiretamente
y Chamando aquelas operações
Módulo = objeto
Introdução
Por que Programação Orientada a Objetos?
Agrada vários níveis de usuários Gerentes
y Promete desenvolvimento e manutenção mais rápido e mais barato
Analistas e projetistas
Introdução
Por que Programação Orientada a Objetos?
Programadores
y Elegância e claridade do modelo objeto aliado ao poder das bibliotecas e ferramentas orientadas a objeto
Introdução
Aprendizado de uma LPOO leva mais tempo
Programadores estão acostumados a pensar proceduralmente
Processo de projetar objetos apresenta mais desafios que projeto procedural
y Principalmente se você deseja criar objetos re-utilizáveis
Poucos especialistas projetam os melhores objetos que são então utilizados por outros programadores
Introdução
Programadores de LPOO Criadores de classes y Criam novos tipos de dados
y Tem pôr objetivo construir uma classe que exponha ao programador cliente apenas o que ele necessita
• Mantendo todo o resto escondido
Programadores clientes
y Utililizam os tipos de dados em suas aplicações
y Têm por objetivo coletar um grande número de classes para desenvolver aplicações rapidamente
Introdução
Razões para controlar o acesso dos
programadores clentes
Evitar que clientes mexam onde não deveriam
y Trechos necessários para manipuações internas dos tipos de dados
y Não são partes da interface que o usuário precise
Permitir que o projetista da biblioteca mude o seu funcionamento interno sem se preocupar em afetar o cliente
Introdução
LPOO bem sucedida deve apresentar
Sintaxe da linguagem Compilador
Biblioteca de classes
Primeira tarefa de um Programador de LPOO
Utilizar classes existentes para resolver seu problema
Introdução
Conceitos chaves de LPOO
Abstração Encapsulamento Polimorfismo Herança
Abstração
Para processar alguma coisa do mundo real emum computador, é preciso extrair as características essenciais
Características dependem do que se pretende fazer O resto não precisa ser conhecido
Abstração
Ex. Imagine que diferentes usuários
pretendem desenvolver um sistema para
processar dados de automóveis
Detran: placa, dono atual, taxas não pagas, etc. Oficina: placa, problemas, trabalhos realizados,
pagamentos, dono, etc.
Orçamento do dono: descrição do carro, histórico de idas à oficinas, consumo, etc.
Abstração
Abstração
Processo de descartar os detalhes sem importância de um objeto
y Apenas as características apropriadas para descrevê-lo são mantidas
Junto com as operações sobre os dados, formam os tipos abstratos de dados
Abstração
Tipos Abstratos de Dados (TAD)
Definem um tipo em termos de seu comportamento ao invés de sua representação
Geralmente definidos por uma interface
y Exporta o TAD junto com uma coleção de funções que definem o seu comportamento
Tipos predefinidos de uma linguagem são tipos concretos de Dados, TCD
y Ex.: inteiro, caracter, vetor, registro, etc...
Abstração
Vantagens do uso de um TAD
Simplicidade:
y Por esconder a representação interna dos clientes, existem menos detalhes para o cliente entender
Flexibilidade
y Por ser definida pelo seu comportamento, implementador pode mudar a representação
Segurança
y Fronteira da interface age como uma parede, protegendo a implementação do cliente e vice-versa
Encapsulamento
Além de abstrair os dados, é importantetambém abstrair as operações executadas sobre eles
Encapsulamento procura associar dados e
operações sobre eles e tratá-los como
uma
única unidade de organização
Encapsulamento
Linguagens não-OO suportam encapsulamento
apenas para tipos pré-definidos
Não suportam para tipos definidos pelo usuário
y Não garante integridade destes tipos
Encapsulamento
Tipo de dados + suas operações forma uma
classe
Variável de algum tipo classe é chamado de
objeto
Semelhante às variáveis convencionais Diferença: cada classe define as funções que
podem manipular seus dados
Encapsulamento
Funções membro
Equivalente às funções das linguagens de programação convencionais
Podem chamar outras funções Podem ser recursivas
Execução de um programa C++ começa em uma função com o nome especial main ()
Encapsulamento
Classes
Uma classe é uma especificação que define as variáveis e funções comuns a todos os objetos de um certo tipo
Um objeto é uma instância de uma classe
Encapsulamento
Cada objeto é formado por:
Interface
y Estabelece o que o cliente pode solicitar ao objeto y Cada solicitação é associada a uma função
Implementação
y Indica como os atendimantos às solicitações são implementados
y Contém os dados escondidos
Características de uma LPOO pura
Tudo é um objeto
Um programa é formado por um grupo de objetos que dizem a cada um o que fazer através de mensagens
Cada objeto tem sua própria memória
y Pode ser formada por outros objetos
Todo objeto tem uma classe (tipo)
Todos os objetos de uma mesma classe podem receber as mesmas mensagens
Objetos
Objetos
Objetos
Conjunto de abstrações e métodos utilizados para modelar objetos do mundo real (e imaginário)
Cada objeto tem um tipo ou classe
Um objeto é caracterizado pelo seu estado e pelo seu comportamento
Objetos
Exemplo de objeto
Lâmpada y Estados • ligada/desligada y Comportamentos• mudar de ligada para desligada • mudar de desligada para ligada
Herança
Conceito chave em POO
Mecanismo poderoso e natural para organização e estruturação de objetos
Capacidade de organizar classes de objetos em uma hierarquia de classes derivadas e classes bases
y Uma classe derivada herda estados e comportamentos de sua classe base
y Operações de uma classe base são aplicáveis a objetos de uma classe derivada
y Em outras linguagens: superclasse e subclasse
Herança
O mesmo código que usa um objeto da
classe base, pode usar um objeto das classes
derivadas
Novos códigos podem ser escritos para as
classes derivadas utilizando as mesmas
interfaces da classe base
Herança
Classes podem ser definidas em termos de outrasclasses
Mountain bikes, bicicletas de corrida e bicicletas com mais de uma assento são diferentes tipos de bicicletas
y São classes derivadas da classe bicicletas
y Bicicletas é a classe base das classes Mountain bikes, bicicletas de corrida e bicicletas com mais de uma assento
Herança
Classe Base
Herança
Cada subclasse Herda estado (declarações de variáveis) da classe base y Mountain bikes, bicicletas de corrida e bicicletas com mais
de uma assento compartilham alguns estados (cadência, velocidade, etc.)
Herda comportamentos (funções) da classe base y Mountain bikes, bicicletas de corrida e bicicletas com mais
Herança
Classes derivadas não estão limitadas ao estado ecomportamentos de sua classe base
Podem adicionar variáveis e funções àquelas herdados da classe base
y Ex. Mountain bikes têm outro conjunto de marcha Podem sobrepor funções herdadas
y Fornecer implementações especializadas para estas funções
y Ex. Implementação da função de mudança de marchas pode ser alterado para as Mountain bikes
Herança
Podem ser utilizadas várias camadas de herança Árvore de herança, ou hierarquia de classes, pode sertão profunda quanto necessário
y Funções e variáveis são herdados através dos níveis y Quanto mais baixa no hierarquia, mais especializada a classe
Polimorfismo
Capacidade de um objeto de responder a
uma mensagem de uma maneira peculiar a
ele mesmo
Permite a redefinição do funcionamento de
uma função herdada de uma classe base
Pode ocorrer de duas formas
Sobrecarga (Overloading) Sobrescrita (Overriding)
Polimorfismo
Sobrecarga
Tipo mais simples de polimorfismo
Resolvido pelo compilador em tempo de compilação Qualquer classe pode usar o mesmo nome para funções
(operadores) diferentes (de preferência relacionados) y Devem ter assinatura diferente para que o compilador possa
dizer qual dos sinônimos é indicado
• Assinatura: número, tipo e ordem dos parâmetros y Compilador escolhe a função comparando os tipos de
argumentos
Polimorfismo
Exemplo de sobrecarga Em Pascal o operador ‘-’ denota simultaneamente cinco operações distintas:
y negação de inteiro (Inteiro → Inteiro) y negação de real (Real → Real)
y subtração de inteiro (Inteiro × Inteiro → Inteiro) y subtração de real (Real × Real → Real) y diferença de conjuntos (Conjunto × Conjunto →
Conjunto)
Polimorfismo
Exemplo de sobrecarga (cont.) Não existe ambiguidade
y Em operações como ‘-y’ e ‘x-y’, o número de parâmetros e os seus tipos determinam unicamente qual a operação utilizada
Polimorfismo
Sobrescrita Tipo mais complicado de polimorfismo Resolvido dinamicamente em tempo de execução Ocorre quando uma classe derivada tem uma
função com a mesma assinatura da classe base y Função na classe derivada sobrepõe o método na
classe base
Mensagens
Utilizadas para fazer a comunicação entre os
objetos
Chamada de função membro
Cada objeto entende um conjunto de mensagens que podem mudar seu estado atual
Quando existe a necessidade de maiores informações, as mensagens podem conter parâmetros
Interfaces
Definições importantes
Clientes: programas que usam bibliotecas Interface: fronteira entre a implementação de
uma biblioteca e seus clientes
y Procura fornecer a cada cliente a informação necessária para usar a biblioteca, sem revelar os detalhes de sua implementação
y Reduz a complexidade do processo de programação y Centrais para o tratamento moderno de bibliotecas
Interfaces
Processo de programação O uso de computadores para resolver problemas cada vez mais sofisticados
y Processo de programação também deve se tornar mais sofisticado
Complexidade do processo de programação deve ser reduzida
y Funções reduzem a complexidade de um programa dividindo-o em pedaçdividindo-os mais simples
y Interfaces reduzem a complexidade da programação, fornecendo ao cliente um conjunto de funções
Interfaces
Uma boa interface deve ser: Unificada: deve conter um conjunto consistente de funções
Simples: deve esconder a complexidade da implementação das funções
Suficiente: deve conter as funções que o cliente precisa
Interfaces
Projetista de interfaces deve ser muito
cuidadoso
Quanto mais clientes dependem de uma interface, maior o custo de modificá-la Algumas interfaces nunca podem ser mudadas,
Comentários finais
Principais conceitos de linguagens de
programação orientadas a objetos
Abstração Objetos Herança Polimorfismo Mensagens Interfaces