PROGRAMAÇÃO - INTRODUÇÃO George 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. Módulo de estoque Módulo de faturamento Módulo de clientes Sistema de vendas 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 Macacos Roedores Humanos 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 coeficiente float 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.