1 / 50

Paradigmas de Programação

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:

noura
Download Presentation

Paradigmas de Programação

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. “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

  8. “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?

  9. “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..

  10. 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

  11. 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

  12. 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:

  13. 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

  14. Do “baixo nível” ao “alto nível”!!!

  15. Soma de dois números

  16. 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

  17. 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

  18. 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.

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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.

  25. 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(" "); }

  26. 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.

  27. 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

  28. 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

  29. 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."

  30. 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”.

  31. 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.

  32. Exemplo: Classe Carro

  33. 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.

  34. 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.

  35. 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.

  36. 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”.

  37. Exemplo

  38. 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.[...]”

  39. 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.

  40. 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.

  41. 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”.

  42. 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.

  43. 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”

  44. 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.

  45. 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”.

  46. 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?

  47. Rearranjando nossa estrutura pela introdução de uma nova classe "carros":

  48. 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".

  49. Melhoremos nossa hierarquia fazendo outra abstração:

  50. 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

More Related