Você está na página 1de 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
Atençã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
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
Do “baixo nível” ao “alto nível”!!!
Soma de dois números
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=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:
-t
AX=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 (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
Soma de dois números
Linguagem Basic
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.
Exemplo: Classe Carro
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”.
Exemplo
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".
 Melhoremos nossa hierarquia fazendo outra abstraçã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

Você também pode gostar