You are on page 1of 29

GCC 105 LINGUAGENS DE

PROGRAMAO I
Universidade Federal de Lavras
Departamento de Cincia da Computao

AULA 16 Tipos Abstratos de Dados


II
1 Semestre de 2015
Prof. Janderson Rodrigo de Oliveira

Tipos Abstratos de Dados


Parametrizados
Em geral, conveniente ser capaz de parametrizar tipos
abstratos de dados.
Por exemplo, devemos ser capazes de projetar um tipo
abstrato de dados pilha que possa armazenar pilhas de
diferentes tamanhos ou que possa armazenar quaisquer tipos
escalares em vez de escrever uma abstrao de pilha
separada para cada tipo diferente.
Note que esta uma questo para linguagens estaticamente
tipadas. Em uma linguagem dinamicamente tipada, como
Ruby, qualquer pilha pode implicitamente armazenar
qualquer tipo de dado.

Exemplos de Linguagem C++


C++ suporta tipos abstratos de dados parametrizados.
Inicialmente, podemos tornar uma classe C++ para uma pilha
genrica no tamanho da pilha. No exemplo a seguir, temos um
construtor no parametrizado:
1 Pilha(){
2

pilhaPtr = new int[100]; //ponteiro para a varivel

tamMax = 99; //quantidade maxima de elementos

topo = -1; //indice do elemento que esta no topo da pilha

5 }

Exemplos de Linguagem C++


Em uma classe C++ parametrizada, teramos um construtor
parametrizado na forma
1 Pilha(int tamanho){
2

pilhaPtr = new int[tamanho];

tamMax = tamanho-1;

topo = -1;

5 }

Exemplos de Linguagem C++


A definio de classe para Pilha pode incluir ambos os
construtores, de forma que os usurios possam usar a pilha
de tamanho padro ou especificar outro tamanho.
O tipo do elemento da pilha pode ser genrico tornando a
classe uma classe template.
O tipo do elemento pode ser um parmetro de template.

Uma definio da classe template para um tipo pilha


apresentada a seguir.

Exemplos de Linguagem C++


