Tipos abstrados de dados e construções de encapsulamento

Documentos relacionados
Paradigmas de Linguagens de Programação. Tipos de Dados Abstratos

Nomes, vinculações e escopos

Nomes, vinculações e escopos

Suporte a programação orientada a objetos

Encapsulamento e Modularização

Encapsulamento e Modularização

Implementação de subprogramas

Implementando subprogramas

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

Classes e Encapsulamento

Paradigmas de Linguagens de Programação. Subprogramas

Linguagens de Programação Aula 12

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Genéricos. Profa. Thienne Johnson EACH/USP

C com introdução a OO

Fundamentos de Programação

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

Expressões e sentença de atribuição

Fundamentos de Programação 2

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Classes e Objetos. Sintaxe de classe em Java

Linguagens de Programação. Marco A L Barbosa

Capítulo 9. Subprogramas

Tipos Abstratos de Dados (TAD)

PCS Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 5: Encapsulamento e Tipo Abstrato de Dados

Capítulo 5. Nomes, Vinculações e Escopos

Nomes, vinculações e escopos

Motivação. Estrutura de Dados. Motivação. Motivação. Por que estudar os tipos de dados? Duas são as principais preocupações em um projeto de software

Linguagens de Programação Aula 11

Herança e Polimorfismo (Universal)

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

Introdução à Programação. Encapsulamento e Herança

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Variáveis. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Namespaces, Classes e Métodos.

02. [Sebesta, 2000] Qual é o perigo potencial dos nomes que fazem distinção entre maiúsculas e minúsculas?

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Universidade Federal Rural de Pernambuco Departamento de Estatística e Informática Subprogramas

Implementação da programação modular II

Linguagens de Programação

Tipos Abstratos de Dados TADs

Conceitos de Linguagens de Programação

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Conceitos de Linguagens de Programação

O que é uma variável?

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

CIV 2802 Sistemas Gráficos para Engenharia º Trabalho: Programação básica em C++: Classes

Estruturas de controle no nível de sentença

Programação Orientada a Objetos

Laboratório de programação II

Sistemas de Tipos. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

Manipulação de excecões e manipulação de eventos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

3.4. Programação Orientada a Objetos

Linguagem de Programação C++

Técnicas de Programação:

Programação Orientada a Objetos OUTROS MECANISMOS

Métodos Genéricos. Prof.: Michele Nasu Tomiyama Bucci

02. [Sebesta, 2000] Quais são as vantagens e as desvantagens dos tipos de dados decimais?

Orientação a Objetos AULA 09

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Nomes, Amarração, Verificação de Tipos, e Escopo

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

Programação Orientada a Objetos para Redes de Computadores

Paradigmas de Linguagens de Programação. Nomes, Vinculações, Verificação de Tipos e Escopos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Coleções. João Paulo Q. dos Santos

Linguagem de Programação IV Introdução

Linguagem de Programação C++

4 Conceito de Herança

Linguagens de Programação

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Análise de Programação

Classes, Métodos e Propriedades

The Cyclops Project. Introdução: C++

Conceitos de Linguagens de Programação

Java 2 Standard Edition Classes internas

Visibilidade e Encapsulamento

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

Palavras Reservadas da Linguagem Java

Suporte a Programação Genérica em Linguagens

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Introdução a classes e objetos. Copyright 2006 by Pearson Education

Laboratório de programação II

Linguagem de Programação II Implementação

Persistência. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

Construtores e Especificadores de Acesso

//conteúdo do arquivo Matriz.h class Matriz { private: int *elementos; int numerodelinhas; int numerodecolunas; void setnumerodelinhas(int); void

Linguagem de Programação III

Programação Orientada a Objetos

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

PLANO DE UNIDADE DIDÁTICA- PUD

E N C A P S U L A M E N T O P R O F. M E. H É L I O E S P E R I D I Ã O

Introdução. LP OO desenvolvida pela Sun no início da década de 90 com sintaxe semelhente a C\C++. C C++.

Classes e Objetos. Prof. Leonardo Barreto Campos 1

Transcrição:

Tipos abstrados de dados e construções de encapsulamento Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá cba Este trabalho está licenciado com uma Licença Creative Commons - Atribuição-CompartilhaIgual 4.0 Internacional. http://github.com/malbarbo/na-lp-copl

Conteúdo O conceito de abstração Introdução à abstração de dados Questões de projeto Exemplos de linguagens Tipos abstratos de dados parametrizados Construções de encapsulamento Encapsulamento de nomes Referências

