Tipos Abstratos de Dados
Conceituação
Propriedades
Utilização
Exemplos
Evolução do modelo imperativo
Modelo imperativo: baseado em representação
de dados e seqüência de ações sobre os dados
modelo procedural modelo de objetos
tipos de dados TADS classes
classes são tipos de dados em Linguagens
Orientadas a Objetos
Mecanismos de LP
modelo procedural: encapsulamento, proteção e
polimorfismo estático
modelo de objetos: herança e polimorfismo dinâmico
Descrição de tipos
relembrando...
Nome: designação do tipo. Ex. Boolean
Valores : domínio de valores. Ex. Valores lógicos:
verdadeiro/falso
Operações: repertório de operações permitidas Ex.
Negação, conjunção, disjunção.
Testes : relações de igualdade, ordem e outros
predicados. Ex. relação de igualdade
Constantes: forma de representação de constantes.
Ex. True , False
Tipos primitivos: exemplo de abstração
// float: abstração de um número em ponto flutuante
float a, b, c, s;
// tipo de dados é associado a um domínio de valores
b = 1.0;
c = 2.0;
// tipo de dados é associado a conjunto de operações
a = b + c; a+=; c++;
// tipo de dados associado a uma representação interna
8 bits, 16 bits, 32 bits ...
Abstração de representação
Abstração de operações
Tipos ‘padrão’ e Tipos Abstratos
Tipos ‘padrão”: Tipos abstratos: novos
repertório de tipos de tipos criados pelo usuário
dados oferecidos pela LP Estendem o conjunto
primitivos padrão de tipos
estruturados
Devem oferecer
Predefinem representação
representação operações
operações
Sempre são definidos
Podem ser definidos pelo pelo usuário
usuário no próprio bibiotecas padrão
programa bibliotecas de
fornecedores diversos
Tipos definidos pelo usuário
Mnemônicos associados a tipos existentes
Sinonímia: não criam novos tipos de dados; apenas
usam identificadores simbólicos.
Composição: podem ser combinados com outros
tipos de dados.
Permitem restrições / enumerações
Objetivo principal: legibilidade
type
TS = ( verde, vermelho, azul);
VetorCor = array [TS] of boolean;
var { instanciação }
Cor : VetorCor;
Tipo Abstrato de Dado: definição
É um tipo de dados que satisfaz as seguintes
condições:
a representação ou definição do tipo e as operações
sobre objetos do tipo estão contidas em uma única
unidade sintática
outras unidades do programa podem ter permissão
para criar variáveis do tipo definido
a representação dos objetos não é visível pelas
unidades do programa que usam o tipo
as operações sobre os objetos são aquelas
oferecidas na definição do tipo
Fonte: Sebesta: Conceitos de Linguagens de Programação
Tipos Abstratos de Dados: exemplo
Combinam as abstrações de dados e de
procedimentos
abstrações de dados: fornecem a representação do
tipo
abstrações de procedimentos: fornecem as
operações sobre o tipo
E4 Operações
Representação: Empilha
Array E3
Desempilha
E2 Topo da pilha
E1 Pilha vazia?
TADs: propriedades
Satisfazem as propriedades de
- encapsulamento: definição isolada de outras
unidades do programa
- invisibilidade e proteção: representação do tipo
deve ser acessada somente no ambiente
encapsulado
A LP deve possibilitar
ambiente encapsulado
proteção de dados dados
interface para acesso
operações
Encapsulamento
Representa uma organização
lógica de dados e respectivas
operações
Separa utilização e princípio do
implementação ocultamento
utilização: interface (visível) de
implementação: código de informações
descrição de dados e operações
pode ser compilado separadamente
(invisível)
Encapsulamento em Pascal: Unit
Unit TADLista;
interface
type
elemento = record
valor: string[15]; operações sobre o tipo
elo: ^elemento;
end;
lista = object
Procedure Transfere(PosOrigem, PosDestino: integer);
Procedure ImpLista;
Function Procura(Valor: string): integer; ........
Private
nodo: elemento;
end;
implementation representação do tipo
.... end.
Encapsulamento no modelo de objetos:
classe
Classe é uma unidade de compilação
Classes permitem separar interface da
implementação
Java: interface e classe podem ser compiladas
separadamente
C++: arquivos de protótipo (interface) e de
implementação podem ser compilados
separadamente
Encapsulamento, herança e polimorfismo
atributos de acesso a propriedades
herança de atributos
redefinição de propriedades herdadas
Proteção de Dados
A coleção de dados somente é acessada pelas
operações definidas sobre o tipo no ambiente
encapsulado
Exemplos de cápsulas:
Modelo procedural: unidades
Modelo de objetos: classes
Níveis de proteção: o ambiente encapsulado
pode ‘exportar’ dados para outros ambientes
Exemplo: atributos de visibilidade (public, private,
protected)
O ambiente encapsulado pode ´importar´dados
Exemplo: import Complex; uses Complex;
Proteção de Código
Uma interface declara apenas o que o cliente
necessita saber para usar o TAD
Java: interface IComplex { public void lista(); }
C++: class Complex { public: void lista();}
A implementação pode ser feita em uma unidade
separada
Java: class Complex implements IComplex {// implementa
lista)}
C++: Complex::lista(){ // implementa lista)}
Cada operação (função/método) pode ser
associada a atributos de visibilidade (public, private,
protected)
Vantagens da proteção de dados e
operações
Código do cliente do TAD não depende da
implementação
A representação do tipo pode ser alterada sem
ser necessário notificar o cliente
Segurança:
clientes não podem alterar a representação
clientes não podem tornar os dados inconsistentes
cliente
cliente
cliente usa TAD
Exemplo em Java: Coleções de Objetos
inserir
percorrer
procurar
Distintas representações
Operações similares
Estrutura de coleções em Java
Base: interfaces com
operações genéricas
Hierarquia com a raiz
Collection
Implementações de List:
ArrayList, LinkedList e Vector
Implementações de Set:
HashSet, TreeSet (SortedSet)
Implementações de Map )
HashMap
TreeMap (SortedMap
Collection: operações básicas
A interface Collection contém os métodos
abstratos para as operações fundamentais
public interface Collection {
// Basic Operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(Object element); // Optional
boolean remove(Object element); // Optional
Iterator iterator();
// continua
Importante: Cada coleção implementa suas operações
Outras operações
A interface Collection também contém os métodos
abstratos para operações sobre o agrupamento
// Bulk Operations
boolean containsAll(Collection c);
boolean addAll(Collection c); // Optional
boolean removeAll(Collection c); // Optional
boolean retainAll(Collection c); // Optional
void clear(); // Optional
// Array Operations
Object[] toArray();
Object[] toArray(Object a[]);
}
Exemplo em Java: hashSet
Package java.util: implementa contêineres
genéricos, tais como:
Set, List, Map, SortedSet, SortedMap, HashSet,
TreeSet, Arrays, ArrayList, LinkedList, Vector
import java.util.*;
class TipoSet{
public static void main(String args[]){
String legumes[]={"alface","tomate","cebola"};
HashSet salada1=new HashSet();
for (int i=0;i
salada1.add(legumes[i]);
System.out.println(salada1); ...}
Exemplo C++: Container Class Library
Contém duas coleções de famílias de classes
parametrizadas:
ADT - Abstract Data Types : contém classes que
enfatizam as operações fundamentais de estruturas de
dados tais como: pilhas, filas, ‘deques’, ‘bags’, ‘sets’,
‘arrays’, dicionários
FDS - Fundamental Data Structures: contém
classes que enfatizam a forma de armazenamento de
estruturas de dados tais como: Listas, Listas duplamente
encadeadas, Vetores, Tabelas ‘hash’, Árvores binárias
TADS: Resumo
Estendem o conjunto padrão de tipos
Devem oferecer
representação do tipo
operações sobre o tipo
Questões de implementação
Como representar contêineres genéricos quanto a
tipo?
Como oferecer suporte às operações?
É possível sobrecarregar operadores?
É possível a interoperabilidade?
FIM