Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Tipos Abstratos de Dados e Encapsulamento

5,012 views

Published on

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

  • Be the first to comment

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 ) ...

×