Você está na página 1de 31

ABSTRAO

processo de representar um grupo de


entidades atravs de seus atributos comuns
feita a abstrao, cada entidade particular
(instncia) do grupo considerada somente
pelos seus atributos particulares
os atributos comuns s entidades do grupo
so desconsiderados (ficam "ocultos" ou
"abstrados")

ABSTRAO
de processos
de dados

ABSTRAO DE PROCESSOS
o conceito de abstrao de processos um
dos mais antigos no projeto de linguagens
absolutamente crucial para a programao
historicamente anterior abstrao de dados
todos os subprogramas so abstraes de
processo
exemplo: chamadas sort(array1, len1),
sort(array2, len2), ...

MDULOS
mdulos so "containers" sintticos contendo
subprogramas e grupos de dados relacionados
logicamente
modularizao: processo de projetar os mdulos de
um programa
a compreenso do programa pelos mantenedores seria
impossvel sem organizao modularizada
alm disso, h um ponto crtico: quando o projeto de
um programa estende-se por milhares de linhas,
recompil-lo totalmente a cada atualizao do cdigo
absolutamente invivel - da a necessidade de
modulariz-lo

ENCAPSULAMENTO
um agrupamento de subprogramas+dados que
compilado separada/independentemente chama-se uma
unidade de compilao ou um encapsulamento
um encapsulamento portanto um sistema abstrado
muitas vezes os encapsulamentos so colocados em
bibliotecas
exemplo: encapsulamentos C (no so seguros porque
no h verificao de tipos de dados em diferentes
arquivos de encapsulamento)

OBJETOS
um tipo abstrato de dados um encapsulamento que
inclui somente um tipo especfico de dado e os
subprogramas que fornecem as operaes para este tipo
detalhes de implementao do tipo ficam ocultos das
unidades fora do encapsulamento que o contm
um objeto uma varivel (instncia) de um tipo
abstrato de dados, declarada por alguma unidade
programao orientada a objetos consiste no uso de
objetos no desenvolvimento do software

EXEMPLO: O PONTO-FLUTUANTE
COMO TIPO ABSTRATO DE DADOS
embora o tipo ponto-flutuante esteja presente desde o incio
da programao, raramente nos referimos a ele como tipo
abstrato de dados
praticamente todas as linguagens permitem que se criem
"objetos" do tipo ponto-flutuante
observe que existe um conjunto de operaes que so vlidas
para o tipo ponto-flutuante, exatamente como os mtodos
definidos para uma classe
alm disso, a ocultao da informao est presente: o
formato real dos dados inacessvel ao programador - isto
exatamente o que se espera de uma abstrao
isto o que permite a portabilidade de um programa entre as
implementaes da linguagem para plataformas particulares

TIPOS DE DADOS ABSTRATOS


DEFINIDOS PELO USURIO
a definio do tipo e as operaes sobre objetos
do tipo esto contidas numa nica unidade
sinttica
outras unidades de programa podem ter
permisso para criar variveis do tipo definido
a implementao do tipo no visvel pelas
unidades de programa que usam o tipo
as nicas operaes possveis sobre objetos do
tipo so aquelas oferecidas na definio do tipo

CLIENTES
unidades de programa que utilizam um tipo abstrato
chamam-se clientes daquele tipo
a ocultao da representao do tipo abstrato
vantajoso para seus clientes: o cdigo no cliente no
depende desta representao, e mudanas na
representao no exigem mudanas nos clientes
(mas se o protocolo de alguma operao for
modificado, ento claro que os clientes precisam
ser alterados)
a ocultao aumenta a confiabilidade: nenhum
cliente pode interferir intencional ou acidentalmente
na representao

EXEMPLO: UMA PILHA E SUAS


OPERAES ABSTRATAS

create(stack)
destroy(stack)
empty(stack)
push(stack, elem)
pop(stack)
top(stack)
create(STK1); % STK1 um objeto ou uma
instncia do tipo stack
create(STK2); % outra instncia do tipo stack

TIPOS DE DADOS
ABSTRATOS EM C++
os tipos abstratos de dados em C++ so as
chamadas classes
as variveis so declaradas como instncias
de classes
classes do C++ so baseadas nas da
SIMULA67 e no struct do C
os dados definidos numa classe so os
membros de dados

FUNES-MEMBRO
as funes definidas em uma classe so as
funes-membro
as funes-membro so compartilhadas por
todas as instncias de classe
mas: cada instncia tem seu prprio conjunto de
membros de dados
uma funo membro pode ter sua definio
completa dentro da classe ("inlined") ou apenas
seu cabealho

TEMPO DE VIDA DAS CLASSES


as instncias de classe podem ser estticas,
stack-dinmicas ou heap-dinmicas,
exatamente como variveis do C
as classes podem incluir membros de dados
heap-dinmicos, no obstante elas prprias
no serem heap-dinmicas

OCULTAO DA
INFORMAO EM C++
clusula private: para entidades ocultas na
classe
clusula public: para as entidades visveis
aos clientes. Descreve a interface com
objetos da classe
clusula protected: relacionada com
herana

Construtores
Funes-membro usadas para inicializar os
membros de dados de um objeto recmcriado
Tambm alocam membros de dados heapdinmicos
Tm o mesmo nome da classe
Pode-se sobrecarregar construtores
No tm tipo de retorno, no usam return