1 #include <iostream.h>
2 template <class Tipo> // Tipo o parmetro de template
3 class Pilha{
4

private:

Tipo *pilhaPtr;

int tamMax;

int topo;

public:

Exemplos de Linguagem C++


9
10

//Construtor para pilhas de 100 elementos


Pilha(){

11

pilhaPtr = new Tipo[100];

12

tamMax = 99;

13

topo = -1;

14

Exemplos de Linguagem C++


15
16

//Construtor parametrizado
Pilha(int tamanho){

17

pilhaPtr = new Tipo[tamanho];

18

tamMax = tamanho - 1;

19

topo = -1;

20

21

~Pilha(){ delete pilhaPtr; }

Exemplos de Linguagem C++


22

//Funo membro inserir

23

void inserir(Tipo elemento){


if (topo != tamMax)

24
25
26

pilhaPtr[++topo] = elemento;
}

Exemplos de Linguagem C++


27
28

//Funo membro remover


void remover(){

29

if (topo != -1)

30

topo--;

31

32

Tipo topo(){ return (pilhaPtr[topo]); }

33

int vazia() { return (topo == -1); }

34 };

Exemplos de Linguagem C++


Classes template em C++ so instanciadas em tempo de
compilao.
As instanciaes so implcitas:
Uma nova instanciao criada sempre que criado um objeto
que requeira uma verso da classe template at ento no
existente.

Exemplos de Linguagem Java


Java 5.0 suporta uma forma de tipos abstratos de dados
parametrizados na qual os parmetros genricos devem ser
classes.
Os tipos genricos mais comuns so de coleo, como
LinkedList e ArrayList.
Os tipos de coleo armazenam objetos da classe Object,
ento podem armazenar quaisquer objetos (mas no tipos
primitivos).

Exemplos de Linguagem Java


Existem trs problemas acerca dessa abordagem:
1. Sempre que um objeto removido da coleo, ele deve ser
convertido para o tipo apropriado;
2. No existe verificao de erros quando elementos so
adicionados coleo;
3. Os tipos de coleo no podem armazenar tipos primitivos.

Construes de Encapsulamento
Quando o tamanho de um subprograma ultrapassa a fronteira
de algumas poucas mil linhas de cdigo, dois problemas
prticos se tornam evidentes.
1. Do ponto de vista do programador, tal programa no impe um
nvel adequado de organizao para mant-lo intelectualmente
gerencivel.
2. Recompilao. Para programas pequenos, a recompilao do
programa completo aps cada modificao no custosa. Para
programas grandes, o custo da recompilao significativo se
todo o programa precisa ser recompilado a cada modificao.

Construes de Encapsulamento
A soluo para esses problemas organizar os programas em
colees de cdigo e dados logicamente relacionados, cada
uma podendo ser compilada sem a recompilao do resto do
programa.
Um encapsulamento tal coleo.
Encapsulamento so colocados em bibliotecas e
disponibilizados para reuso em programas alm daqueles para
os quais eles foram escritos.

Construes de Encapsulamento
Subprogramas Aninhados
Em linguagens que permitem subprogramas aninhados, os
programas podem ser organizados por definies de
subprogramas aninhadas dentro de subprogramas maiores que
os usam.
Isso pode ser feito em Ada, Fortran 95, Python e Ruby.
Esse mtodo de organizar programas no ideal. Logo, mesmo
nas linguagens que o possuem, ele no usado como uma
construo de organizao de encapsulamento primria.

Construes de Encapsulamento
Encapsulamento em C
C no fornece um suporte forte para tipos abstratos de dados,
apesar de tipos abstratos de dados poderem ser simulados.
Em C, uma coleo de funes e definies de dados
relacionados pode ser colocada em um arquivo, que pode ser
compilado independentemente.
A interface para esse arquivo, incluindo os dados, tipos e
declaraes de funes, colocado em um arquivo chamado
arquivo de cabealho.

Construes de Encapsulamento
Encapsulamento em C
As definies completas das funes precisam aparecer apenas
no arquivo de implementao.
Quando o programa em questo precisa ser utilizado, o arquivo
de cabealho includo no cdigo cliente usando uma
especificao de pr-processador #include.
A especificao #include tambm documenta o fato de que
o programa cliente depende do arquivo de implementao.
Essa abordagem separa a especificao e a implementao de
um encapsulamento.

Construes de Encapsulamento
Encapsulamento em C++
C++ fornece dois tipos de encapsulamento:
Arquivos de cabealho e de implementao podem ser
definidos como em C;
Arquivos de cabealhos de classes e definies de classes
podem ser definidas.
Em funo da complexa interao dos templates C++ e da
compilao separada, os arquivos de cabealho das bibliotecas
template de C++ geralmente incluem a definio completa dos
recursos.

Construes de Encapsulamento
Encapsulamento em C++
Quando classes que no contm templates so usadas para
encapsulamento, o arquivo de cabealho de classe tem apenas
os prottipos das funes membros, com as definies das
funes fornecidas fora da classe em um arquivo de cdigo.
Isso separa claramente a interface da implementao.

Nomeando Encapsulamentos
Existe um outro tipo de encapsulamento necessrio para
construir grandes programas: um encapsulamento de
nomeao.
Um grande programa pode ser escrito por muitos
desenvolvedores. Isso requer que as unidades lgicas do
programa sejam independentes, embora ainda assim seja
possvel trabalhar em conjunto.

Nomeando Encapsulamentos
Um grande programa escrito por muitos desenvolvedores
tambm cria um problema de nomeao:
Como desenvolvedores trabalhando independentemente criam
nomes para suas variveis, mtodos ou classes sem
acidentalmente usar nomes j em uso por outro programador
em uma parte diferente do mesmo sistema de software?
Encapsulamento de nomeao definem escopos de nome que
ajudam a evitar conflitos.

Nomeando Encapsulamentos

Cada biblioteca pode criar seu prprio encapsulamento para


prevenir que seus nomes entrem em conflito com aqueles
definidos em outras bibliotecas ou em cdigo cliente.
Cada parte lgica de um sistema de software pode criar um
encapsulamento com o mesmo propsito.

Nomeando Encapsulamentos
Espaos de nomes em C++
C++ inclui uma especificao, namespace, que ajuda os
programas a gerenciarem o problema de espao de nomes
globais.
Um programador pode colocar cada biblioteca em seu prprio
espao de nomes e qualific-los no programa com o nomes do
espao de nomes quando eles so usados fora desse espao.
Exemplo:
1

namespace MinhaPilha{
//Declaraes de uma estrutura pilha

2
3

Nomeando Encapsulamentos
Espaos de nomes em C++
Um cdigo cliente pode ganhar acesso aos nomes no espao de
nomes de uma biblioteca de trs maneiras.
1. Qualific-los a partir da biblioteca com o nome do espao de
nomes. Exemplo:
MinhaPilha::topo
2. Usar a diretiva using para nomes especficos. Exemplo:
using MinhaPilha::topo;
que torna apenas o nome topo visvel.

Nomeando Encapsulamentos
Espaos de nomes em C++
3. Usar a diretiva using para qualificar todos os nomes de um
espao de nomes. Exemplo:
using namespace MinhaPilha;

Nomeando Encapsulamentos
Pacotes em Java
Java inclui uma construo de encapsulamento de nomeao: o
pacote.
Pacotes podem conter mais de uma definio de classe, e as
classes em um pacote so parcialmente visveis umas as outras.
Parcial aqui significa que as entidades pblicas ou protegidas
definidas em uma classe em um pacote, ou que no tenham um
especificador de acesso, so visveis para todas as outras classes
no pacote.

Nomeando Encapsulamentos
Pacotes em Java
Os recursos definidos em um arquivo so especificados como
em um pacote em particular com uma declarao de pacote,
como em:
package MinhaPilha;

A declarao de pacote deve aparecer como a primeira linha do


arquivo. Os recursos de cada arquivo que no incluem uma
declarao de pacote so implicitamente colocados no mesmo
pacote no nomeado.

Nomeando Encapsulamentos
Pacotes em Java
Java fornece a declarao import, que permite referenciar os
nomes definidos em um pacote. Por exemplo:
import MinhaPilha.*;
Para acessar apenas um nome do pacote, ele pode ser dado na
declarao de importao, como em:
import MinhaPilha.topo;

You might also like