Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional

gustavolgcr 10,699 views 79 slides Feb 27, 2017
Slide 1
Slide 1 of 79
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79

About This Presentation

Aula sobre Paradigmas de Programação. São abordados: Paradigmas Imperativo, Paradigma Orientado a Objetos e Paradigma Funcional


Slide Content

Linguagens de
Programação
Aula 23 - Paradigmas de
Linguagens de Programação
Prof. Gustavo Coutinho

Programa da disciplina
1.Análise Sintática e Léxica ✓
2.Semântica Formal ✓
3.Verificação e inferência de tipos ✓
4.Teoria dos tipos ✓
5.Paradigmas de Linguagens de
Programação

Conteúdo Programático
▪Recapitulando...
▪Paradigma Imperativo
▪Paradigma Orientado a Objetos
▪Paradigma Funcional
▪Conclusão e Revisão
▪Exercícios!

Avisos
Informes gerais sobre a disciplina
0

Avisos
▪Página da disciplina atualizada (notas de
aula e descrição do trabalho final)!
▫http://ali.ifce.br/~gustavolgcr/lip
▪Enviar membros dos grupos para o
e-mail do professor
[email protected]
▫Grupos com 3 integrantes

Recapitulando...
Recapitulando a aula anterior...
1

Paradigmas de Linguagens
de Programação
▪Um paradigma é um padrão de
raciocínio para resolução de problemas!
▪A maioria das linguagens podem
suportar mais de um paradigma.
▪Cabe ao programador escolher o
paradigma mais adequado ao seu
problema.

Aula de hoje
Iremos abordar 3 dos paradigmas mais
populares:
▪Paradigma Imperativo;
▪Paradigma Orientado a Objetos;
▪Paradigma Funcional.

Paradigma
Imperativo
“Faça isso, depois isso, depois aquilo...”
2

▪Na Segunda Guerra
Mundial, a máquina
ENIAC foi desenvolvida.
▪Custos de manutenção
e implementação eram
muito altos!
Motivação

Paradigma Imperativo
John von Neumann reconheceu que um
programa e suas variáveis podem residir
na memória principal de um computador.
▪Nasce a arquitetura de von Neumann!
O Paradigma Imperativo é criado para dar
suporte a essa nova arquitetura.

Programa
Variáveis
Entrada Saída
Controle
Aritmética
Lógica
Figura 1. O modelo computacional de John von Neumann.

Caracteristicas Principais:
Paradigma Imperativo
Com a evolução do paradigma, uma
linguagem imperativa suporta, dentre
outras, as seguintes características comuns.
1.Atribuições, Declarações e Expressões;
2.Estruturas de Controle;
3.Abstração Procedural

Atribuições, Declarações e
Expressões
No coração desse paradigma, temos a idéia
de atribuição.
▪Alterar o valor de um local da memória e
destruir o valor anterior.

Declaração de variável
▪Nome a um local de memória
▪Tipo a valores armazenados
Interpretar expressões
▪Recuperar valores em um determinado
endereço de memória
Atribuições, Declarações e
Expressões

●Nome: x
●Tipo: Integer
●Valor: 5
●Posição: 89142
●Nome: z
●Tipo: Integer
●Valor: 1
●Posição: 569111
●Nome: y
●Tipo: Double
●Valor: 7.56
●Posição: 254896
Atribuição
●x = 5
●x = 17
Atribuições, Declarações e
Expressões
Memória

Estruturas de controle
Comandos são executados na sequência
em que aparecem na memória!
- Condicionais podem selecionar
caminhos alternativos durante a execução;
-Laços repetem blocos de códigos
utilizando testes ou iteradores como
controle.

Figura 2. Comandos sendo executados na sequência em que aparecem na memória.
Memória

Abstração Procedural
No início do desenvolvimento de linguagens
imperativas, o valor de funções reusáveis
foi reconhecido.
▪A abstração procedural permite o
programador preocupar-se somente com
a interface da função desejada.

Figura 3. Código de um programa em C para um algoritmo de ordenação.

