paradigmas de linguagens de programação - tipos abstratos de dados

24
Prof. Adriano Teixeira de Souza

Upload: adriano-teixeira-de-souza

Post on 28-Jun-2015

1.568 views

Category:

Technology


2 download

TRANSCRIPT

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

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

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