PROGRAMAÇÃO - INTRODUÇÃOGeorge Gomes Cabral
DECOMPOSIÇÃO Dividir para conquistar: Paradigma básico
para tratamento de grandes problemas. Nossa meta na decomposição de um programa é
a criação de módulos que são programas menores que interagem entre si de maneira simples e bem definida.
Durante a decomposição, o problema original é quebrado de forma que: Cada subproblema está no mesmo nível de
detalhe (dificuldade); Cada subproblema pode ser resolvido
independentemente; e As soluções dos subproblemas podem ser
combinadas de forma a resolver o problema original.
DECOMPOSIÇÃO
Exemplo: Mergesort.
DECOMPOSIÇÃO
Exemplo: Sistema de Vendas.
Sistema de vendas
Módulo de estoque
Módulo de faturamento
Módulo de clientes
Módulo de canais de venda
DECOMPOSIÇÃO
Porém..... Se o problema é grande e mal entendido, a
decomposição pode gerar subproblemas que não resolvem o todo. Nem sempre é simples decompor um problema.
ABSTRAÇÃO
Maneira de realizar a decomposição de forma produtiva, alterando o nível de detalhamento a ser considerado.
Nos permite esquecer informações e dessa forma tratar coisas diferentes como se fossem a mesma. Isso é feito no intuito de simplificar nossa
análise, separando atributos relevantes de irrelevantes. Mamíferos
Primatas
HumanosMacacos
Roedores
ABSTRAÇÃO
//nivel baixo de abstração
found = false
for(int i = 0; i < a.length; i++){
if(a[i] == e){
z = i;
found = true;
}
}
//nível alto de abstração
found = a.isIn(e);
if(found)
z = a.indexOf(e);
ABSTRAÇÃO
O quê é preferível ? Uma linguagem com um alto grau de abstração ou uma linguagem que forneça a seu usuário mecanismos para criar suas próprias abstrações ?
Mecanismos disponíveis de abstração: Abstração por parametrização. Abstração por especificação.
ABSTRAÇÃO POR PARAMETRIZAÇÃO Importante forma de conseguir generalização
em programas.
Abstrai a identidade dos dados os substituindo por parâmetros. Nos permite representar um conjunto
potencialmente infinito de diferentes computações com um único programa que é uma abstração de todas as computações.
Exemplo: x * x + y * y
Programadores freqüentemente utilizam abstração por parametrização sem notar que o estão utilizando.
ABSTRAÇÃO POR ESPECIFICAÇÃO Nos permite abstrair a computação (ou computações)
realizadas no corpo do procedimento. Fazemos isso associando a cada procedimento uma
especificação de seu efeito desejado e dessa forma considerando o significado da chamada ao procedimento ao invés do que está contido no corpo do procedimento.
float sqrt(float coef){//requer: coef > 0//efeito: retorna uma aproximação da raiz
//quadrada do coeficientefloat ans = coef/2.0;int i = 1;while(i < 7){ ans = ans – ((ans * ans – coef)/(2.0*ans)); i++;}return ans;
}
ABSTRAÇÃO DE DADOS Mecanismo mais importante de abstração
Nos permite estender a linguagem de programação em uso com novos tipos de dados.
Os novos tipos de dados devem incorporar abstração por especificação e parametrização (A criação de um novo tipo inclui a criação de operações para o mesmo).
Em JAVA Novos tipos são definidos por classes ou interfaces.
ABSTRAÇÃO DE DADOS Forma da especificação de abstração de
dados.
visibilidade class dname {//OVERVIEW: rápida descrição do //comportamento dos objetos desse tipo.
//construtores//especificação dos construtores
//métodos//especificações dos métodos
}
ABSTRAÇÃO DE DADOS
Exemplo
public class IntSet {
//OVERVIEW: IntSets são modificáveis, //ilimitados conjuntos de inteiros.
// Um típico IntSet é {x1, ... , xn}
//construtores
public IntSet(){}
public void insere(int x)
//MODIFICA: esse objeto
//EFEITO: adiciona x aos elementos desse objeto.
..
..
}
UTILIZANDO ABSTRAÇÕES DE DADOS
Public static IntSet getElements (int[] a) throws NullPointerException{
//EFEITO: Se a é nulo levanta uma exceção do tipo //NullPointerException, senão, retorna um conjunto contendo os //elementos de a.
IntSet s = new IntSet();
for(int i = 0; i < a.length; i++) s.insert(a[i]);
return s;
}
ABSTRAÇÃO DE DADOS
Exercício:
Implementar uma abstração de um triângulo que verifique se ele é isósceles, escaleno, eqüilátero e retângulo. No construtor deve se checar se a entrada do usuário consiste em um triângulo válido.
Implementar um tipo de dados Fila.
ABSTRAÇÃO DE DADOS
Métodos Adicionais. Cada tipo abstrato deve ter implementações únicas desses métodos.
Equals : verifica se dois objetos de um determinado tipo são iguais.
Clone : deve retornar um objeto que tem o mesmo estado do objeto clonado.
toString : retorna uma string mostrando o tipo e o estado atual do objeto.