O conceito de abstração 3/55

O conceito de abstração Uma abstração é uma visão ou representação de uma entidade que incluí apenas os atributos mais significativos A abstração é uma ferramenta poderosa contra a complexidade, o seu propósito é simplificar a programação 4/55

O conceito de abstração Abstração de processos Subprogramas Por exemplo, em um procedimento de ordenação o algoritmo usado fica oculto sortint(list, listlen); Abstração de dados 5/55

Introdução à abstração de dados 6/55

Introdução à abstração de dados Um tipo abstrato de dado é um tipo de dado que satisfaz duas condições A representação dos objetos do tipo é ocultada da unidade de programa que usa o tipo, portanto, as únicas operações diretas possíveis sobre os objetos do tipo são aquelas fornecidas na definição do tipo A declaração do tipo e dos protocolos das operações sobre objetos do tipo (interface do tipo) estão contidas em uma única unidade sintática. A interface do tipo não depende da representação do tipo nem da implementação das operações 7/55

Introdução à abstração de dados Vantagens da primeira condição Confiabilidade, os clientes não podem mudar a representação dos objetos diretamente, aumentando a integridade dos objetos Evita colisões de nomes Possibilidade de alterar a representação e implementação sem afetar os clientes Vantagens da segunda condição Compilação separada 8/55

Introdução à abstração de dados Exemplos Tipo float Tipo pilha // create(stack), destroy(stack), empty(stack), // push(stack, element), pop(stack), top(stack)... create(stk1); push(stk1, color1); push(stk1, color2); if (!empty(stk1)) temp = top(stk1);... 9/55

Questões de projeto 10/55

Questões de projeto Requisitos da linguagem para TAD Uma unidade sintática que encapsula a definição do tipo e dos protótipos das operações Uma maneira de tornar o nomes de tipos visíveis para clientes do código e ocultar a implementação Poucas operações padrões (se alguma) deve ser fornecida (além das fornecidas na definição do tipo) Atribuição Comparação 11/55

Questões de projeto Qual é a forma do invólucro para a interface do tipo? Os tipos abstratos podem ser parametrizados? Quais mecanismos de controle de acesso são fornecidos e como eles são especificados? 12/55

Exemplos de linguagens 13/55

Exemplos de linguagens: Ada A construção de encapsulamento é chamada de pacote Pacote de especificação (define a interface do tipo) Pacote de corpo (implementação) 14/55

Exemplos de linguagens: Ada Ocultação de informação O pacote de especificação tem uma parte visível ao cliente e uma parte oculta (private) Na parte visível ao cliente é feito a declaração do tipo abstrato, que pode conter também a representação dos tipos não ocultos Na parte privada é especificada a representação do tipo abstrato 15/55

Exemplos de linguagens: Ada Motivos para ter uma parte privada no pacote de especificação O compilador precisa saber a representação vendo apenas o pacote de especificação O clientes precisam enxergar o nome do tipo, mas não a representação 16/55

Exemplos de linguagens: Ada Ter parte dos detalhes da implementação (a representação) no pacote de especificação não é bom Um solução é fazer todos os TADs serem ponteiros. Mas esta solução tem problemas Dificuldades com ponteiros Comparação de objetos O controle da alocação é perdido 17/55

package Stack_Pack is -- As entidades visíveis (interface) type Stack_Type is limited private; Max_Size: constant := 100; function Empty(Stk : in Stack_Type) return Boolean; procedure Push(Stk : in out Stack_Type; Element : in Integer); procedure Pop(Stk: in out Stack_Type); function Top(Stk: in Stack_Type) return Integer; -- Parte que é oculta aos clientes private type List_Type is array (1..Max_Size) of Integer; type Stack_Type is record List: List_Type; Topsub: Integer range 0..Max_Size := 0; end record; end Stack_Pack; 18/55

package body Stack_Pack is function Empty(Stk : in Stack_Type) return Boolean is begin return Stk.Topsub = 0; end Empty;... end Stack_Pack; 19/55

with Stack_Pack; procedure Use_Stacks is Topone : Integer; Stack : Stack_Type; begin Push(Stack, 42); Push(Stack, 17); Topone := Top(Stack); Pop(Stack);... end Use_Stacks; 20/55

Exemplos de linguagens: C++ C++ foi criado para adicionar orientação a objetos em C, portanto suporta TADs 21/55

