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
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
Tipos Abstratos de Dados (TAD) e Encapsulamento
  Conceito de abstra¸˜o
                    ca




Conceito de abstra¸˜o
                  ca
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.
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
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
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
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
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
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)
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
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
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
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
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 ;
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 ;
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 ;
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
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
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
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
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
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
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.
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.)
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.
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.
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
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 ) ;
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 !
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?
              }
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
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
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
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.
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
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
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?
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
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 ;
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.*;
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 )
      ...

Tipos Abstratos de Dados e Encapsulamento

  • 1.
    Tipos Abstratos deDados (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 deDados (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 deDados (TAD) e Encapsulamento Conceito de abstra¸˜o ca Conceito de abstra¸˜o ca
  • 4.
    Tipos Abstratos deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 deDados (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 ) ...