Prof. Adriano Teixeira de Souza
   Um Tipo Abstrato de Dados é caracterizado
    por

    ◦ Um conjunto de valores
    ◦ Um conjunto de operações

   Não é caracterizado pela sua representação
    interna de dados




                          Prof. Adriano Teixeira de Souza
   Os dados internos de um TAD são privativos

    ◦ Código da aplicação não consegue manipular
    ◦ Manipulável apenas pelas operações definidas em
      um TAD

   A representação de dados é intercambiável,
    sem afetar o código da aplicação

    ◦ Apenas as operações precisam ser recodificadas




                           Prof. Adriano Teixeira de Souza
   Um TAD deve possuir um contrato que

    ◦ Especifique o seu conjunto de atributos
    ◦ Especifique a assinatura de suas operações (i.e.,
      nome da operação, tipos de parâmetros, tipos de
      resultados e comportamento observável)


   O contrato não especifica a representação
    dos dados nem os algoritmos necessários
    para as operações



                            Prof. Adriano Teixeira de Souza
   O comportamento observável de uma
    operação é o seu efeito da forma que é
    ‘observado’ pelo código da aplicação

    ◦ Exemplo de um comportamento observável: busca
      em um array

    ◦ Exemplos de algoritmos com um comportamento:
      busca linear, busca binária




                          Prof. Adriano Teixeira de Souza
   A implementação de um TAD deve seguir
    rigorosamente aquilo que foi especificado no seu
    contrato

   A implementação de um programa deve utilizar
    um TAD apenas na forma como suas operações
    são definidas no contrato

   Separação de Interesses (Separation of Concerns)
    ◦ A implementação de um TAD não se preocupa com os
      programas que irão utilizá-lo
    ◦ A implementação de um programa não se preocupa em
      como um TAD foi implementado
    ◦ Propriedade fundamental para o projeto, implementação
      e manutenção de grandes sistemas


                             Prof. Adriano Teixeira de Souza
   Requisitos:
    ◦ Os valores armazenados podem ser datas do
      passado, do presente ou do futuro
    ◦ Deve ser possível:
       construir uma data a partir de um ano a, mês m, e dia-
        no-mês d.
      comparar datas
      fornecer uma data no formato “a-m-d”
      avançar uma data por n dias




                              Prof. Adriano Teixeira de Souza
   Possível contrato, expresso na forma de um
        esquema de declaração de classe
public class Date {
            // Cada valor de Date é uma data atual, do passado ou do futuro
 private ...;
 public Date (int a, int m, int d);
            // Constrói uma data com ano a, mês m, dia do mês d

    public int compareTo (Date that);
              // retorna -1 se é anterior a este,
              // ou 0 se a data é igual a este,
              // ou +1 se data é posterior a este

    public String toString ();
              // retorna a data no formato “a-m-d”

    public void advance (int n);
             // Avança a data de n dias (onde n >= 0)
}



                                                Prof. Adriano Teixeira de Souza
   Código de aplicação válido

Date hoje = …;
Date pascoa = new Date(2001, 4, 15);
hoje.advance(16);
if (hoje.compareTo(pascoa) < 0)
System.out.println(hoje.toString());


       Código de aplicação inválido

hoje.d += 16;
System.out.println(hoje.a + '-' + hoje.m + '-' + hoje.d);



                              Prof. Adriano Teixeira de Souza
   Uma implementação de um TAD inclui:
    ◦ A escolha de uma representação de dados
    ◦ A escolha de um algoritmo para cada operação

   A representação dos dados deve ser privativa
    (private)

   A representação de dados deve cobrir todos
    os valores possíveis

   Os algoritmos devem ser consistentes com a
    representação de dados

                           Prof. Adriano Teixeira de Souza
