paradigmas de linguagens de programação - tipos abstratos de dados
Post on 28-Jun-2015
1.568 Views
Preview:
TRANSCRIPT
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
Prof. Adriano Teixeira de Souza
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) }
Código de aplicação válido
Prof. Adriano Teixeira de Souza
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);
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
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
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 = …; }
2ª Implementação de Date
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; } }
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
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 compareTo (Date that); public String toString (); public void advance (int n); }
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 (); }
Construção de TADs a partir de outros existentes
◦ Exemplo: TAD Person
◦ Birthday é uma instância de Date
Prof. Adriano Teixeira de Souza
Prof. Adriano Teixeira de Souza
public class Person { // Cada valor de Person possui nome, endereço e data de nascimento private ...; 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) }
Importação de tipo externo
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
top related