tipos abstratos de dados e encapsulamento
DESCRIPTION
Baseado no capítulo 11 do livro: "Sebesta R. W. Concepts of Programming Languages. 8th Edition"TRANSCRIPT
Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos Abstratos de Dados (TAD) eEncapsulamento
Capıtulo 11 (Livro do Sebesta)
Helio Henrique L. C. Monte-AltoDisciplina: Paradigma de Programacao Imperativa e Orientada
a Objetos
2012
Tipos Abstratos de Dados (TAD) e Encapsulamento
Topicos
1 Conceito de abstracaoTipos de abstracao
2 Introducao a abstracao de dadosTipos de dados definidos pelo usuarioTAD definidos pelo usuario - Exemplo
3 Questoes de projeto4 Exemplos de linguagens
AdaC++JavaRuby
5 Tipos abstratos de dados parametrizadosTAD parametrizados - Exemplos
6 Construcoes de encapsulamentoExemplos de construcoes de encapsulamento
7 Encapsulamento de nomesNamespaces do C++Pacotes do JavaModulos do Ruby
Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstracao
Conceito de abstracao
Definicao
Abstracao e uma visao ou representacao de uma entidade queinclui apenas os atributos mais significantes.
Objetivo
A abstracao em linguagens de programacao (LP) e uma arma paralidar com a complexidade, tornando um programa grande e/oucomplicado mais facil de ser implementado e mantido
Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstracao
Conceito de abstracao
Definicao
Abstracao e uma visao ou representacao de uma entidade queinclui apenas os atributos mais significantes.
Objetivo
A abstracao em linguagens de programacao (LP) e uma arma paralidar com a complexidade, tornando um programa grande e/oucomplicado mais facil de ser implementado e mantido
Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstracao
Conceito de abstracao
Definicao
Abstracao e uma visao ou representacao de uma entidade queinclui apenas os atributos mais significantes.
Objetivo
A abstracao em linguagens de programacao (LP) e uma arma paralidar com a complexidade, tornando um programa grande e/oucomplicado mais facil de ser implementado e mantido
Tipos Abstratos de Dados (TAD) e Encapsulamento
Conceito de abstracao
Tipos de abstracao
Tipos de abstracao em LP
Abstracao de processos
Subprogramas (funcoes, procedimentos, metodos)
Esconde detalhes da implementacao
Permite reuso
Ex: sortInt(list)
Abstracao de dados
Tipos de dados abstratos (structs, classes)
Encapsulamento
Instancia: objeto
Ex: listas, fila, pilha, registros, arvores, ponto flutuante
Tipos Abstratos de Dados (TAD) e Encapsulamento
Introducao a abstracao de dados
Tipos de dados definidos pelo usuario
Tipos de dados definidos pelo usuario
Caracterısticas
TADs sao unidades sintaticas que definem um tipo tal que:
A interface (ou especificacao) do tipo nao depende da realrepresentacao dos dados ou da implementacao das operacoessobre o tipo;
A representacao real e oculta do programa que a utiliza.
Vantagens
Ocultacao de informacao
Maior confiabilidade
Baixo acoplamento com os clientes do tipo
Tipos Abstratos de Dados (TAD) e Encapsulamento
Introducao a abstracao de dados
Tipos de dados definidos pelo usuario
Tipos de dados definidos pelo usuario
Tipos Abstratos de Dados (TAD) e Encapsulamento
Introducao a abstracao de dados
Tipos de dados definidos pelo usuario
Tipos de dados definidos pelo usuario
Tipos Abstratos de Dados (TAD) e Encapsulamento
Introducao a abstracao de dados
TAD definidos pelo usuario - Exemplo
Tipos de dados definidos pelo usuario - Exemplo
Operacoes (interface) sobre uma estrutura de pilha:
create(stack)
destroy(stack)
empty(stack)
push(stack, element)
pop(stack)
top(stack)
Tipos Abstratos de Dados (TAD) e Encapsulamento
Introducao a abstracao de dados
TAD definidos pelo usuario - Exemplo
Tipos de dados definidos pelo usuario - Exemplo
Exemplo de codigo do cliente:...
create(stk1);
push(stk1, color1);
push(stk1, color2);
if(! empty(stk1))
temp = top(stk1);
...
Questao: Vamos supor que a implementacao original dessa pilhautilizasse lista estatica. O que devemos fazer se precisarmosmodificar a estrutura de dados para lista ligada? A mudancaafetara o codigo cliente?
R: NAO, pois a interface nao precisa ser modificada, apenas aimplementacao.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Introducao a abstracao de dados
TAD definidos pelo usuario - Exemplo
Tipos de dados definidos pelo usuario - Exemplo
Exemplo de codigo do cliente:...
create(stk1);
push(stk1, color1);
push(stk1, color2);
if(! empty(stk1))
temp = top(stk1);
...
Questao: Vamos supor que a implementacao original dessa pilhautilizasse lista estatica. O que devemos fazer se precisarmosmodificar a estrutura de dados para lista ligada? A mudancaafetara o codigo cliente?R: NAO, pois a interface nao precisa ser modificada, apenas aimplementacao.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Questoes de projeto
Questoes de projeto
Unidade sintatica para definicao dos tipos e subprogramas
Operacoes embutidas comuns
atribuicaocomparacoesiteradoresacessoresconstrutoresdestruidores
Tipos abstratos parametrizados
Controle de acesso
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada
Encapsulamento
Construcoes chamadas packages, divididas em duas partes, quetambem sao packages:
specification package
body package
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada - Exemplo
Especificacao para pilha:
package Stack Pack i s−− As en 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 atype Stack Type i s l i m i t e d p r i v a t e ;Max Size : c o n s t a n t := 1 0 0 ;f u n c t i o n Empty ( Stk : i n Stack Type ) r e t u r n Boolean ;procedure Push ( Stk : i n out Stack Type ; Element : i n
I n t e g e r ) ;procedure Pop ( Stk : i n out Stack Type ) ;f u n c t i o n Top ( Stk : i n Stack Type ) r e t u r n I n t e g e r ;−− A pa r t e o c u l t a dos c l i e n t e sp r i v a t e
type L i s t T y p e i s a r r a y ( 1 . . Max Size ) o f I n t e g e r ;type Stack Type i sr e c o r d
L i s t : L i s t T y p e ;Topsub : I n t e g e r range 0 . . Max Size := 0 ;
end r e c o r d ;end Stack Pack ;
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada - Exemplo
Trecho da implementacao (body):
with Ada . Text IO ; use Ada . Text IO ;package body Stack Pack i s
f u n c t i o n Empty ( Stk : i n Stack Type ) r e t u r n Boolean i sbeg inr e t u r n Stk . Topsum = 0 ;end Empty ;
procedure Push ( Stk : i n out Stack Type ; Element : i nI n t e g e r ) i sbeg ini f Stk . Topsum >= Max Size then
P u t L i n e ( ”ERROR − Stack o v e r f l o w ” ) ;e l s e
Stk . Topsub := Stk . Topsub + 1 ;Stk . L i s t ( Topsub ) := Element ;
end i f ;end Push ;
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ada
Ada - Exemplo
Exemplo de uso:
with Stack Pack , Ada . Text IO ;use Stack Pack , Ada . Text IO ;procedure U s e S t a c k s i s
Topone : I n t e g e r ;Stack : Stack Type ; −− Cr i a um ob j e t o do t i p o
Stack Typebeg inPush ( Stack , 42) ;Push ( Stack , 17) ;Topone := Top ( Stack ) ;Pop ( Stack ) ;. . .end U s e S t a c k s ;
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
C++
C++
Suporte a programacao orientada a objetos.
Duas construcoes para suporte a tipos abstratos de dados:
struct: define apenas dadosclass: define dados (membros de dados) e operacoes sobreos dados (funcoes-membro)
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
C++
C++ - Encapsulamento
Encapsulamento
Duas categorias de membros de dados e funcoes-membro:
Membros da classeMembros da instancia
Alocacao da instancia de uma classe
EstaticaDinamica na pilhaDinamica na heap
Duas maneiras de definir uma funcao membro:
Definicao completa na classe (chamada inlined)Somente o cabecalho
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
C++
C++ - Ocultacao de Informacao
Ocultacao de informacao
Clausulas (controle de acesso):
privatepublicprotected
Todos os membros de dados devem ser privados para garantira ocultacao de informacao
Apenas metodos devem ser publicos. O conjunto dos metodospublicos constitui a interface da classe.
Construtores e destruidores
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Java
Java
Bastante similar ao C++
Principais diferencas:
Todos os TAD sao classesTodos objetos alocados na heapMetodos so podem ser definidos dentro da classeSem metodo destruidor (coletor de lixo)
Tipos Abstratos de Dados (TAD) e Encapsulamento
Exemplos de linguagens
Ruby
Ruby
Classes similares a Java e C++
Classes dinamicas
Membros podem ser adicionados e removidos em tempo deexecucaoMaior flexibilidade, porem menor legibilidade
Tudo e objeto!
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? Qualparece a solucao mais atraente?
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)
3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.
TAD parametrizados
Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.
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? Qualparece a solucao mais atraente?
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)
3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.
TAD parametrizados
Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.
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? Qualparece a solucao mais atraente?
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)
3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.
TAD parametrizados
Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.
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? Qualparece a solucao mais atraente?
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)
3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.
TAD parametrizados
Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.
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? Qualparece a solucao mais atraente?
1 Senta e chora.
2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)
3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.
TAD parametrizados
Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.
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 dadeclaracao da package
Para cada instancia (ex: Float, Integer), o compilador cria umcodigo correspondente
C++
Adiciona-se: template <class T>, antes da declaracao daclass
Similarmente ao Ada, varias instancias do codigo da classe saocriadas em tempo de compilacao para cada tipo utilizado.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Tipos abstratos de dados parametrizados
TAD parametrizados - Exemplos
Java
Tipos genericos mais comuns: colecoes (LinkedList, ArrayList,etc.)
Antes do Java 5.0: colecoes aceitavam qualquer tipo (classeObject), e nao era possıvel definir o tipo dos elementos.
Problema: necessidade excessiva de casts (coercao).
//∗ C r i a r um A r r a y L i s tA 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 lementomyArray . add ( 0 , new I n t e g e r ( 4 7 ) ) ;//∗ Pegar p r im e i r o ob j e t o da l i s t aI n t e g e r myInt = ( I n t e g e r ) myArray . g e t ( 0 ) ;
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 myInt = myArray . g e t ( 0 ) ; //∗ <−−−− nao p r e c i s a
dar c a s t !
Classes coringa (wildcard):
Exemplo: Collection<?> e o supertipo de todas de todos ostipos de colecao em Java. Dessa forma:
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 . out . p r i n t l n ( e ) ;}
c . add ( new Object ( ) ) //∗ <−−− Er ro ! POR QUE?}
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 myInt = myArray . g e t ( 0 ) ; //∗ <−−−− nao p r e c i s a
dar c a s t !
Classes coringa (wildcard):
Exemplo: Collection<?> e o supertipo de todas de todos ostipos de colecao em Java. Dessa forma:
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 . out . p r i n t l n ( e ) ;}
c . add ( new Object ( ) ) //∗ <−−− Er ro ! POR QUE?}
Tipos Abstratos de Dados (TAD) e Encapsulamento
Construcoes de encapsulamento
Construcoes de encapsulamento
Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;
Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;
⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento +⇑ Tempo de recompilacao;
Solucao: organizar programas em colecoes logicamenterelacionadas.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Construcoes de encapsulamento
Construcoes de encapsulamento
Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;
Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;
⇑ Tamanho do programa
=⇒ ⇑ Dificuldade de gerenciamento +⇑ Tempo de recompilacao;
Solucao: organizar programas em colecoes logicamenterelacionadas.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Construcoes de encapsulamento
Construcoes de encapsulamento
Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;
Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;
⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento
+⇑ Tempo de recompilacao;
Solucao: organizar programas em colecoes logicamenterelacionadas.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Construcoes de encapsulamento
Construcoes de encapsulamento
Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;
Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;
⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento +⇑ Tempo de recompilacao;
Solucao: organizar programas em colecoes logicamenterelacionadas.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Construcoes de encapsulamento
Exemplos de construcoes de encapsulamento
C/C++
Headers (cabecalhos)
Mantem prototipos das funcoes, tipos e classes
Codigo do cliente e compilado junto com a especificacao(header), nao com a implementacao.
Permite que a implementacao seja compilada separadamentedo codigo cliente.
Tipos Abstratos de Dados (TAD) e Encapsulamento
Construcoes de encapsulamento
Exemplos de construcoes de encapsulamento
C++
Funcoes e classes amigas
Exemplo: multiplicacao de vetor com matriz:
c l a s s M a t r i x ; //∗∗ Dec l a r acao da c l a s s ec l a s s V e c t o r {
f r i e n d V e c t o r m u l t i p l y ( const M a t r i x &, const V e c t o r&) ;
. . .} ;c l a s s M a t r i x { //∗∗ De 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 ( const M a t r i x &, const V e c t o r&) ;
. . .} ;//∗∗ A f u n que usa os o b j e t o s Vecto r e Matr i xV e c t o r m u l t i p l y ( const M a t r i x& ml , const V e c t o r& v l ) {
. . .}
Classes tambem podem ser amigas de outras classes
Tipos Abstratos de Dados (TAD) e Encapsulamento
Construcoes de encapsulamento
Exemplos de construcoes de encapsulamento
C++
TAREFA!
1 Classes amigas violam o princıpio do encapsulamento? Se sim,o quao grave e essa violacao?
2 Qual a melhor maneira de implementar o exemplo acima emuma linguagem sem classes e funcoes amigas (como Java,Python, etc.) sem quebrar o encapsulamento?
Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
Encapsulamento de nomes
Problema: Varios desenvolvedores escrevendo um sistema grande.
Unidades logicas devem ser independentes, porem capazes detrabalhar juntas
Como evitar que sejam criadas variaveis, metodos e classes com omesmo nome acidentalmente?
O problema acentua-se com a utilizacao de varias bibliotecas.Como garantir que nao havera nomes repetidos?
Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
Namespaces do C++
Namespaces do C++
//∗∗ s t a c k . hnamespace mystack {
// 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 . push ( 2 ) ;
//∗∗ main . cpp v e r s i o n 2u s i n g mystack : : s t a c k ;s t a c k s t k ;
//∗∗ main . cpp v e r s i o n 3u s i n g namespace mystack ;s t a c k s t k ;
Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
Pacotes do Java
Pacotes do Java
Classes em um pacote sao parcialmente amigas
Definicao: package br.uem.din.example.stack;
Uso sem importacao: new
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.*;
Tipos Abstratos de Dados (TAD) e Encapsulamento
Encapsulamento de nomes
Modulos do Ruby
Modulos do Ruby
Colecao de metodos e constantes;
#Modulomodule MyStuff
PI = 3.114159265def MyStuff . mymethod1 ( p1 ). . .enddef MyStuff . mymethod2 ( p2 ). . .end
end
#Uso :r e q u i r e ’ myStuffMod ’. . .MyStuff . mymethod1 ( x ). . .