Figura 4. Código de um programa em C para um algoritmo de ordenação com a função
implementada.

Recapitulando...
1
Baseado na arquitetura de
John von Neumann.

2
No coração desse
paradigma, temos a idéia
de atribuição.
3
Comandos executados na
ordem que aparecem na
memória.
4
Suporte a declaração de
variáveis, condicionais,
laços.
5
Suporte a abstração
procedural.
6
Linguagens Populares
C, Ada e Java

Paradigma
Orientado a
Objetos
“Uma viagem até Objetópolis…”
3

Motivação
Vamos considerar um sistema
implementado em uma linguagem
imperativa que utilize a validação de um
C.P.F. .

Motivação
▪C.P.F. será sempre
validado?
▪Qual programador vai
ficar responsável pela
verificação?
▪E se um novo
desenvolvedor entrar?
▪Precisamos conhecer o
código inteiro
internamente?
O problema do paradigma imperativo é que não existe uma
forma simples para criar uma conexão forte entre dados e
funcionalidades.

Paradigma Orientado a
Objetos
A P.O.O. trata os programas como uma
coleção de objetos que se comunicam
passando mensagens, dados.
▪Concentra as responsabilidades nos
lugares certos;
▪Flexibiliza a aplicação;
▪Encapsula a lógica de negócios.

Classes e objetos
Vamos imaginar um sistema bancário.
▪A entidade principal desse sistema será a
CONTA bancária!
Como generalizar as informações e
funcionalidades de uma conta?

Classes e objetos
Informações
▪Número da conta
▪Nome do titular
▪Saldo
▪Limite
Atributos
Funcionalidades
▪Sacar valor
▪Depositar valor
▪Transferir valor
▪Imprimir saldo
Métodos

Conta
Número : 852369
Cliente: Ludmila
Saldo : R$1500,00
Limite : R$100,00
Número : 741582
Cliente: Fernanda
Saldo : R$2500,00
Limite : R$200,00
Número : 564897
Cliente: Gilberto
Saldo : R$1000,00
Limite : R$150,00
Figura 5. Projeto de uma conta bancária.

Conta
Número : 852369
Cliente: Ludmila
Saldo : R$1500,00
Limite : R$100,00
Número : 741582
Cliente: Fernanda
Saldo : R$2500,00
Limite : R$200,00
Número : 564897
Cliente: Gilberto
Saldo : R$1000,00
Limite : R$150,00
CLASSE OBJETO
Figura 6. Classe conta e alguns objetos.

Visibilidade e Ocultamento
de Informação
Problema inicial
▪O que aconteceria se nosso sistema
tentasse fazer um saque de um valor
que ultrapasse o valor do saldo?
▫Inconsistência no sistema!
▪Como resolver?

Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema

Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema

Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema

Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema

Visibilidade e Ocultamento
de Informação
A validação não deve ser controlada por
quem utiliza a classe, mas sim por ela
mesma.
Para controlar a visibilidade de métodos e
atributos, utilizamos modificadores de
acesso.

Concentrar
responsabilidades!

Visibilidade e Ocultamento
de Informação
Existem 3 níveis principais de visibilidade
(modificadores de acesso) entre classes e
subclasses:
▪public: visível a todos,
▪protected: visível a subclasses,
▪private: visível a própria classe.
Encapsula a Lógica
de Negócios!

Visibilidade e Ocultamento
de Informação
Existem 3 níveis principais de visibilidade
(modificadores de acesso) entre classes e
subclasses:
private
protected
public

Herança
Outra entidade muito importante do nosso
sistema bancário são os Funcionários.

E se quisermos modelar, em seguida, um
Gerente? E um Diretor? Um Secretário?

Figura 8. Modelagem da Classe Funcionario e da Classe Gerente.
Poderíamos incluir as
informações de Gerente
em Funcionario?

Poderíamos...

Figura 9. Modelagem da Classe Funcionario e da Classe Gerente.

Para solucionar esse
problema, a Orientação a
Objetos nos provê o conceito
de Herança!

