paradigmas de programação

50
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

Upload: noura

Post on 16-Mar-2016

78 views

Category:

Documents


2 download

DESCRIPTION

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: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 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 ObjetosProfa. 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 - UFSCProf. Orientador: Jorge Muniz Barreto, Dr.

Departamento de Informática e de Estatística - INEUniversidade Federal de Santa Catarina - UFSC

Page 2: Paradigmas de Programação

Mais informações sobre Paradigmas de Programação

em: 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

Atenção!

Page 3: Paradigmas de Programação

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.

Page 4: Paradigmas de Programação

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.

Page 5: Paradigmas de Programação

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.

Page 6: Paradigmas de Programação

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.

Page 7: Paradigmas de Programação

“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

Page 8: Paradigmas de Programação

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

Page 9: Paradigmas de Programação

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

Page 10: Paradigmas de Programação

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

Page 11: Paradigmas de Programaçã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

Page 12: Paradigmas de Programação

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:

Page 13: Paradigmas de Programação

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

Page 14: Paradigmas de Programação

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

Page 15: Paradigmas de Programação

Soma de dois números

Page 16: Paradigmas de Programação

Assembly (1/3)O que o programa faz?

No programa debug (do DOS), a tela se parecerá com:C:\>debug-a 1000D62:0100 mov ax,0002 ; move o valor 0002 para o registrador ax0D62:0103 mov bx,0004 ; move o valor 0004 para o registrador bx0D62: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 programa0D62:0109

Page 17: Paradigmas de Programação

Entramos com o comando "t" para executar passo a passo as instruções:-tAX=0002 BX=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:-tAX=0002 BX=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 (2/3)

Page 18: Paradigmas de Programação

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.

Page 19: Paradigmas de Programação

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

Page 20: Paradigmas de Programação

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

Page 21: Paradigmas de Programação

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

Page 22: Paradigmas de Programação

Linguagem Basic1 REM LINGUAGEM BASIC5 REM PROGRAMA PARA ADICIONAR DOIS NUMEROS S0MA.BAS

10 PRINT "QUAL O VALOR DE A?"20 INPUT A30 PRINT "QUAL O VALOR DE B?"40 INPUT B50 X = A + B60 PRINT "A SOMA DOS NUMEROS E':"70 PRINT X

Soma de dois números

Page 23: Paradigmas de Programação

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

Page 24: Paradigmas de Programação

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.

Page 25: Paradigmas de Programação

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

Page 26: Paradigmas de Programação

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.

Page 27: Paradigmas de Programação

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

Page 28: Paradigmas de Programação

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

Page 29: Paradigmas de Programação

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

Page 30: Paradigmas de Programação

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

Page 31: Paradigmas de Programação

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.

Page 32: Paradigmas de Programação

Exemplo: Classe Carro

Page 33: Paradigmas de Programaçã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.

Page 34: Paradigmas de Programação

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.

Page 35: Paradigmas de Programação

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.

Page 36: Paradigmas de Programação

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

Page 37: Paradigmas de Programação

Exemplo

Page 38: Paradigmas de Programação

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

Page 39: Paradigmas de Programação

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.

Page 40: Paradigmas de Programação

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.

Page 41: Paradigmas de Programação

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

Page 42: Paradigmas de Programação

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.

Page 43: Paradigmas de Programação

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”

Page 44: Paradigmas de Programação

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.

Page 45: Paradigmas de Programação

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

Page 46: Paradigmas de Programação

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?

Page 47: Paradigmas de Programação

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

Page 48: Paradigmas de Programação

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

Page 49: Paradigmas de Programação

Melhoremos nossa hierarquia fazendo outra abstração:

Page 50: Paradigmas de Programação

• 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