500 likes | 732 Views
Paradigmas de Programação. - Estilos de programação - Programação Estruturada - Programação Funcional - Programação em Lógica - Programação Orientada a Objetos. Profa. Maria Aparecida Fernandes Almeida, M. Comp. Estágio de docência:
E N D
Paradigmas de Programação - Estilos de programação - Programação Estruturada - Programação Funcional - Programação em Lógica - Programação Orientada a Objetos Profa. Maria Aparecida Fernandes Almeida, M. Comp. Estágio de docência: INE 5214 - Introdução à Computação e Informática Agrícola Centro de Ciências Agrárias - CCA - UFSC Prof. Orientador: Jorge Muniz Barreto, Dr. Departamento de Informática e de Estatística - INE Universidade Federal de Santa Catarina - UFSC
Mais informações sobre Paradigmas de Programação em: Atenção! • Jorge Muniz Barreto Inteligência Artificial no Limiar do Século XXI,2a. Edição, Florianópolis, 1999 • Apêndice A, página 272 a 298
Paradigma? • “Conjunto de regras que estabelecem fronteiras e descrevem como resolver problemas dentro destas fronteiras. Os paradigmas influenciam nossa percepção: ajudam-nos a organizar e a coordenar a maneira como olhamos o mundo...” . (Morris e Brandon - Reengenharia -Reestruturando a empresa) • Paradigmas de programação referem-se ao estilo de programação, portanto tem fortes vínculos com a linguagem de programação utilizada.
Estilo Declarativo x Estilo Imperativo • Uma linguagem particular através de suas estruturas de controle conduzem a um estilo específico de escrever programas (não confundir estilo com linguagem) • Estilo declarativo: é feita a descrição do problema. Cada sentença tem significado por si mesma e adiciona algumas informações diretamente associadas ao resultado final. Elas podem ser apresentadas em qualquer ordem. • Exemplo: pedir amigo o favor de encadernar fotocópias: • “Escute, você tem uma coleção de papéis para encadernar. As capas estão na mesa da secretária. Você pode pegar uma. As máquinas para encadernar cópias estão na sala número 2 e as explicações estão pregadas na parede.” • Você descreve o resultado e dá a informação necessária para resolver o problema. Descreveu o problema, como soluciona-lo é decidido pelo programador.
Estilo Imperativo • Estilo imperativo: descreve-se todas as operações a serem realizadas para solucionar o problema. O resultado final é uma conseqüência da realização destas operações. Cada sentença é uma forma imperativa e devem ser executadas em ordem e somente todas as sentenças juntas fazem sentido. • Exemplo: pedir ao amigo para encadernar fotocópias • “será que você pode encadernar esta coleção de papéis? Para fazer isso, vá até a mesa da secretária. Pegue uma capa. Vá a sala número 2. Leia e siga as instruções na parede. Volte com a capas encadernadas. Obrigada”. • A escolha da linguagem tem forte influência no estilo imperativo ou declarativo de programação. Porém, em um programa real encontramos ambos estilos em diferentes partes do programa.
Exemplos • Fortran, Pascal, C - estilo imperativo, com associações, estruturas de controle, etc. Contudo na declaração de variáveis, definição de tipos e estruturas tem-se parte de programação declarativa. • Prolog, Lisp - estilo declarativo, mas a execução em Prolog depende da ordem das instruções e definição de funções em Lisp é feita de modo imperativo.
“Relembrar é viver....” Organização do computador (1/3) • Unidade central de processamento • controla a operação do computador • desenvolve todas operações aritméticas e lógicas • armazena e recupera instruções e dados • Unidade de controle • Busca as instruções na memória • decodifica-as e executa as operações • Unidade lógica e aritmética da CPU • desenvolve as operações que são aritméticas ou lógicas • contém os registradores
“Relembrar é viver....” Organização do computador (2/3) • Memórias • as instruções e dados são armazenados na memória • principal, primária, acesso aleatório (RAM) • RAM é volátil, a informação será perdida com a queda de energia • os registradores, de alta velocidade que localizam-se dentro da CPU também são voláteis • As memórias de somente leitura ROM (Read Only Memory) • não voláteis, contém informações de inicialização que não se perdem e nem podem ser trocadas. Pergunta: E as EPROM’s, EEPRO’s?
“Relembrar é viver....” Organização do computador (3/3) • memórias de armazenamento (secundárias) • disco rígido, disquetes, “zips drive” e CD • dados estão na forma magnética ou ótica • os dispositivos periféricos oferecem armazenamento de "longa duração" • o acesso aos dados é mais lento do que na memória principal • outros dispositivos periféricos • dispositivos de entrada/saída • impressoras, monitores, terminais, alto-falantes • teclado, scanner,câmera digital , etc..
Organização da memória (1/2) • Organização da memória • esquema binário: dois dígitos, bits, 0 e 1 • representam dois estados elétricos diferentes da máquina: “on” (ligado) e “off” (desligado) • um grupo de 8 bits é um byte • a memória é referida em blocos • 210 bytes - 1024 bytes = 1 K • Megabyte = 210 x 210 = 1.048.576 bytes • bytes são agrupados em palavras (do mesmo tamanho que os registradores da CPU - comum: 16, 32 e 64 bits) • cada localização da memória é referida por seu endereço
Organização da memória (2/2) • Execução • a máquina entende instruções • as instruções são construídas de • código de operação numérica (opcode) • endereço de um operando • código de operação numérica (opcode) é a representação numérica de uma operação que a CPU pode desenvolver (carregar, multiplicar, adicionar, armazenar) • o endereço e o opcode devem ser representado na forma binária
Linguagem de Máquina (0 e 1’s !!!) • Por exemplo, imagine a execução das seguintes tarefas: • buscar o conteúdo da memória na localização 1024 e carregar no registrador • buscar o conteúdo da memória na localização 1025 e computar o produto deste valor e o valor do registrador • armazenar o conteúdo do registrador na localização 1027. • Supondo que os opcodes são : 16 (para carregar), 17 (para armazenar), 35 (para adicionar) e 36 (para multiplicar) as instruções em linguagem de máquina seriam:
Em Assembly - fica um pouco mais fácil... • O mesmo na linguagem Assembly ficaria: MOV A, ACC (mova o valor A (1024) para registrador ACC) MUL B, ACC (multiplique o valor B (1025) pelo conteúdo de ACC) ADD C, ACC (adicione o valor obtido na multiplicação (C) pelo conteúdo de ACC) STO ACC, X (armazene o valor de ACC em X (1027)) • A linguagem Assembly usa: • mnemônicos para as instruções e nomes de variáveis colocadas no endereço numérico • Assembler: um sistema de software que traduz as instruções em assembly para a linguagem de máquina • Tradução de um programa • linguagem de alto nível • linguagem assembly • linguagem de máquina
Assembly (1/3) O que o programa faz? No programa debug (do DOS), a tela se parecerá com: C:\>debug -a 100 0D62:0100 mov ax,0002 ; move o valor 0002 para o registrador ax 0D62:0103 mov bx,0004 ; move o valor 0004 para o registrador bx 0D62:0106 add ax,bx ; adiciona o conteúdo dos registradores ax e bx guardando o resultado em ax D62:0108 nop ; a instrução nop (nenhuma operação) finaliza o programa 0D62:0109
Assembly (2/3) • Entramos com o comando "t" para executar passo a passo as instruções: • -t • AX=0002BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0103 NV UP EI PL NZ NA PO NC0D62:0103 BB0400 MOV BX, 0004 • Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda instrução: • -t • AX=0002BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0106 NV UP EI PL NZ NA PO NC 0D62:0106 01D8 ADD AX,BX
Assembly (3/3) Teclando "t" novamente para ver o resultado da instrução add: -t AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0108 NV UP EI PL NZ NA PE NC 0D62:0108 90 NOP A possibilidade dos registradores conterem valores diferentes existe, mas AX e BX devem conter os mesmos valores acima descritos.
Programação Estruturada • A utilização do computador para resolver problemas exige que se que se faça uma a descrição de um conjunto de comandos que, obedecidos, provocarão uma sucessão finita de ações que resultarão na resolução do problema proposto (algoritmo). • O desenvolvimento estruturado de algoritmos tem como objetivos: • facilitar o desenvolvimento dos algoritmos • facilitar seu entendimento pelos humanos • antecipar a comprovação de sua correção • facilitar a sua manutenção e modificação • permitir o desenvolvimento em equipe
Programação Estruturada • na programação estruturada tem-se: • refinamentos sucessivos de algoritmos: parte de descrições gerais e gradativas e sucessivamente entram em detalhes e minúcias do problema • modularização: divisão do programa em módulos que delimitam poucas funções e são os mais independentes possíveis • nos módulos deve ser usado um número limitado de diferentes comandos e de diferentes estruturas de controle
Algoritmo Soma de dois números inteiros - Ler o primeiro valor (A) que será entrado via teclado - Ler o segundo valor (B) que será entrado via teclado - Calcular a soma de A e B, atribuindo o valor total (A + B) a uma variável (X). - Mostrar a soma (valor de X) na tela. Exemplo: Se A = 1 e B =2, então X = 3
Linguagem Basic Soma de dois números 1 REM LINGUAGEM BASIC 5 REM PROGRAMA PARA ADICIONAR DOIS NUMEROS S0MA.BAS 10 PRINT "QUAL O VALOR DE A?" 20 INPUT A 30 PRINT "QUAL O VALOR DE B?" 40 INPUT B 50 X = A + B 60 PRINT "A SOMA DOS NUMEROS E':" 70 PRINT X
Linguagem Fortran !====================================== ! Soma de dois numeros inteiros ! entradas: a, b, dois numeros inteiros ! saida: x , a soma dos numeros !====================================== PROGRAM soma IMPLICIT NONE INTEGER :: a, b INTEGER :: x ! le os numeros a e b WRITE(*,*) 'Qual o valor de A?' READ(*,*) a WRITE(*,*) 'Qual o valor de B?' READ(*,*) b ! soma o valor de a e b na variavel x x = a + b ! mostra o resultado da soma WRITE(*,*) WRITE(*,*) 'A soma dos numeros e', x END PROGRAM soma
Linguagem Pascal {LINGUAGEM PASCAL} {Programa para adicionar dois numeros} program adiciona; var {declaracao de variaveis} X, A, B: integer; begin Writeln('Qual valor de A? '); readln(A); writeln('Qual valor de B? '); readln(B); X := A+B; writeln('A soma dos numeros: ', X); readln; end.
Linguagem C /* programa adiciona dois numeros inteiros */ /* inclui informacao sobre biblioteca de comandos */ #include <stdio.h> /* define uma funcao chamada main que nao recebe argumentos */ main() { /* define as variaveis A e B que serao somadas em X como inteiras */ int A; int B; int X; /* scanf() e printf() entrada e saida de dados */ printf("Digite o valor de A:"); scanf("%d", &A); printf("Digite o valor de B:"); scanf("%d", &B); /* soma dois numeros (A e B) inteiros */ X = A + B; /* %d imprime o resultado X como inteiro decimal */ printf("valor da soma eh: %d", X); printf(" "); }
Programação Funcional • É um estilo de programação, sem atribuição, sem alteração dos argumentos de funções, e em que estas se limitam a produzir novos valores. • Neste paradigma, qualquer função da linguagem é considerada uma função matemática pura que, para os mesmos argumentos produz sempre os mesmos valores. Nunca nada é destruído. • Uma função que junta duas listas produz uma nova lista sem alterar as listas originais. • Ex.: uma função que “muda o número de portas de um automóvel produz um novo automóvel”. • Vantagens: produzir programas muito rapidamente e minimizar erros. • Limitações: incapacidade em modificar seja lá o que for.
Programação Funcional Linguagem LISP Soma de dois números em LISP: A forma especial setq recebe uma variável e um valor e atribui o valor à variável. > (let ((x 2)) ; atribui valor 2 a x (setq x (+ x 3)) ; soma em x ao valor 3 (x=5) (setq x (* x x)) ; multiplica os valores de x (x.x = 25) (setq x (- x 5)) ; subtrai de o valor x=25 o valor 5 x) ; o resultado é 20 ou seja (25 - 5) 20 Exemplo : > (setq y 20) 20 > (let ((x 10)) (+ x y)) 30
Programação em Lógica • Uso da Lógica como paradigma de programação, anos 70 Kowalsky • Origens: demonstração automática de teoremas na IA. • Objetivo é solucionar um problema. O problema (P) é tratado como objeto matemático • P = (D, R, q) • onde D = dados, R = resultados e q = condição do problema
Orientação a objetos • Análise orientada a objetos (OOA): ”Um método de análise cujos requisitos são examinados da perspectiva de classes e objetos encontrados no vocabulário do domínio do problema”. • Decomposição orientada a objetos: "É o processo de quebrar um sistema em partes, cada parte representando uma classe ou objeto dentro do domínio do problema. Na decomposição orientada a objetos, o mundo é visto como uma coleção de objetos que cooperam uns com os outros para atingir a funcionalidade desejada."
Orientação a objetos • Projeto orientado a objetos (OOD): "Um método de projeto compreendendo o processo de decomposição orientada a objetos e a notação descrevendo os modelos físicos e lógicos, assim como os modelos estáticos e dinâmicos do sistema considerado; especificamente esta notação incluem os diagramas de classes, os diagramas de módulos e os diagramas de processo”. • Programação orientada a objetos (OOP): "Um método de implementação no qual os programas são organizados como uma coleção cooperativa de objetos, cada qual representando uma instância de alguma classe, e cujas classes são todas membros de uma hierarquia de classes unidas por relações de herança”.
Classes • Uma classe é o elemento fundamental de um sistema orientado a objetos. Todas as classes de um sistema orientado a objetos são arranjadas em uma hierarquia de classes com uma classe raiz no topo. • "Uma classe é uma cópia fiel ou protótipo que define as variáveis e métodos comuns a todos objetos com uma certa característica". O que isso significa? • cópia fiel: Uma classe não pode fazer qualquer coisa consigo mesma. • define: Uma classe oferece algo que pode ser usado mais tarde. • objetos: Uma classe pode ser somente usada se "traz para o mundo real" pela sua instanciação.
Classe Carro • A classe representando um carro tem as variáveis (marca, velocidade, marcha,...) e métodos (acelerar, frear,...). • Esta classe serve como uma descrição genérica de qualquer carro, porque cada coisa no mundo real que é um carro tem por exemplo, uma velocidade máxima, um número de rodas ... e quando dirige um carro você pode acelerar ou mudar a marcha. • Mas você não dirige um carro genérico com um número de rodas em uma velocidade. Você usualmente diz, por exemplo, quatro rodas a 80 km/h. Isto especifica uma instância da classe “carro” e portanto denominada objeto.
Objetos • Objetos: instância de uma classe • “Um objeto tem um estado, um comportamento e identidade”. A estrutura e o comportamento de objetos similares são definidos em suas classes comuns. O que isto significa? • estado: Um objeto tem uma condição determinada por valores correntes de suas variáveis. • comportamento: o estado de um objeto pode ser mudado aplicando-se um certo método. • identidade: cada objeto pode ser distinguido de outros objetos.
Objeto MeuCarro • O objeto parece ser similar a classe e foi instanciado dela. Portanto, devido a isto sua estrutura não muda. • Pela aplicação de certos valores das variáveis, o objeto MeuCarro tem agora um certo estado assim como uma identidade. • É ainda um carro pois tem o mesmo comportamento de todos os outros carros, os quais são definidos em métodos de sua classe comum Carro.
Métodos • Sinônimo: mensagem • Segundo BOOCH, um método é: • "Uma operação em um objeto definido como parte da declaração de uma classe." • Os métodos, definidos em um classe, indicam o que objetos instanciados são capazes de fazer. Um método de um objeto é chamado por outros objetos do sistema. • Uma mensagem é compreendida por três componentes: • 1. o objeto a quem a mensagem é endereçada • 2. o nome do método a ser executado • 3. quaisquer parâmetros necessários ao método • Assim, se quisermos mudar a velocidade de nosso carro, o motorista (que também é considerado um objeto) tem que chamar o método “acelerar”.
Encapsulamento • Sinônimo: informação escondida • O encapsulamento é uma das características mais importantes de um sistema orientado a objetos. • BOOCH descreve o encapsulamento como: • "O processo de esconder todos os detalhes de um objeto que não contribuem para suas características essenciais. Geralmente a estrutura de um objeto é escondida assim como a implementação de seus métodos.[...]”
Exemplo • Como mostra a figura do objeto MeuCarro, todas as suas variáveis são enclausuradas dentro dos métodos do objeto e podem ser mudadas somente por estes métodos. • Assim como, quando você acelera um carro no mundo real não sabe exatamente como o motor do carro trabalha. Você só tem que saber apertar o pedal do acelerador, embreagem e mudar a marcha. • Isto conduz a uma interface amigável, com benefícios para o usuário e para o programador tais como: • O usuário não precisa conhecer detalhes da estrutura interna e da funcionalidade de um objeto. Ele deve saber quais operações podem ser feitas num objeto para mudar seu estado. • O programador pode mudar e melhorar detalhes de implementação sem mudança da interface. • Outra vantagem é que toda funcionalidade é enclausurada num mesmo objeto, o que facilita o manuseio de um objeto.
Herança • Como visto anteriormente, um sistema orientado a objetos consiste de “classes arranjadas em uma hierarquia de classe”. • Uma classe que esteja no topo desta hierarquia serve como uma base para outras classes, as quais tem a mesma ou propriedades adicionas. Este processo é denominado herança. • É um relacionamento entre classes, onde uma classe compartilha a estrutura ou comportamento definido em uma (herança simples) ou mais classes (herança múltipla). • A herança define “uma característica” hierárquica entre classes.
Embora um carro conversível e um caminhão não sejam parecidos, ambos têm algo em comum. • Assim, foram definidos como subclasses de “Carro”. Por exemplo, ambos têm “um número de rodas” e podem ser “acelerados”.
Abstração • Pela definição de subclasses, chega-se uma hierarquia de classes, onde as partes inferiores são mais e mais especializadas. Por outro lado, as classes nas partes superiores são mais generalizadas. Isto leva a outro aspecto da orientação objetos, a qual é denominada abstração. • "São as características essenciais de um objeto que o distingue de outros tipos de objetos e portanto oferecem fronteiras bem definidas, relativas à perspectiva de um observador, no processo de focalizar as características de um objeto [...]” • Como a definição diz, as abstrações são "relativas à perspectiva do observador", que significa que ela depende muito do domínio do problema para qual uma estrutura de classe será criada. • A pesquisa para se fazer abstrações inicia-se após os objetos do domínio do problema terem sido encontrados durante a fase de análise. • É a parte mais difícil e crítica do processo de desenvolvimento, porque o projeto dos níveis de abstração determina a qualidade do sistema considerado.
Exemplo • Considerando que o resultado da fase de análise foram os seguintes objetos: • carros conversíveis • bicicletas "mountain bike" • motocicletas • bicicleta de dois lugares (tandem) • ônibus escolar • camionete • um “Buggy” • um caminhão • um “Puma GTB”
Exemplo • Obviamente, os objetos representam diferentes tipos de veículos. Analisando o fato, encontramos nossa primeira abstração tomando a classe de "veículos" como a classe base da nossa hierarquia.
Exemplo Embora ela contenha todos objetos e portanto esteja “correta” não é muito inteligente. • Uma violação evidente do princípio da abstração é por exemplo, que “carro conversível” pode ser encontrada no mesmo nível de um “Buggy” e um “Puma GTB”. Isto deve estar errado pois ambos são tipos de “carros conversíveis”.
Mudando a hierarquia: Assim temos uma hierarquia mais estruturada com subclasses “bicicletas”, “carros conversíveis” e "transportadores". Mas eles ainda são muito específicos. Por exemplo, se um novo objeto “Omega” for adicionado a hierarquia, onde seria inserido, pois não é um carro conversível?
Rearranjando nossa estrutura pela introdução de uma nova classe "carros":
Agora existem quatro níveis de abstração. A nova classe "carros" pode conter as propriedades que são comuns a todas suas subclasses. • Mas algo ainda está errado com nossos carros conversíveis e "carros de luxo". • Como pode ser visto, eles estão arranjado no mesmo nível de abstração do que, por exemplo, um "caminhão". Mas um caminhão é mais abstrato do que um "Buggy" ou um "Omega".
Um quinto nível de abstração foi criado e nossa hierarquia de classe é agora mais adequada que nossa primeira tentativa mas ainda não terminou... • Isto foi um exemplo de processo de abstração para demonstrar somente como uma hierarquia de classe pode ser construída e quais reflexões devem ser feitas. • Linguagens orientadas a objetos: C++, JAVA, Smalltalk (ver exemplo no livro do Prof. Barreto) • That’all folks! • The End