Tipos Abstratos de Dados e Encapsulamento

3,512 views
3,318 views

Published on

Baseado no capítulo 11 do livro: "Sebesta R. W. Concepts of Programming Languages. 8th Edition"

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,512
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
50
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Tipos Abstratos de Dados e Encapsulamento

  1. 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. 2. Tipos Abstratos de Dados (TAD) e EncapsulamentoT´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. 3. Tipos Abstratos de Dados (TAD) e Encapsulamento Conceito de abstra¸˜o caConceito de abstra¸˜o ca
  4. 4. Tipos Abstratos de Dados (TAD) e Encapsulamento Conceito de abstra¸˜o caConceito 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. 5. Tipos Abstratos de Dados (TAD) e Encapsulamento Conceito de abstra¸˜o caConceito 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. 6. Tipos Abstratos de Dados (TAD) e Encapsulamento Conceito de abstra¸˜o ca Tipos de abstra¸˜o caTipos 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. 7. Tipos Abstratos de Dados (TAD) e Encapsulamento Introdu¸˜o ` abstra¸˜o de dados ca a ca Tipos de dados definidos pelo usu´rio aTipos 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. 8. Tipos Abstratos de Dados (TAD) e Encapsulamento Introdu¸˜o ` abstra¸˜o de dados ca a ca Tipos de dados definidos pelo usu´rio aTipos de dados definidos pelo usu´rio a
  9. 9. Tipos Abstratos de Dados (TAD) e Encapsulamento Introdu¸˜o ` abstra¸˜o de dados ca a ca Tipos de dados definidos pelo usu´rio aTipos de dados definidos pelo usu´rio a
  10. 10. Tipos Abstratos de Dados (TAD) e Encapsulamento Introdu¸˜o ` abstra¸˜o de dados ca a ca TAD definidos pelo usu´rio - Exemplo aTipos 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. 11. Tipos Abstratos de Dados (TAD) e Encapsulamento Introdu¸˜o ` abstra¸˜o de dados ca a ca TAD definidos pelo usu´rio - Exemplo aTipos 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. 12. Tipos Abstratos de Dados (TAD) e Encapsulamento Introdu¸˜o ` abstra¸˜o de dados ca a ca TAD definidos pelo usu´rio - Exemplo aTipos 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. 13. Tipos Abstratos de Dados (TAD) e Encapsulamento Quest˜es de projeto oQuest˜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. 14. Tipos Abstratos de Dados (TAD) e Encapsulamento Exemplos de linguagens AdaAda Encapsulamento Constru¸˜es chamadas packages, divididas em duas partes, que co tamb´m s˜o packages: e a specification package body package
  15. 15. Tipos Abstratos de Dados (TAD) e Encapsulamento Exemplos de linguagens AdaAda - 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. 16. Tipos Abstratos de Dados (TAD) e Encapsulamento Exemplos de linguagens AdaAda - 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. 17. Tipos Abstratos de Dados (TAD) e Encapsulamento Exemplos de linguagens AdaAda - 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. 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. 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. 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. 21. Tipos Abstratos de Dados (TAD) e Encapsulamento Exemplos de linguagens JavaJava 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. 22. Tipos Abstratos de Dados (TAD) e Encapsulamento Exemplos de linguagens RubyRuby 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. 23. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizadosTipos abstratos de dados parametrizados E se precisarmos criar pilhas para diferentes tipos de dados? Qual parece a solu¸˜o mais atraente? ca
  24. 24. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizadosTipos 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. 25. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizadosTipos 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. 26. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizadosTipos 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. 27. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizadosTipos 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. 28. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizados TAD parametrizados - ExemplosC++ 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. 29. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizados TAD parametrizados - ExemplosJava 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. 30. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizados TAD parametrizados - ExemplosJava 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. 31. Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos abstratos de dados parametrizados TAD parametrizados - ExemplosJava 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. 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. 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. 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. 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. 36. Tipos Abstratos de Dados (TAD) e Encapsulamento Constru¸oes de encapsulamento c˜ Exemplos de constru¸˜es de encapsulamento coC/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. 37. Tipos Abstratos de Dados (TAD) e Encapsulamento Constru¸oes de encapsulamento c˜ Exemplos de constru¸˜es de encapsulamento coC++ 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. 38. Tipos Abstratos de Dados (TAD) e Encapsulamento Constru¸oes de encapsulamento c˜ Exemplos de constru¸˜es de encapsulamento coC++ 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. 39. Tipos Abstratos de Dados (TAD) e Encapsulamento Encapsulamento de nomesEncapsulamento 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. 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. 41. Tipos Abstratos de Dados (TAD) e Encapsulamento Encapsulamento de nomes Pacotes do JavaPacotes 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. 42. Tipos Abstratos de Dados (TAD) e Encapsulamento Encapsulamento de nomes M´dulos do Ruby oM´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 ) ...

×