public class Date {
  // Cada instância de Date corresponde a uma data presente, do
  // passado ou do futuro.
  // A data é representada pelo número do ano a, pelo mês m, e
  // um dia-no-mês d
  private int a, m, d;
  public Date (int a, int m, int d) {
  // Construtor
  this.a = a; this.m = m; this.d = d;
  ...




                              Prof. Adriano Teixeira de Souza
public int compareTo (Date that) {

    return (this.y < that.y ? -1 :
    this.y > that.y ? +1 :
    this.m < that.m ? -1 :
    this.m > that.m ? +1 :
    this.d < that.d ? -1 :
    this.d > that.d ? +1 : 0);

}




                                     Prof. Adriano Teixeira de Souza
public String toString () {
         // retorna a data no formato “a-m-d”
         return (this.a + '-' + this.m + '-‘ + this.d);
    }
    public void advance (int n) {
         // Avança a data de n dias (onde n >= 0)
         // omitido
    }
}




                                   Prof. Adriano Teixeira de Souza
   2ª Implementação de Date


public class Date {
  // Esta data é representada por um número inteiro (data em
época)
  // (onde 0 representa 1º de janeiro de 2000):
  private int d;
  public Date (int a, int m, int d) {
  …;
  this.d = …;
}




                              Prof. Adriano Teixeira de Souza
public int compareTo (Date that) {
      return (this.d < that.d ? -1 :
      this.d > that.d ? +1 : 0);
    }
    public String toString () {
      int a, m, d;
      …;
      return (a + '-' + m + '-' + d);
    }
    public void advance (int n) {
      this.d += n;
    }
}




                                  Prof. Adriano Teixeira de Souza
   As operações são suficientes se conseguem
    atender todos os requisitos de um TAD

    ◦ Pode uma aplicação ser escrita inteiramente em
      termos das chamadas a estas operações?

   Uma operação é necessária se é essencial para
    atender os requisitos do TAD

    ◦ Pode ser omitida?

   Um TAD bem projetado provê operações que são
    necessárias e suficientes para os seus requisitos


                             Prof. Adriano Teixeira de Souza
public class Date {
  private …;
  public Date (int a, int m, int d);
  public int compareTo (Date that);
  public String toString ();
  public void advance (int n);
}


   São necessárias e suficientes?




                                Prof. Adriano Teixeira de Souza
public class Date {
  private …;
  public Date (int a, int m, int d);
  public int getYear ();
  public int getMonth ();
  public int getDay ();
}




                                  Prof. Adriano Teixeira de Souza
public class Date {
  private …;
  public Date (int a, int m, int d);
  public int compareTo (Date that);
  public String toString ();
  public void advance (int n);
  public void advance1Day ();
}




                                Prof. Adriano Teixeira de Souza
   Construção de TADs a partir de outros
    existentes

    ◦ Exemplo: TAD Person
    ◦ Birthday é uma instância de Date




                            Prof. Adriano Teixeira de Souza
public class Person {
  // Cada valor de Person possui nome, endereço e data de
nascimento
  private ...;                            Importação de tipo externo
  private Date birthday;
  public Date (int a, int m, int d);
        // Constrói uma data com ano a, mês m, dia do mês d
  public int compareTo (Date that);
        // retorna -1 se é anterior a este,
        // ou 0 se a data é igual a este,
        // ou +1 se data é posterior a este
  public String toString ();
        // retorna a data no formato “a-m-d”
  public void advance (int n);
        // Avança a data de n dias (onde n >= 0)
}


                                  Prof. Adriano Teixeira de Souza
   Interface java.util.List permite listas.

   Interface java.util.Set permite conjuntos.

   Interface java.util.Map permite mapeamentos

   Pacotes java.awt, java.io, java.util, etc., permitem
    vários TADs




                              Prof. Adriano Teixeira de Souza
   Em Java, o conceito
    de Interface é a
    maneira natural de
    se especificar um
    TAD

   Interface: conteúdo
    vazio – apenas uma
    interface pública
    para um tipo



