O documento discute tipos abstratos de dados (TAD) e encapsulamento. Ele introduz os conceitos de abstração e TAD definidos pelo usuário, apresentando exemplos. Também aborda questões de projeto de TADs e exemplos de como linguagens como Ada, C++, Java e Ruby implementam encapsulamento e TADs.
ESTUDO DE MOBILIDADE DE AGENTES EM APLICAÇÕES SENSÍVEIS AO CONTEXTO
TAD e Encapsulamento
1. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos Abstratos de Dados (TAD) e
Encapsulamento
Cap´
ıtulo 11 (Livro do Sebesta)
Helio Henrique L. C. Monte-Alto
Disciplina: Paradigma de Programa¸˜o Imperativa e Orientada
ca
a Objetos
2012
2. Tipos Abstratos de Dados (TAD) e Encapsulamento
T´picos
o
1 Conceito de abstra¸˜o
ca
Tipos de abstra¸˜o
ca
2 Introdu¸˜o ` abstra¸˜o de dados
ca a ca
Tipos de dados definidos pelo usu´rio
a
TAD definidos pelo usu´rio - Exemplo
a
3 Quest˜es de projeto
o
4 Exemplos de linguagens
Ada
C++
Java
Ruby
5 Tipos abstratos de dados parametrizados
TAD parametrizados - Exemplos
6 Constru¸˜es de encapsulamento
co
Exemplos de constru¸˜es de encapsulamento
co
7 Encapsulamento de nomes
3. Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstra¸˜o
ca
Conceito de abstra¸˜o
ca
4. Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstra¸˜o
ca
Conceito de abstra¸˜o
ca
Defini¸˜o
ca
Abstra¸˜o ´ uma vis˜o ou representa¸˜o de uma entidade que
ca e a ca
inclui apenas os atributos mais significantes.
5. Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstra¸˜o
ca
Conceito de abstra¸˜o
ca
Defini¸˜o
ca
Abstra¸˜o ´ uma vis˜o ou representa¸˜o de uma entidade que
ca e a ca
inclui apenas os atributos mais significantes.
Objetivo
A abstra¸˜o em linguagens de programa¸˜o (LP) ´ uma arma para
ca ca e
lidar com a complexidade, tornando um programa grande e/ou
complicado mais f´cil de ser implementado e mantido
a
6. Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstra¸˜o
ca
Tipos de abstra¸˜o
ca
Tipos de abstra¸˜o em LP
ca
Abstra¸˜o de processos
ca
Subprogramas (fun¸˜es, procedimentos, m´todos)
co e
Esconde detalhes da implementa¸˜o
ca
Permite reuso
Ex: sortInt(list)
Abstra¸˜o de dados
ca
Tipos de dados abstratos (structs, classes)
Encapsulamento
Instˆncia: objeto
a
Ex: listas, fila, pilha, registros, ´rvores, ponto flutuante
a
7. Tipos Abstratos de Dados (TAD) e Encapsulamento
Introdu¸˜o ` abstra¸˜o de dados
ca a ca
Tipos de dados definidos pelo usu´rio
a
Tipos de dados definidos pelo usu´rio
a
Caracter´
ısticas
TADs s˜o unidades sint´ticas que definem um tipo tal que:
a a
A interface (ou especifica¸˜o) do tipo n˜o depende da real
ca a
representa¸˜o dos dados ou da implementa¸˜o das opera¸˜es
ca ca co
sobre o tipo;
A representa¸˜o real ´ oculta do programa que a utiliza.
ca e
Vantagens
Oculta¸˜o de informa¸˜o
ca ca
Maior confiabilidade
Baixo acoplamento com os clientes do tipo
8. Tipos Abstratos de Dados (TAD) e Encapsulamento
Introdu¸˜o ` abstra¸˜o de dados
ca a ca
Tipos de dados definidos pelo usu´rio
a
Tipos de dados definidos pelo usu´rio
a
9. Tipos Abstratos de Dados (TAD) e Encapsulamento
Introdu¸˜o ` abstra¸˜o de dados
ca a ca
Tipos de dados definidos pelo usu´rio
a
Tipos de dados definidos pelo usu´rio
a
10. Tipos Abstratos de Dados (TAD) e Encapsulamento
Introdu¸˜o ` abstra¸˜o de dados
ca a ca
TAD definidos pelo usu´rio - Exemplo
a
Tipos de dados definidos pelo usu´rio - Exemplo
a
Opera¸˜es (interface) sobre uma estrutura de pilha:
co
create(stack)
destroy(stack)
empty(stack)
push(stack, element)
pop(stack)
top(stack)
11. Tipos Abstratos de Dados (TAD) e Encapsulamento
Introdu¸˜o ` abstra¸˜o de dados
ca a ca
TAD definidos pelo usu´rio - Exemplo
a
Tipos de dados definidos pelo usu´rio - Exemplo
a
Exemplo de c´digo do cliente:
o
...
create(stk1);
push(stk1, color1);
push(stk1, color2);
if(! empty(stk1))
temp = top(stk1);
...
Quest˜o: Vamos supor que a implementa¸˜o original dessa pilha
a ca
utilizasse lista est´tica. O que devemos fazer se precisarmos
a
modificar a estrutura de dados para lista ligada? A mudan¸a c
afetar´ o c´digo cliente?
a o
12. Tipos Abstratos de Dados (TAD) e Encapsulamento
Introdu¸˜o ` abstra¸˜o de dados
ca a ca
TAD definidos pelo usu´rio - Exemplo
a
Tipos de dados definidos pelo usu´rio - Exemplo
a
Exemplo de c´digo do cliente:
o
...
create(stk1);
push(stk1, color1);
push(stk1, color2);
if(! empty(stk1))
temp = top(stk1);
...
Quest˜o: Vamos supor que a implementa¸˜o original dessa pilha
a ca
utilizasse lista est´tica. O que devemos fazer se precisarmos
a
modificar a estrutura de dados para lista ligada? A mudan¸a c
afetar´ o c´digo cliente?
a o
˜
R: NAO, pois a interface n˜o precisa ser modificada, apenas a
a
implementa¸˜o.ca
13. Tipos Abstratos de Dados (TAD) e Encapsulamento
Quest˜es de projeto
o
Quest˜es de projeto
o
Unidade sint´tica para defini¸˜o dos tipos e subprogramas
a ca
Opera¸˜es embutidas comuns
co
atribui¸˜o
ca
compara¸˜es
co
iteradores
acessores
construtores
destruidores
Tipos abstratos parametrizados
Controle de acesso
14. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada
Encapsulamento
Constru¸˜es chamadas packages, divididas em duas partes, que
co
tamb´m s˜o packages:
e a
specification package
body package
15. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada - Exemplo
Especifica¸˜o para pilha:
ca
package S t a c k P a c k i s
−− As e n t i d a d e s v i s i v e i s , ou i n t e r f a c e p u b l i c a
type Stack Type i s l i m i t e d p r i v a t e ;
M a x S i z e : c o n s t a n t := 1 0 0 ;
f u n c t i o n Empty ( S t k : i n S t a c k T y p e ) r e t u r n B o o l e a n ;
p r o c e d u r e Push ( S t k : i n o ut S t a c k T y p e ; E l e m e n t : i n
Integer ) ;
p r o c e d u r e Pop ( S t k : i n o ut S t a c k T y p e ) ;
f u n c t i o n Top ( S t k : i n S t a c k T y p e ) r e t u r n I n t e g e r ;
−− A p a r t e o c u l t a d o s c l i e n t e s
private
type L i s t T y p e i s a r r a y ( 1 . . Max Size ) of I n t e g e r ;
type Stack Type i s
record
List : List Type ;
Topsub : I n t e g e r r a n g e 0 . . M a x S i z e := 0 ;
end r e c o r d ;
end S t a c k P a c k ;
16. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada - Exemplo
Trecho da implementa¸˜o (body):
ca
w i t h Ada . T e x t I O ; u s e Ada . T e x t I O ;
package body S t a c k P a c k i s
f u n c t i o n Empty ( S t k : i n S t a c k T y p e ) r e t u r n B o o l e a n i s
begin
r e t u r n S t k . Topsum = 0 ;
end Empty ;
p r o c e d u r e Push ( S t k : i n o ut S t a c k T y p e ; E l e m e n t : i n
Integer ) is
begin
i f S t k . Topsum >= M a x S i z e t h e n
P u t L i n e ( ”ERROR − S t a c k o v e r f l o w ” ) ;
else
S t k . Topsub := S t k . Topsub + 1 ;
S t k . L i s t ( Topsub ) := E l e m e n t ;
end i f ;
end Push ;
17. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada - Exemplo
Exemplo de uso:
w i t h S t a c k P a c k , Ada . T e x t I O ;
u s e S t a c k P a c k , Ada . T e x t I O ;
procedure Use Stacks i s
Topone : I n t e g e r ;
S t a c k : S t a c k T y p e ; −− C r i a um o b j e t o do t i p o
Stack Type
begin
Push ( S t a c k , 4 2 ) ;
Push ( S t a c k , 1 7 ) ;
Topone := Top ( S t a c k ) ;
Pop ( S t a c k ) ;
...
end U s e S t a c k s ;
18. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
C++
C++
Suporte ` programa¸˜o orientada a objetos.
a ca
Duas constru¸˜es para suporte a tipos abstratos de dados:
co
struct: define apenas dados
class: define dados (membros de dados) e opera¸˜es sobre
co
os dados (fun¸˜es-membro)
co
19. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
C++
C++ - Encapsulamento
Encapsulamento
Duas categorias de membros de dados e fun¸˜es-membro:
co
Membros da classe
Membros da instˆncia
a
Aloca¸˜o da instˆncia de uma classe
ca a
Est´tica
a
Dinˆmica na pilha
a
Dinˆmica na heap
a
Duas maneiras de definir uma fun¸˜o membro:
ca
Defini¸˜o completa na classe (chamada inlined)
ca
Somente o cabe¸alho
c
20. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
C++
C++ - Oculta¸˜o de Informa¸˜o
ca ca
Oculta¸˜o de informa¸˜o
ca ca
Cl´usulas (controle de acesso):
a
private
public
protected
Todos os membros de dados devem ser privados para garantir
a oculta¸˜o de informa¸˜o
ca ca
Apenas m´todos devem ser p´blicos. O conjunto dos m´todos
e u e
p´blicos constitui a interface da classe.
u
Construtores e destruidores
21. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Java
Java
Bastante similar ao C++
Principais diferen¸as:
c
Todos os TAD s˜o classes
a
Todos objetos alocados na heap
M´todos s´ podem ser definidos dentro da classe
e o
Sem m´todo destruidor (coletor de lixo)
e
22. Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ruby
Ruby
Classes similares a Java e C++
Classes dinˆmicas
a
Membros podem ser adicionados e removidos em tempo de
execu¸˜o
ca
Maior flexibilidade, por´m menor legibilidade
e
Tudo ´ objeto!
e
23. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
Tipos abstratos de dados parametrizados
E se precisarmos criar pilhas para diferentes tipos de dados? Qual
parece a solu¸˜o mais atraente?
ca
24. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
Tipos abstratos de dados parametrizados
E se precisarmos criar pilhas para diferentes tipos de dados? Qual
parece a solu¸˜o mais atraente?
ca
1 Senta e chora.
25. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
Tipos abstratos de dados parametrizados
E se precisarmos criar pilhas para diferentes tipos de dados? Qual
parece a solu¸˜o mais atraente?
ca
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:
IntegerStack, StringStack, FloatStack, etc.)
26. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
Tipos abstratos de dados parametrizados
E se precisarmos criar pilhas para diferentes tipos de dados? Qual
parece a solu¸˜o mais atraente?
ca
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:
IntegerStack, StringStack, FloatStack, etc.)
3 Criar uma unica implementa¸˜o de pilha que aceita qualquer
´ ca
tipo de dado.
27. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
Tipos abstratos de dados parametrizados
E se precisarmos criar pilhas para diferentes tipos de dados? Qual
parece a solu¸˜o mais atraente?
ca
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:
IntegerStack, StringStack, FloatStack, etc.)
3 Criar uma unica implementa¸˜o de pilha que aceita qualquer
´ ca
tipo de dado.
TAD parametrizados
Obviamente, a alternativa correta ´ a (3). TAD parametrizados ´
e e
uma quest˜o de projeto pr´pria de linguagens estaticamente
a o
tipadas.
28. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
TAD parametrizados - Exemplos
C++ e Ada
Ada
Adiciona-se: generic type T is private, antes da
declara¸˜o da package
ca
Para cada instˆncia (ex: Float, Integer), o compilador cria um
a
c´digo correspondente
o
C++
Adiciona-se: template <class T>, antes da declara¸˜o da
ca
class
Similarmente ao Ada, v´rias instˆncias do c´digo da classe s˜o
a a o a
criadas em tempo de compila¸˜o para cada tipo utilizado.
ca
29. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
TAD parametrizados - Exemplos
Java
Tipos gen´ricos mais comuns: cole¸˜es (LinkedList, ArrayList,
e co
etc.)
Antes do Java 5.0: cole¸˜es aceitavam qualquer tipo (classe
co
Object), e n˜o era poss´ definir o tipo dos elementos.
a ıvel
Problema: necessidade excessiva de casts (coer¸˜o).
ca
// ∗ C r i a r um A r r a y L i s t
A r r a y L i s t myArray = new A r r a y L i s t ( ) ;
// ∗ C r i a r um e l e m e n t o
myArray . add ( 0 , new I n t e g e r ( 4 7 ) ) ;
// ∗ P e g a r p r i m e i r o o b j e t o da l i s t a
I n t e g e r m y I n t = ( I n t e g e r ) myArray . g e t ( 0 ) ;
30. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
TAD parametrizados - Exemplos
Java
Java 5.0 e mais recentes:
A r r a y L i s t <I n t e g e r > myArray = new A r r a y L i s t <I n t e g e r >() ;
myArray . add ( 0 , new I n t e g e r ( 4 7 ) ) ;
I n t e g e r m y I n t = myArray . g e t ( 0 ) ; // ∗ <−−−− nao p r e c i s a
dar cast !
31. Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
TAD parametrizados - Exemplos
Java
Java 5.0 e mais recentes:
A r r a y L i s t <I n t e g e r > myArray = new A r r a y L i s t <I n t e g e r >() ;
myArray . add ( 0 , new I n t e g e r ( 4 7 ) ) ;
I n t e g e r m y I n t = myArray . g e t ( 0 ) ; // ∗ <−−−− nao p r e c i s a
dar cast !
Classes coringa (wildcard):
Exemplo: Collection<?> ´ o supertipo de todas de todos os
e
tipos de cole¸˜o em Java. Dessa forma:
ca
v o i d p r i n t C o l l e c t i o n ( C o l l e c t i o n <?> c ) {
f o r ( Object e : c ) {
System . o u t . p r i n t l n ( e ) ;
}
c . add ( new O b j e c t ( ) ) // ∗ <−−− E r r o ! POR QUE?
}
32. Tipos Abstratos de Dados (TAD) e Encapsulamento
Constru¸oes de encapsulamento
c˜
Constru¸oes de encapsulamento
c˜
Tipos abstratos de dados s˜o encapsulamentos m´
a ınimos, para
apenas um tipo;
Constru¸˜es de encapsulamento proveem encapsulamento para
co
m´ltiplos tipos;
u
33. Tipos Abstratos de Dados (TAD) e Encapsulamento
Constru¸oes de encapsulamento
c˜
Constru¸oes de encapsulamento
c˜
Tipos abstratos de dados s˜o encapsulamentos m´
a ınimos, para
apenas um tipo;
Constru¸˜es de encapsulamento proveem encapsulamento para
co
m´ltiplos tipos;
u
⇑ Tamanho do programa
34. Tipos Abstratos de Dados (TAD) e Encapsulamento
Constru¸oes de encapsulamento
c˜
Constru¸oes de encapsulamento
c˜
Tipos abstratos de dados s˜o encapsulamentos m´
a ınimos, para
apenas um tipo;
Constru¸˜es de encapsulamento proveem encapsulamento para
co
m´ltiplos tipos;
u
⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento
35. Tipos Abstratos de Dados (TAD) e Encapsulamento
Constru¸oes de encapsulamento
c˜
Constru¸oes de encapsulamento
c˜
Tipos abstratos de dados s˜o encapsulamentos m´
a ınimos, para
apenas um tipo;
Constru¸˜es de encapsulamento proveem encapsulamento para
co
m´ltiplos tipos;
u
⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento +
⇑ Tempo de recompila¸˜o;
ca
Solu¸˜o: organizar programas em cole¸˜es logicamente
ca co
relacionadas.
36. Tipos Abstratos de Dados (TAD) e Encapsulamento
Constru¸oes de encapsulamento
c˜
Exemplos de constru¸˜es de encapsulamento
co
C/C++
Headers (cabe¸alhos)
c
Mantˆm prot´tipos das fun¸˜es, tipos e classes
e o co
C´digo do cliente ´ compilado junto com a especifica¸˜o
o e ca
(header ), n˜o com a implementa¸˜o.
a ca
Permite que a implementa¸˜o seja compilada separadamente
ca
do c´digo cliente.
o
37. Tipos Abstratos de Dados (TAD) e Encapsulamento
Constru¸oes de encapsulamento
c˜
Exemplos de constru¸˜es de encapsulamento
co
C++
Fun¸˜es e classes amigas
co
Exemplo: multiplica¸˜o de vetor com matriz:
ca
c l a s s Matrix ; // ∗∗ D e c l a r a c a o da c l a s s e
c l a s s Vector {
f r i e n d V e c t o r m u l t i p l y ( c o n s t M a t r i x &, c o n s t V e c t o r
&) ;
...
};
c l a s s M a t r i x { // ∗∗ D e f i n i c a o da c l a s s e
f r i e n d V e c t o r m u l t i p l y ( c o n s t M a t r i x &, c o n s t V e c t o r
&) ;
...
};
// ∗∗ A f u n que u s a o s o b j e t o s V e c t o r e M a t r i x
V e c t o r m u l t i p l y ( c o n s t M a t r i x& ml , c o n s t V e c t o r& v l ) {
...
}
Classes tamb´m podem ser amigas de outras classes
e
38. Tipos Abstratos de Dados (TAD) e Encapsulamento
Constru¸oes de encapsulamento
c˜
Exemplos de constru¸˜es de encapsulamento
co
C++
TAREFA!
1 Classes amigas violam o princ´
ıpio do encapsulamento? Se sim,
o qu˜o grave ´ essa viola¸˜o?
a e ca
2 Qual a melhor maneira de implementar o exemplo acima em
uma linguagem sem classes e fun¸˜es amigas (como Java,
co
Python, etc.) sem quebrar o encapsulamento?
39. Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
Encapsulamento de nomes
Problema: V´rios desenvolvedores escrevendo um sistema grande.
a
Unidades l´gicas devem ser independentes, por´m capazes de
o e
trabalhar juntas
Como evitar que sejam criadas vari´veis, m´todos e classes com o
a e
mesmo nome acidentalmente?
O problema acentua-se com a utiliza¸˜o de v´rias bibliotecas.
ca a
Como garantir que n˜o haver´ nomes repetidos?
a a
40. Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
Namespaces do C++
Namespaces do C++
// ∗∗ s t a c k . h
namespace m y s t a c k {
// D e c l a r a es da p i l h a
}
// ∗∗ main . cpp v e r s i o n 1
...
mystack : : s t a c k s t k ;
s t k . pus h ( 2 ) ;
// ∗∗ main . cpp v e r s i o n 2
u s i n g mystack : : s t a c k ;
stack stk ;
// ∗∗ main . cpp v e r s i o n 3
u s i n g namespace m y s t a c k ;
stack stk ;
41. Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
Pacotes do Java
Pacotes do Java
Classes em um pacote s˜o parcialmente amigas
a
Defini¸˜o: package br.uem.din.example.stack;
ca
Uso sem importa¸˜o: new
ca
br.uem.din.example.stack.GenericStack();
Importando apenas GenericStack: import
br.uem.din.example.stack.GenericStack;
Importando todas classes do pacote: import
br.uem.din.example.stack.*;
42. Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
M´dulos do Ruby
o
M´dulos do Ruby
o
Cole¸˜o de m´todos e constantes;
ca e
#Modulo
module M y S t u f f
PI = 3.114159265
d e f M y S t u f f . mymethod1 ( p1 )
...
end
d e f M y S t u f f . mymethod2 ( p2 )
...
end
end
#Uso :
r e q u i r e ’ myStuffMod ’
...
M y S t u f f . mymethod1 ( x )
...