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