A classe filha vai herdar
todos os atributos e métodos
da classe mãe.
Herança
Funcionário
Gerente
Superclasse
Subclasse
Diretor Secretário
Subclasse Subclasse
Flexibilizar
Aplicação!

Polimorfismo
O que guarda uma variável do tipo
Funcionário?
▪Referência para um Funcionário.
Podemos nos referir a um Gerente como
um Funcionário.
▪Gerente É-UM Funcionário

Polimorfismo
double
getBonificação()
Polimorfismo é a capacidade de um objeto
poder ser referenciado de várias formas!

Funcionario
Secretário Gerente
É-UM É-UM
double
getBonificação()

Interfaces
Imagine um Sistema
Interno que autentica
Gerente e Diretor.

Funcionario
Secretário Gerente
É-UM É-UM
Diretor
É-UM
Sistema Interno
Autentica
Autentica

Figura 10. Métodos de autentica() das classes Gerente e Funcionário.

Sistema Interno tem o
seguinte método:
Interfaces
Funcionario
Secretário Gerente
É-UM É-UM
Diretor
É-UM
Sistema Interno
Autentica
Autentica

Interfaces
Sistema Interno tem o
seguinte método:Funcionario
Secretário
GerenteDiretor
Sistema Interno
Funcionario
Autenticável
É-UM
É-UM
É-UM É-UM

Interfaces
Sistema Interno tem o
seguinte método:Funcionario
Secretário
GerenteDiretor
Sistema Interno
Funcionario
Autenticável
É-UM
É-UM
É-UM
Cliente
É-UM

Interfaces
Qual o fator comum entre Diretor, Cliente e
Gerente? O método Autentica!
Precisamos de um contrato:
contrato Autenticavel:
quem quiser ser Autenticavel, precisa saber fazer:
▪autenticar dada uma senha, devolvendo um
booleano

Interfaces
Funcionario
Secretário
É-UM É-UM
Diretor
É-UM
Sistema Interno
Autentica
Autentica
Autenticável
Cliente
Gerente

Recapitulando...
1
P.O.O. trata os programas
como uma coleção de
objetos que se
comunicam passando
mensagens.
2
No coração desse
paradigma, temos o
conceito de classes e suas
instâncias, os objetos.
3
Classes são compostas por
informações, chamadas de
atributos, e
funcionalidades,
chamadas de métodos.
4
Atributos e métodos
podem ter diferentes
visibilidades com relação
a outras classes.
5
P.O.O. oferece conceitos
de herança,
polimorfismo e
interfaces.
6
Linguagens Populares
C++, Java e Python

Paradigma
Funcional
“Sometimes, the elegant
implementation is just a function…”
4

Paradigma Funcional
Motivada pela necessidade de
pesquisadores no desenvolvimento de I.A.
▪John McCarthy criou a linguagem Lisp
Computação é vista como uma função
matemática mapeando entradas a saídas.
▪Não existe a noção de estado!

Em Programação Funcional, variáveis não
variam! Veja os seguintes códigos:
Primeiros passos com
Programação Funcional
Figura 11. Exemplo de variáveis no Paradigma Imperativo (esq.) e Funcional (dir).

Paradigma Funcional
Veremos algumas aspectos importantes
do Paradigma Funcional.
1.Expressões Lambda;
2.Funções e Listas;
3.Recursões;
4.Funções Preguiçosas.

Expressões Lambda (λ)
Expressão Lambda é a base do Paradigma
Funcional.
▪Especifica os parâmetros e a definição de
uma função, mas não seu nome.
Exemplo:
(λx⋅x*x) → ((λx⋅x*x)2) → 4

Funções e Listas
No coração desse paradigma, temos as
funções. Mas como utilizá-las?
Usaremos a linguagem Clojure como
exemplo.
▪Dialeto da linguagem LISP,
▪Executada na Máquina Virtual Java (JVM).

Figura 12. Funções para imprimir na tela e contar até zero.
Funções e Listas

