410 likes | 517 Views
Orientação a objetos. Caio Argolo Luiz Daud Jorge Roberto. 1 - Tipos abstratos de dados. O que é abstração? Empresa x Academia Vamos abstrair? Quais atributos importantes em cada contexto?. Abstração de processos e de dados. Quais são os processos ? Quando vieram os dados ?.
E N D
Orientação a objetos. Caio Argolo Luiz Daud Jorge Roberto
1 - Tipos abstratos de dados • O que é abstração? • Empresa x Academia • Vamos abstrair? • Quais atributos importantes em cada contexto?
Abstração de processos e de dados • Quais são os processos? • Quando vieram os dados?
O escalonamento • Como facilitar a vida de um programador? • A modularização (processos, containers, módulos • E quando a coisa é muito grande? • As unidades de compilação! • O grande trunfo do escalonamento!!!
Tipos abstratos de dados • É um encapsulamento que inclui somente a representação dos dados de um tipo específico de dado e os subprogramas relacionados a ele. • Cuma? • Classes e objetos! • E assim surgiu a orientação a objetos!
O caso do float! • E ele é um dado abstrato? • E quem aceita ele? • O que fazemos com ele? • A revelação!
Trabalhando com os dados abstratos • As unidades sintáticas. • Iteradores– Permissão de acesso a todos os dados do objeto de forma segura (Get e Set); • Construtores – Permissão de criação de uma instância do objeto respeitando normas internas do tipo de dado abstrato. • Destrutores – Indicadores de descarte de instâncias.
Simula 67 • Abstração de dados! • Encapsulamento! • Garbagecollection! • Ocultação da informação.
Ada • Abstração de dados! • Encapsulamento! • Garbagecollection! • Ocultação da informação. • Tipos de dados (private, limitedprivate) • Acesso e modificação!
2 - Programação Orientada a Objetos (POO) • Simula • Smalltalk • O que define se o paradigma é orientação a objetos? • Tipos de dados abstratos • Herança • Vinculação dinâmica
A Herança • Aumentando a produtividade • Estabelecimento de um padrão • A coexistência de tipos de dados semelhantes • Vamos criar então as subclassses! • Classe pai = Superclasse • Classe filho = Subclasse • E esses tais métodos? • E essas tais mensagens? • Que história é essa de sobrecarga?
Um exemplo de arquitetura • Classe FrenchGothic que tem um método com o estilo de fachada. • Suas subclasses terão particularidades nesse método de estilo, cada uma com seus toques especiais. • Então as subclasses Reims, Amien e Chartres terão métodos diferentes da classe pai.
Cuidado com a herança... • Jamais limite a liberdade oferecida pela utilização de dados abstratos. • Fique atento a hierarquização para não causar dependência! • Herança simples - Há somente uma classe pai • Herança múltipla - Há várias classes pai C++ & Python • O curioso caso do Java! • Mas desde quando interfaces são classes?
Interfaces • São pseudo-classes, definem um tipo, métodos e propriedades. As classes que implementarem essa interface deverão adquirir também seus métodos. Não podemos restringir acesso aos membros da interface, isso só é possível nas classes nas quais elas forem implementadas.
Classes abstratas • São classes que podem possuir métodos ou propriedades não implementados quanto alguns já implementados. É o meio termo entre interfaces e classes. Não podem ser instanciadas, apenas utilizadas como superclasses. Durante gerações de herança os métodos podem ou não ser implementados, mas a classe só deixará de ser abstrata quando estiver com todos os métodos implementados.
Polimorfismo • Classes diferentes • Métodos de mesmo nome • Reutilizando os métodos! • E as classes abstratas? • A economia de tempo! • Pode-se comparar a orientação a objetos a uma sinulação onde a computação é separada entre diferentes computadores. Cada objeto seria um computador que representa um elemento do mundo real, com suas características, métodos e afins.
Um rápido exemplo • publicclassOperacaoMatematica { • calculaCoisa(float a, float b) { • } • } • publicclass Multiplica extendsOperacaoMatematica{ • calculaCoisa(float a, float b){ • return a*b; • } • } • publicclass Soma extendsOperacaoMatematica{ • calculaCoisa(float a, float b){ • returna+b; • } • }
Vinculação estática e dinâmica • Quando nos referimos a vinculação dos métodos aos objetos através das mensagens, a vinculação será dinâmica. Caso o programador opte por vincular estaticamente, estará ganhando tempo de execução em troca de tempo de produção.
3 - Exemplos de Orientação a objetos 3.1 – Suporte em C++
3 - Exemplos de Orientação a objetos • 3.1 – Suporte em C++ • 3.1.1 – Características Gerais: • Compatibilidade quase completa com C original. • Linguagem Híbrida: • Estrutura de Classes da orientação a objetos. • Tipos das linguagens imperativas tradicionais. • Objetos alocados no mesmo lugar que as variáveis. • Toda classe tem um método construtor. • A maioria das definições de classe incluem um método destrutor. • Fornece controle de acesso sobre variáveis e métodos, diferentemente do SmallTalk.
3 - Exemplos de Orientação a objetos • 3.1 – Suporte em C++ • 3.1.2 – Herança. • Um classe pode ser derivada de outra. • Diferente do SmallTalk um classe do C++ pode ser independente de um Superclasse • Alguns ou todos os dados e funções da Superclasse podem ser herdados pelas subclasses. • A acessibilidade aos membros da subclasses podem ser diferentes da classe “Pai”. • Assim que as classes do C++ podem ser impedidas de serem subtipos. • O modo de acesso a uma classe pode ser public ou private.
3 - Exemplos de Orientação a objetos • 3.1 – Suporte em C++ • 3.1.2 – Herança. • Se uma classe Pai é pública e uma classe filha é pública. • Os métodos públicos e protegidos da Pai serão públicos e protegidos na filha. • Em uma classe derivada privada. • Os membros públicos e protegidos da classe básica são privados. • A classe privada derivada interrompe o acesso a todos os membros de todas as classes ancestrais e suas sucessoras e os protegidos podem ou não ser acessíveis às classes subsequentes.
3 - Exemplos de Orientação a objetos • 3.1 – Suporte em C++ • 3.1.3 – Vinculação Dinâmica. • Numa vinculação estática, uma chamada de função é vinculada estaticamente a uma definição de função. • No C++ uma variável ponteiro ou referência que tenha como tipo uma classe pai pode apontar para objetos de qualquer classe filha. • Para chamar uma função da classe filha a partir de uma dessas variáveis utiliza-se a palavra virtualna declaração da função.
3 - Exemplos de Orientação a objetos 3.1 – Suporte em C++ 3.1.3 – Vinculação Dinâmica.
3 - Exemplos de Orientação a objetos • 3.1 – Suporte em C++ • 3.1.3 – Vinculação Dinâmica. • A função da classe pai não deve ter corpo pois será uma função virtual pura. • Apenas as funções das derivadas terão corpo pois serão chamadas dinamicamente a partir da referencia feita pela classe pai • Uma classe que inclui uma função virtual pura é uma classe abstrata e não pode ser instanciada. • Esse recurso permite alterações ou adições na função desenhar das classes filhas sem grandes alterações de código.
3 - Exemplos de Orientação a objetos • 3.1 – Suporte em C++ • 3.1.4 – Avaliação. • A herança do C++ é mais confusa que a do SmallTalk • No C++ o programador deve especificar a vinculação estática ou dinâmica • A verificação estática de tipos do C++ é muito mais eficiente que dinâmica do SmallTalk • SmallTalk preza pela elegância enquanto C++ pela retrocomptibilidade com o C e desempenho. • C++ chegou a ser 10 vezes mais rápida que o SmallTalk em benchmarks.
3 - Exemplos de Orientação a objetos 3.2 – Suporte em Java
3 - Exemplos de Orientação a objetos • 3.2 – Suporte em Java • 3.2.1 – Características gerais. • Não utiliza apenas objetos • Tipos primitivos não são objetos • Não possui tipos enumeração ou registro. • Arrays são objetos. • As classes sempre tem um pai ao contrario do C++ • Todas as classes derivam da classe object ou de alguma filha dela. • Todos os objetos em java são heap-dinâmicos explícitos. • Utiliza coletor de lixo.
3 - Exemplos de Orientação a objetos • 3.2 – Suporte em Java • 3.2.2 – Herança. • Diretamente Java suporta apenas herança simples. • Existe uma um tipo de classe virtual, a interface, que implementa uma espécie de herança múltipla. • Interfaces definem apenas a especificação de uma classe. • Um classe pode herdar de uma classe pai e implementar um interface. • Um exemplo de herança são os Applets. • Quando um applet implementa uma animação é normalmente definida para rodar em seu próprio Thread. • Porém uma classe não pode herdar de Applet e Thread ao mesmo tempo • Por isso utiliza-se a interface predefinida Runnable. • PublicclassClockextendsAppletimplementesRunnable. • No java um método pode ser declarado como final, assim ele não pode ser sobrescrito em nenhuma classe descendente. • Quando um classe é declarada final em sua definição ela não pode ser pai de nenhuma classe.
3 - Exemplos de Orientação a objetos • 3.2 – Suporte em Java • 3.2.3 – Vinculação Dinâmica. • Todas as chamadas de métodos são Vinculadas dinamicamente. • Métodos declarados como final não podem ser sobrescritos por isso possuem vinculação estática. • Diferente do C++ que é preciso declarar um método como virtual para utilizar vinculação dinâmica. • Aqui a vinculação estática precisa de declaração.
3 - Exemplos de Orientação a objetos • 3.2 – Suporte em Java • 3.2.4 – Encapsulamento. • Dois tipos Classes e Pacotes • Pacotes são um Encapsulamento lógico. • Um pacote cria um novo nome de espaço. • Variáveis sem modificador de acesso tem um escopo de pocte. • Todos os métodos e variáveis privados não declarados são visíveis em todo o pacote no qual são declarados • Ampliação do conceito de protegido do C++ • Alternativa aos amigos no C++
3 - Exemplos de Orientação a objetos • 3.2 – Suporte em Java • 3.2.5 – Avaliação. • Projeto similar ao C++ • Mas tem diferenças • Ausência de funções. • Não permite classes sem pais. • Vinculação dinâmica é normal • Controles de acesso simplificados, Variando de controles de derivação a funções amigas.
3 - Exemplos de Orientação a objetos 3.3 – Suporte em ADA 95
3 - Exemplos de Orientação a objetos • 3.3 – Suporte em ADA 95 • 3.3.1 – Características gerais. • Derivada do ADA 83, mas com extensões significativas. • Projetada para suportar orientação o objetos. • ADA 83 já possuía suporte a tipos abstratos. • Implementaram apenas suporte a vinculação dinâmica e herança. • Tinha o objetivo de mudar o mínimo no ADA 83 • E manter a verificação de tipos estática. • Classes como uma nova categoria, tipos marcados. • Esses tipos podem ser registros ou tipos privados. • São encapsulados em pacotes que permitem compilação separada. • OS tipos são chamados marcados porque incluem implicitamente uma tag. • O subprograma que define as operações em um tipo-marcado aparece na mesma lista da declaração que a do tipo.
3 - Exemplos de Orientação a objetos 3.3 – Suporte em ADA 95 3.3.1 – Características gerais.
3 - Exemplos de Orientação a objetos • 3.3 – Suporte em ADA 95 • 3.3.2 – Herança. • Os tipos derivados baseiam-se em tipos marcados. • Novas entidades são adicionadas às herdadas incluindo uma definição de registro. • Essa nova classe é definida em um pacote separado, para não exigir a recompilarão do tipo-pai. • Por esse mecanismo de herança não existe nenhuma maneira de impedir que as entidades da classe-pai sejam incluídas na derivada. • Classes derivadas podem somente estender classes-pai, e portanto são subtipos.
3 - Exemplos de Orientação a objetos • 3.3 – Suporte em ADA 95 • 3.3.3 – Vinculação Dinâmica. • Oferece tanto vinculação dinâmica quanto estática. • A vinculação dinâmica é forçada utilizando tipos de classe ampla. • Três tipos básicos puramente abstratos podem ser definidos no ADA 95. • Basta declarar como abstract nas definições de tipos • As definições de subprogramas não podem ter corpos.
3 - Exemplos de Orientação a objetos • 3.3 – Suporte em ADA 95 • 3.3.4 – Avaliação. • Não é possível comparar ADA 95 com C++, baseando apenas no que foi apresentado. • Elas são muito diferentes. • Porém as classes C++ tem seu próprio sistemas de tipos usual herdado do C • C++ oferece melhor suporte a herança múltipla. • ADA não inclui suporte a construtores e destrutores. • ADA não restringe a vinculação dinâmica apenas a ponteiros e referências. E sim aos próprios objetos.
3 - Exemplos de Orientação a objetos 3.4 – Considerações Finais
3 - Exemplos de Orientação a objetos • 3.4 – Considerações Finais • A programação Orientada a a objetos inclui três conceitos fundamentais: • Tipos de dados abstratos. • Herança. • Vinculação Dinâmica. • Paradigma suportado com: • Classes • Métodos • Objetos • Passagem de mensagens • Alguma linguagens são Puramente OO (SmallTalk) • Outras Híbridas (C++) • E outras controversas (Java)