Exemplos de linguagens: C++ Os mecanismos de encapsulamento são as classes e estruturas Os dados são chamados de dados membros As funções são chamadas de funções membros Os membros podem ser da classe ou da instância Todas as instâncias de uma classe compartilham um cópia das funções membros Cada instância da classe tem sua cópia dos dados membros As instâncias podem ser estáticas, dinâmica na pilha ou dinâmicas no heap (new e delete) Uma função membro pode ser inline (cabeçalho e corpo juntos) 22/55

Exemplos de linguagens: C++ Ocultação de informação private, para entidades ocultas public, para entidades públicas protected, para entidades visíveis apenas para as subclasses Construtores Utilizados para inicializar uma instância da classe Destrutores Chamado implicitamente quando o tempo de vida da instância acaba 23/55

class Stack { private: int *stackptr; int maxlen; int topptr; public: Stack() { // construtor stackptr = new int [100]; maxlen = 99; topptr = -1; }; ~Stack () { // destrutor delete [] stackptr; }; void push (int num) {...}; void pop () {...}; int top () {...}; int empty () {...}; } 24/55

void main() { int topone; Stack stk; stk.push(42); stk.push(17); topone = stk.top(); stk.pop();... } 25/55

Exemplos de linguagens: C++ Separando a definição da implementação 26/55

// Stack.h - arquivo de cabeçalho para classe Stack class Stack { // Membros visíveis apenas para outros // membros da classe private: int *stackptr; int maxlen; int topptr; // Membros visíveis para os clientes public: Stack(); // Construtor ~Stack(); // Destrutor void push(int); void pop(); int top(); int empty(); } 27/55

// Stack.cpp - implementação para a classe Stack #include <iostream> #include "Stack.h" using std::count; Stack::Stack() { stackptr = new int[100]; maxlen = 99; topptr = -1; }... void Stack::push(int number) {... }... 28/55

Avaliação Ada e C++ Expressividade similar Ambos fornecem mecanismos de encapsulamento e ocultação de informação Classes são tipos, os pacotes em Ada são mecanismos mais gerais de encapsulamento 29/55

Exemplos de linguagens: Java Similar ao C++, exceto que Todos os tipos definidos pelos usuários são classes Todos os objetos são alocados no heap e acessados através de referência Os métodos precisam ser definidos na classe Os modificadores de acesso são especificados em entidades, não em cláusulas Não tem destrutor 30/55

class Stack { private int [] stackref; private int maxlen; private int topindex; public Stack() { // a constructor stackref = new int [100]; maxlen = 99; topptr = -1; }; public void push(int num) {...}; public void pop() {...}; public int top() {...}; public boolean empty() {...}; } 31/55

class TestStack { public static void main(string[] args) { Stack mystack = new Stack(); mystack.push(42); mystack.push(29);... mystack.pop();... } } 32/55

Exemplos de linguagens: C# Baseado em C++ e Java As instâncias de classe são dinâmicas no heap Destrutores são raramente usados Estruturas são semelhantes as classes, mas não podem ter herança, são alocadas na pilha e acessadas como valores Suporte a propriedades, que é uma maneira de implementar getters e setters sem requerer a chamada de método explícita 33/55

public class Weather { public int DegreeDays { get {return degreedays;} set { if(value < 0 value > 30) Console.WriteLine("Value is out of range: {0}", value); else degreedays = value; } } private int degreedays;... }... Weather w = new Weather(); int degreedaystoday, olddegreedays;... w.degreedays = degreedaystoday;... olddegreedays = w.degreedays; 34/55

Exemplos de linguagens: Ruby O mecanismo de encapsulamento são as classes Capacidade semelhante as classes em C++ e Java Os nomes das variáveis de instâncias começam com @ e de classes com @@ Os métodos são declarados com as mesma sintaxe que as funções O construtor é o initialize, que é chamado quando o método new da classe é chamado As classes são dinâmicas Ocultação de informação Os membros das classes podem ser públicos ou privados 35/55

class StackClass def initialize @stackref = Array.new @maxlen = 100 @topindex = -1 end def push(number)... end def pop... end def top... end def empty... end end 36/55

mystack = StackClass.new mystack.push(42) mystack.push(29) puts "Top element is (should be 29): #{mystack.top}" mystack.pop puts "Top element is (should be 42): #{mystack.top}" mystack.pop 37/55

Tipos abstratos de dados parametrizados 38/55

Tipos abstratos de dados parametrizados Permite a criação de tipos abstratos de dados que podem armazenar dados de qualquer tipo Não é uma questão relacionada as linguagens dinâmicas Algumas linguagens com suporte a TAD parametrizados Ada, C++, Java 5, C# 2005 39/55

Tipos abstratos de dados parametrizados em Ada generic Max_Size: Positive; type Element_Type is private; package Generic_Stack is Type Stack_Type is limited private; procedure Push(Stk : in out Stack_Type; Element : in Element_Type);... end Generic_Stack; Package Integer_Stack is new Generic_Stack(100, Integer); Package Float_Stack is new Generic_Stack(100, Float); 40/55

Tipos abstratos de dados parametrizados em C++ template <class Type> class Stack { private: Type *stackptr; int maxlen; int topptr; public: Stack(int size) { stackptr = new Type[size]; maxlen = 99; topptr = -1; }; void push(type value) {...};... } Stack<int> s1; Stack<float> s2; 41/55

Tipos abstratos de dados parametrizados em Java 5 Antes da versão 5, as classes como LinkedList e ArrayList podiam armazenar qualquer objeto Problemas com coleção de objetos Todo objeto da coleção precisa da coerção quando é acessado Não é possível fazer checagem de tipo quando os valores são adicionados Não é possível inserir tipos primitivos nas coleções 42/55

Tipos abstratos de dados parametrizados em Java 5 O Java 5 tentou resolver estes problemas, adicionado genéricos (e autoboxing) a linguagem As classes genéricas resolveram o primeiro e o segundo problema, mas não o terceiro, porque os parâmetros genéricos tem quer classe O autoboxing resolveu o terceiro problema 43/55

class Stack<T> { private T[] stackref; private int maxlen; private int topindex;... public void push(t value) {...};... } Stack<Integer> s1 = new Stack<Integer>(); int x = 10; s1.push(x); int y = s1.top(); Stack<Float> s2 = new Stack<Float>(); 44/55

Tipos abstratos de dados parametrizados em C# 2005 Assim como Java, nas primeiras versão do C# as coleção armazenavam objetos de qualquer classe Classes genéricas foram adicionadas ao C# 2005. Diferente do Java, os elementos de coleções genéricas podem ser acessados através de índices 45/55

Construções de encapsulamento 46/55

Construções de encapsulamento Programas maiores têm duas necessidades especiais Alguma maneira de organização, além da simples divisão em subprogramas e tipos abstratos de dados Alguma maneira de realizar compilação parcial Solução: Encapsulamento Agrupar os códigos e dados logicamente relacionados em uma unidade que possa ser compilada separadamente Existem várias formas de encapsulamento 47/55

Construções de encapsulamento Encapsulamento em C Um ou mais subprogramas e tipos são colocados em arquivos que podem ser compilados independentemente A interface é colocada em um arquivo de cabeçalho, e a implementação em outro arquivo #include é utilizado para incluir o cabeçalho O ligador não checa os tipos entre o cabeçalho e a implementação 48/55

Construções de encapsulamento Encapsulamento em C++ Permite definir arquivos de cabeçalho e implementação (semelhante ao C) Os arquivos de cabeçalho de templates em geral incluem a declaração e a definição friend fornece um mecanismo para permitir acesso a membros privados 49/55

Construções de encapsulamento Pacotes Ada Podem incluir várias declarações de tipos e subprogramas Podem ser compilados separadamente Os pacotes de especificação e corpo podem ser compilados separadamente 50/55

Construções de encapsulamento Assemblies em C# Uma coleção de arquivos que aparentam ser uma DLL ou executável Cada arquivo define um módulo que pode ser compilado separadamente Uma DLL é uma coleção de classes e subprogramas que são ligados individualmente a um executável Contém outras informações, como dependências e versão Podem ser privados ou públicos O modificador de acesso internal especifica que um membro é visível a todos no mesmo assembly 51/55

Encapsulamento de nomes 52/55

Encapsulamento de nomes Como desenvolvedores trabalhando independentemente podem criar nomes para variáveis, classes, etc, sem acidentalmente usar um nome já em uso? Usando um encapsulamento de nome, que cria um novo escopo de nomes Namespaces em C++ Pacotes em Java Pacotes em Ada Módulos em Ruby 53/55

Referências 54/55

Referências Robert Sebesta, Concepts of programming languages, 9ª edição. Capítulo 11. 55/55