Uma função de ordem superior é uma
função que recebe funções como
parâmetros ou que leva a função como
resultado, ou ambos.

Exemplo: Função map
Funções e Listas

A função map recebe uma outra função que
é aplicada a uma lista de números.
Funções e Listas

Funções recursivas e
recursão de cauda
O uso de recursões para especificar
repetições pode deixar programas muito
lentos!
Podemos sofrer com o empilhamento das
funções.

Funções recursivas e
recursão de cauda
fib(5)
fib(4)
fib(3)
fib(2)
fib(1)
Ramo da árvore de
execução
Figura 13. Exemplo de função recursiva.

Funções recursivas e
recursão de cauda
Recursão em cauda pode solucionar o
problema.
Se uma chamada recursiva em uma função
é a última expressão na função, um
compilador pode facilmente converter tal
recursão em uma iteração.

Funções recursivas e
recursão de cauda
Figura 14. Utilizando recursão em cauda na função de Fibonacci.

+=loop 1 2 3
loop 2 3 4
loop 3 5 5
fib(3) fib(2) fib(2) fib(1)
fib(2) fib(1)
fib(5) fib(4) fib(3)
COM cauda SEM cauda
Figura 14. Comparação entre a recursão COM cauda e SEM cauda.
fib(5)

Funções preguiçosas
Em linguagens funcionais, existe o conceito
de função preguiçosa, a qual não é
executada até ser pedido seu resultado.
Permite a definição de estruturas de dados
infinitas.

Funções preguiçosas
Figura 16. Exemplo de função preguiçosa.

Recapitulando...
1
Computação é vista como
uma função matemática.
A noção de estado não
existe!
2
Expressões Lambda é a
base do Paradigma
Funcional!
3
Funções são o coração do
paradigma, permitindo
inclusive iterações através
de recursão.
4
Funções de ordem
superior podem receber e
retornar outras funções.
5
Recursão em cauda tenta
resolver o problema do
empilhamento excessivo.
6
Linguagens Populares
Clojure, Scala e Java

Revisão e
Conclusão
"Se liga aí, que é hora da revisão!"
5

Revisão
Paradigmas de Program.
▪Padrão de raciocínio
para resolver problemas;
▪Linguagens geralmente
suportam mais de um
paradigma.
Paradigma Imperativo
▪Baseado na arquitetura
de John von Neumann;
▪No coração desse
paradigma, temos as
atribuições.

Revisão
Paradigma Orien. a Obj.
▪Trata programas como
uma coleção de objetos;
▪Conceitos fundamentais:
classes e objetos.
Paradigma Funcional
▪Variáveis não variam;
▪Computações são vistas
como uma função;
▪Não existe a noção de
estado!

Conclusão
▪Na aula de hoje, continuamos o estudo
de Paradigmas de Programação.
▪Os alunos devem entender bem os
conceitos básicos dos principais
paradigmas.
▪Dessa forma, a migração para uma nova
linguagem será mais suave.

Próxima aula
1.Paradigma Lógico;
2.Paradigma Concorrente;
3.Paradigma Orientado a Eventos;
4.Orientações sobre o trabalho final.

Exercícios
Praticando conceitos
6

Exercícios
▪Iniciaremos a lista de exercícios em sala
de aula, agora.
▪As questões que não forem resolvidas
deverão ser entregues na próxima aula.
▪Iniciaremos o próximo encontro com
dúvidas sobre os exercícios.

Bibliografia
[BÁSICA]
●TUCKER, A.; NOONAN, R. Linguagens de Programação: Princípios e Paradigmas. [S.I.]: AMGH
Editora, 2009.
●SEBESTA, R. W. Conceitos de linguagens de programação. [S.I.]: Bookman Editora, 2009.

[COMPLEMENTAR]
●WATT, D. A. Programming language design concepts. [S.I.]: John Wiley e Sons, 2004.
●VAN-ROY, P.; HARIDI, S. Concepts, techniques, and models of computer programming. [S.I.]: MIT
press, 2004.

OBRIGADO!
Dúvidas?
[email protected]