Destrutores
Implicitamente chamados quando se encerra
o tempo de vida de um objeto
Se um objeto heap-dinmico, ser
explicitamente desalocado com delete
O destrutor pode conter chamadas delete
para desalocar membros de dados heapdinmicos
Nome do destrutor: ~ <nome_da_classe>
No tm tipo de retorno, no usam return

Exemplo

#include <iostream.h>
class pilha {
private:
int *ptr_pilha;
int tam_max;
int top_ptr ;
public:
pilha( ){
//** um construtor
ptr_pilha = new int [100];
tam_max = 99;
top_ptr = -1;
}

Exemplo
(continuao)
... ~pilha( ){ //** um destrutor
delete [ ] ptr_pilha;
}
void push ( int elem) {
if (top_ptr = = tam_max)
cout << Erro - pilha cheia\n;
else ptr_pilha[ + + top_ptr ] = elem;
}
void pop ( ) {
if (top_ptr = = -1)
cout << Erro - pilha vazia\n;
else top_ptr -- ;
}

Exemplo (continuao)
...

int top { return ( ptr_pilha[top_ptr] ); }


int empty { return ( top_ptr = = -1 ); }
} \\** fim da classe pilha
Cdigo no cliente:
void main ( ) {
int top_one;
pilha stk;
stk.push(42);
stk.push(17);
top_one = stk.top( );
stk.pop( );
... }

Avaliao das classes C++


As classes so tipos
No h construes de encapsulamento
generalizadas
Exemplo: temos uma classe matriz e uma
classe vetor, e precisamos multiplicar um
objeto matriz por um objeto vetor.
Em qual classe essa operao deve ser
definida?

Soluo para matriz vetor

class Matriz {
friend Vetor mult(const Matriz&, const Vetor&);
...}
class Vetor {
friend Vetor mult(const Matriz&, const Vetor&);
...}
Vetor mult(const Matriz& m1, const Vetor& v1){

..}
Se Matriz e Vetor pudessem ser definidas num nico
pacote, evitaramos esta construo pouco natural.

Java
Suporte para tipos abstratos similar a C++
Todos os tipos de dados definidos pelo
usurio so classes
Todos os objetos so heap-dinmicos e
acessados por variveis de referncia
Todos os subprogramas (mtodos) em Java
somente podem ser definidos em classes
public e private so modificadores anexados
s definies de mtodos/variveis

Java
Suporte para tipos abstratos similar a C++
Todos os tipos de dados definidos pelo
usurio so classes
Todos os objetos so heap-dinmicos e
acessados por variveis de referncia
Todos os subprogramas (mtodos) em Java
somente podem ser definidos em classes
public e private so modificadores anexados
s definies de mtodos/variveis

Pacotes Java
Em C++ as classes so a nica construo de
encapsulamento
Java inclui uma construo adicional: os pacotes
Pacotes podem conter mais de uma classe
public e private so os chamados modificadores
Os membros sem modificador (e os membros
public) de uma classe so visveis a todas as
classes do mesmo pacote (escopo de pacote)
No h, portanto, necessidade de declaraes
friend explcitas em Java

Exemplo
import java.io.*
class Pilha {
private int [ ] ref_pilha;
private int tam_max, top_index ;
public Pilha( ){ // um construtor
ref_pilha = new int [100];
tam_max = 99;
top_index = -1;
}

Exemplo
(continuao)
... public void push ( int elem) {
if (top_index = = tam_max)
System.out.println(Erro);
else ref_pilha[ + + top_index ] = elem;
}
public void pop ( ) {
if (top_index = = -1)
System.out.println(Erro);
else --top_index ;
}
public int top { return ( ref_pilha[top_index] ); }
public boolean empty { return ( top_index = = -1 ); }
} \\** fim da classe Pilha

Exemplo (continuao) - uso da classe Pilha

public class Testa_Pilha {


public static void main (String [ ] args) {
Pilha p1 = new Pilha( );
p1.push(42);
p1.push(29);
p1.pop( );
p1.pop( );
p1.pop( ); // Produz msg de erro
... }
No h destrutor (eliminado pela coleta de lixo implcita
em Java)
Observe o uso de varivel de referncia em vez de ponteiro

Classes parametrizadas em C++


Exemplo: suponha que o mtodo construtor para a
classe pilha fosse:
pilha (int size ){
ptr_pilha = new int [size];
tam_max = size-1;
top_ptr = -1;
}
No cliente:
... pilha(150) p1;

Classes genricas em C++

#include <iostream.h>
template < class TIPO >
class pilha {
private:
TIPO *ptr_pilha;
int tam_max;
int top_ptr ;
public:
pilha( ){
//** um construtor
ptr_pilha = new TIPO [100];
tam_max = 99;
top_ptr = -1;
}

Classes genricas em C++ (continuao)


pilha (int size ){ // outro construtor sobrecarregado
ptr_pilha = new TIPO [size];
tam_max = size-1;
top_ptr = -1;
}
~pilha( ){ delete ptr_pilha;
}
void push ( TIPO elem) {
if (top_ptr = = tam_max)
cout << Erro - pilha cheia\n;
else ptr_pilha[ + + top_ptr ] = elem;
}
void pop ( ) {...}

Classes genricas em C++ (continuao)


...

TIPO top { return ( ptr_pilha[top_ptr] ); }


int empty { return ( top_ptr = = -1 ); }
} \\** fim da classe pilha