                          Prof. Adriano Teixeira de Souza
   Distinção entre tipos de dados e tipos
    abstratos de dados
    ◦ TADs não possuem representação, apenas valores e
      operações

   TADs
    ◦ Contrato/especificação
    ◦ Implementação

   Critérios para projetar um TAD

   Exemplos de TADs disponíveis em Java

                               Prof. Adriano Teixeira de Souza

Paradigmas de Linguagens de Programação - Tipos Abstratos de Dados

  • 1.
  • 2.
    Um Tipo Abstrato de Dados é caracterizado por ◦ Um conjunto de valores ◦ Um conjunto de operações  Não é caracterizado pela sua representação interna de dados Prof. Adriano Teixeira de Souza
  • 3.
    Os dados internos de um TAD são privativos ◦ Código da aplicação não consegue manipular ◦ Manipulável apenas pelas operações definidas em um TAD  A representação de dados é intercambiável, sem afetar o código da aplicação ◦ Apenas as operações precisam ser recodificadas Prof. Adriano Teixeira de Souza
  • 4.
    Um TAD deve possuir um contrato que ◦ Especifique o seu conjunto de atributos ◦ Especifique a assinatura de suas operações (i.e., nome da operação, tipos de parâmetros, tipos de resultados e comportamento observável)  O contrato não especifica a representação dos dados nem os algoritmos necessários para as operações Prof. Adriano Teixeira de Souza
  • 5.
    O comportamento observável de uma operação é o seu efeito da forma que é ‘observado’ pelo código da aplicação ◦ Exemplo de um comportamento observável: busca em um array ◦ Exemplos de algoritmos com um comportamento: busca linear, busca binária Prof. Adriano Teixeira de Souza
  • 6.
    A implementação de um TAD deve seguir rigorosamente aquilo que foi especificado no seu contrato  A implementação de um programa deve utilizar um TAD apenas na forma como suas operações são definidas no contrato  Separação de Interesses (Separation of Concerns) ◦ A implementação de um TAD não se preocupa com os programas que irão utilizá-lo ◦ A implementação de um programa não se preocupa em como um TAD foi implementado ◦ Propriedade fundamental para o projeto, implementação e manutenção de grandes sistemas Prof. Adriano Teixeira de Souza
  • 7.
    Requisitos: ◦ Os valores armazenados podem ser datas do passado, do presente ou do futuro ◦ Deve ser possível:  construir uma data a partir de um ano a, mês m, e dia- no-mês d.  comparar datas  fornecer uma data no formato “a-m-d”  avançar uma data por n dias Prof. Adriano Teixeira de Souza
  • 8.
    Possível contrato, expresso na forma de um esquema de declaração de classe public class Date { // Cada valor de Date é uma data atual, do passado ou do futuro private ...; public Date (int a, int m, int d); // Constrói uma data com ano a, mês m, dia do mês d public int compareTo (Date that); // retorna -1 se é anterior a este, // ou 0 se a data é igual a este, // ou +1 se data é posterior a este public String toString (); // retorna a data no formato “a-m-d” public void advance (int n); // Avança a data de n dias (onde n >= 0) } Prof. Adriano Teixeira de Souza
  • 9.
    Código de aplicação válido Date hoje = …; Date pascoa = new Date(2001, 4, 15); hoje.advance(16); if (hoje.compareTo(pascoa) < 0) System.out.println(hoje.toString());  Código de aplicação inválido hoje.d += 16; System.out.println(hoje.a + '-' + hoje.m + '-' + hoje.d); Prof. Adriano Teixeira de Souza
  • 10.
    Uma implementação de um TAD inclui: ◦ A escolha de uma representação de dados ◦ A escolha de um algoritmo para cada operação  A representação dos dados deve ser privativa (private)  A representação de dados deve cobrir todos os valores possíveis  Os algoritmos devem ser consistentes com a representação de dados Prof. Adriano Teixeira de Souza
  • 11.
    public class Date{ // Cada instância de Date corresponde a uma data presente, do // passado ou do futuro. // A data é representada pelo número do ano a, pelo mês m, e // um dia-no-mês d private int a, m, d; public Date (int a, int m, int d) { // Construtor this.a = a; this.m = m; this.d = d; ... Prof. Adriano Teixeira de Souza
  • 12.
    public int compareTo(Date that) { return (this.y < that.y ? -1 : this.y > that.y ? +1 : this.m < that.m ? -1 : this.m > that.m ? +1 : this.d < that.d ? -1 : this.d > that.d ? +1 : 0); } Prof. Adriano Teixeira de Souza
  • 13.
    public String toString() { // retorna a data no formato “a-m-d” return (this.a + '-' + this.m + '-‘ + this.d); } public void advance (int n) { // Avança a data de n dias (onde n >= 0) // omitido } } Prof. Adriano Teixeira de Souza
  • 14.
    2ª Implementação de Date public class Date { // Esta data é representada por um número inteiro (data em época) // (onde 0 representa 1º de janeiro de 2000): private int d; public Date (int a, int m, int d) { …; this.d = …; } Prof. Adriano Teixeira de Souza
  • 15.
    public int compareTo(Date that) { return (this.d < that.d ? -1 : this.d > that.d ? +1 : 0); } public String toString () { int a, m, d; …; return (a + '-' + m + '-' + d); } public void advance (int n) { this.d += n; } } Prof. Adriano Teixeira de Souza
  • 16.
    As operações são suficientes se conseguem atender todos os requisitos de um TAD ◦ Pode uma aplicação ser escrita inteiramente em termos das chamadas a estas operações?  Uma operação é necessária se é essencial para atender os requisitos do TAD ◦ Pode ser omitida?  Um TAD bem projetado provê operações que são necessárias e suficientes para os seus requisitos Prof. Adriano Teixeira de Souza
  • 17.
    public class Date{ private …; public Date (int a, int m, int d); public int compareTo (Date that); public String toString (); public void advance (int n); }  São necessárias e suficientes? Prof. Adriano Teixeira de Souza
  • 18.
    public class Date{ private …; public Date (int a, int m, int d); public int getYear (); public int getMonth (); public int getDay (); } Prof. Adriano Teixeira de Souza
  • 19.
    public class Date{ private …; public Date (int a, int m, int d); public int compareTo (Date that); public String toString (); public void advance (int n); public void advance1Day (); } Prof. Adriano Teixeira de Souza
  • 20.
    Construção de TADs a partir de outros existentes ◦ Exemplo: TAD Person ◦ Birthday é uma instância de Date Prof. Adriano Teixeira de Souza
  • 21.
    public class Person{ // Cada valor de Person possui nome, endereço e data de nascimento private ...; Importação de tipo externo private Date birthday; public Date (int a, int m, int d); // Constrói uma data com ano a, mês m, dia do mês d public int compareTo (Date that); // retorna -1 se é anterior a este, // ou 0 se a data é igual a este, // ou +1 se data é posterior a este public String toString (); // retorna a data no formato “a-m-d” public void advance (int n); // Avança a data de n dias (onde n >= 0) } Prof. Adriano Teixeira de Souza
  • 22.
    Interface java.util.List permite listas.  Interface java.util.Set permite conjuntos.  Interface java.util.Map permite mapeamentos  Pacotes java.awt, java.io, java.util, etc., permitem vários TADs Prof. Adriano Teixeira de Souza
  • 23.
    Em Java, o conceito de Interface é a maneira natural de se especificar um TAD  Interface: conteúdo vazio – apenas uma interface pública para um tipo Prof. Adriano Teixeira de Souza
  • 24.
    Distinção entre tipos de dados e tipos abstratos de dados ◦ TADs não possuem representação, apenas valores e operações  TADs ◦ Contrato/especificação ◦ Implementação  Critérios para projetar um TAD  Exemplos de TADs disponíveis em Java Prof. Adriano Teixeira de Souza