SlideShare ist ein Scribd-Unternehmen logo
1 von 79
Downloaden Sie, um offline zu lesen
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
▫ gustavolgcr@ali.ifce.br
▫ 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?
gustavolgcr@ali.ifce.br
Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional

Weitere ähnliche Inhalte

Was ist angesagt?

A linguagem de programação c
A linguagem de programação cA linguagem de programação c
A linguagem de programação c
Clausia Antoneli
 
Introdução à programação
Introdução à programaçãoIntrodução à programação
Introdução à programação
12anogolega
 

Was ist angesagt? (20)

A linguagem de programação c
A linguagem de programação cA linguagem de programação c
A linguagem de programação c
 
Introdução a Linguagem de Programação C
Introdução a Linguagem de Programação CIntrodução a Linguagem de Programação C
Introdução a Linguagem de Programação C
 
Introdução à programação
Introdução à programaçãoIntrodução à programação
Introdução à programação
 
Logica de Programacao
Logica de ProgramacaoLogica de Programacao
Logica de Programacao
 
Banco de questões qualidade de software
Banco de questões qualidade de softwareBanco de questões qualidade de software
Banco de questões qualidade de software
 
Lógica de programação em ppt
Lógica de programação em pptLógica de programação em ppt
Lógica de programação em ppt
 
Lógica de Programação - Algoritmos
Lógica de Programação - AlgoritmosLógica de Programação - Algoritmos
Lógica de Programação - Algoritmos
 
Aula 4 - Estruturas condicionais
Aula 4 - Estruturas condicionaisAula 4 - Estruturas condicionais
Aula 4 - Estruturas condicionais
 
Aula01 - Logica de Programação
Aula01 - Logica de ProgramaçãoAula01 - Logica de Programação
Aula01 - Logica de Programação
 
Aula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem JavaAula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem Java
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
 
Programação Orientada a Objetos
Programação Orientada a ObjetosProgramação Orientada a Objetos
Programação Orientada a Objetos
 
Algoritmos em portugol
Algoritmos em portugolAlgoritmos em portugol
Algoritmos em portugol
 
Exercícios - Herança - Java
Exercícios - Herança - JavaExercícios - Herança - Java
Exercícios - Herança - Java
 
Inteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em GrafosInteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em Grafos
 
Lista de exercícios em portugol
Lista de exercícios em portugolLista de exercícios em portugol
Lista de exercícios em portugol
 
Cisc, risc e pipeline
Cisc, risc e pipelineCisc, risc e pipeline
Cisc, risc e pipeline
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)
 
POO - Unidade 2 (parte 1) - Diagrama de Classe - Associação (versão 2)
POO   - Unidade 2 (parte 1) - Diagrama de Classe - Associação (versão 2)POO   - Unidade 2 (parte 1) - Diagrama de Classe - Associação (versão 2)
POO - Unidade 2 (parte 1) - Diagrama de Classe - Associação (versão 2)
 
Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }
 

Andere mochten auch

Andere mochten auch (20)

Bando de Dados Avançados - Recommender Systems
Bando de Dados Avançados - Recommender SystemsBando de Dados Avançados - Recommender Systems
Bando de Dados Avançados - Recommender Systems
 
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
 
Paradigmas de programação
Paradigmas de programaçãoParadigmas de programação
Paradigmas de programação
 
PARADIGMA IMPERATIVO
PARADIGMA IMPERATIVOPARADIGMA IMPERATIVO
PARADIGMA IMPERATIVO
 
Curso de logica de programação aula 1
Curso de logica de programação aula 1Curso de logica de programação aula 1
Curso de logica de programação aula 1
 
Tecnologías Futuras
Tecnologías FuturasTecnologías Futuras
Tecnologías Futuras
 
PROFESIÓN: INFORMÁTICA
PROFESIÓN:  INFORMÁTICAPROFESIÓN:  INFORMÁTICA
PROFESIÓN: INFORMÁTICA
 
Víctor hugo hernández hoyos estadistica e informatica
Víctor hugo hernández hoyos  estadistica e informaticaVíctor hugo hernández hoyos  estadistica e informatica
Víctor hugo hernández hoyos estadistica e informatica
 
Linux Ubuntu Server - Configurar Samba
Linux Ubuntu Server - Configurar SambaLinux Ubuntu Server - Configurar Samba
Linux Ubuntu Server - Configurar Samba
 
Curso de logica de programação aula 1
Curso de logica de programação aula 1Curso de logica de programação aula 1
Curso de logica de programação aula 1
 
Criar pendrive bootável com aplicativo universal usb installer
Criar pendrive bootável com aplicativo universal usb installerCriar pendrive bootável com aplicativo universal usb installer
Criar pendrive bootável com aplicativo universal usb installer
 
Instalar Sql Server Express 2014 no WinServer2012R2
Instalar Sql Server Express 2014 no WinServer2012R2Instalar Sql Server Express 2014 no WinServer2012R2
Instalar Sql Server Express 2014 no WinServer2012R2
 
Instalando e conectando banco de dados PostgreSQL + extensão espacial PostGIS...
Instalando e conectando banco de dados PostgreSQL + extensão espacial PostGIS...Instalando e conectando banco de dados PostgreSQL + extensão espacial PostGIS...
Instalando e conectando banco de dados PostgreSQL + extensão espacial PostGIS...
 
Apresentação do Curso de Formatação de Computadores e Note Books Brasil Trein...
Apresentação do Curso de Formatação de Computadores e Note Books Brasil Trein...Apresentação do Curso de Formatação de Computadores e Note Books Brasil Trein...
Apresentação do Curso de Formatação de Computadores e Note Books Brasil Trein...
 
La programación informática como vía de emprendimiento. Programamos.
La programación informática como vía de emprendimiento. Programamos.La programación informática como vía de emprendimiento. Programamos.
La programación informática como vía de emprendimiento. Programamos.
 
Gráfico Estadístico De Los Sistemas Operativos Más Utilizados
Gráfico Estadístico De Los Sistemas Operativos Más UtilizadosGráfico Estadístico De Los Sistemas Operativos Más Utilizados
Gráfico Estadístico De Los Sistemas Operativos Más Utilizados
 
O QGIS, caso de sucesso de um projeto aberto da OSGEO
O QGIS, caso de sucesso de um projeto aberto da OSGEOO QGIS, caso de sucesso de um projeto aberto da OSGEO
O QGIS, caso de sucesso de um projeto aberto da OSGEO
 
Linux Ubuntu Server - Configurar modo grafico do user root
Linux Ubuntu Server - Configurar modo grafico do user rootLinux Ubuntu Server - Configurar modo grafico do user root
Linux Ubuntu Server - Configurar modo grafico do user root
 
Sistema Operativo MAC
Sistema Operativo MACSistema Operativo MAC
Sistema Operativo MAC
 
Linux Ubuntu Server - Configurar dhcp
Linux Ubuntu Server - Configurar dhcpLinux Ubuntu Server - Configurar dhcp
Linux Ubuntu Server - Configurar dhcp
 

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

Ähnlich wie Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional (20)

POO - Aula 003
POO - Aula 003POO - Aula 003
POO - Aula 003
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012
 
01-Paradigmas.pdf
01-Paradigmas.pdf01-Paradigmas.pdf
01-Paradigmas.pdf
 
FC-Logic
FC-LogicFC-Logic
FC-Logic
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Metaprogramação Ruby
Metaprogramação RubyMetaprogramação Ruby
Metaprogramação Ruby
 
PHP, Mercado e Certificações
PHP, Mercado e CertificaçõesPHP, Mercado e Certificações
PHP, Mercado e Certificações
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Programando php com excelência
Programando php com excelênciaProgramando php com excelência
Programando php com excelência
 
Mini Curso de PHP
Mini Curso de PHPMini Curso de PHP
Mini Curso de PHP
 
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoObjects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
 
Curso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoCurso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP Básico
 
M5 php rc
M5 php rcM5 php rc
M5 php rc
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de erros
 
Aula02
Aula02Aula02
Aula02
 
Introdução a lógica de Programação Aula-01
Introdução a lógica de Programação Aula-01Introdução a lógica de Programação Aula-01
Introdução a lógica de Programação Aula-01
 
Lógica de programação e algoritmos
Lógica de programação e algoritmosLógica de programação e algoritmos
Lógica de programação e algoritmos
 
A importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-diaA importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-dia
 

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

  • 1. Linguagens de Programação Aula 23 - Paradigmas de Linguagens de Programação Prof. Gustavo Coutinho
  • 2. 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
  • 3. Conteúdo Programático ▪ Recapitulando... ▪ Paradigma Imperativo ▪ Paradigma Orientado a Objetos ▪ Paradigma Funcional ▪ Conclusão e Revisão ▪ Exercícios!
  • 5. 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 ▫ gustavolgcr@ali.ifce.br ▫ Grupos com 3 integrantes
  • 7. 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.
  • 8. Aula de hoje Iremos abordar 3 dos paradigmas mais populares: ▪ Paradigma Imperativo; ▪ Paradigma Orientado a Objetos; ▪ Paradigma Funcional.
  • 9. Paradigma Imperativo “Faça isso, depois isso, depois aquilo...” 2
  • 10. ▪ Na Segunda Guerra Mundial, a máquina ENIAC foi desenvolvida. ▪ Custos de manutenção e implementação eram muito altos! Motivação
  • 11. 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.
  • 13. 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
  • 14. 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.
  • 15. 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
  • 16. ● 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
  • 17. 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.
  • 18. Figura 2. Comandos sendo executados na sequência em que aparecem na memória. Memória
  • 19. 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.
  • 20. Figura 3. Código de um programa em C para um algoritmo de ordenação.
  • 21. Figura 4. Código de um programa em C para um algoritmo de ordenação com a função implementada.
  • 22. 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
  • 23. Paradigma Orientado a Objetos “Uma viagem até Objetópolis…” 3
  • 24. Motivação Vamos considerar um sistema implementado em uma linguagem imperativa que utilize a validação de um C.P.F. .
  • 25. 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.
  • 26. 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.
  • 27. 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?
  • 28. 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
  • 29. 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.
  • 30. 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.
  • 31. 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?
  • 32. Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema
  • 33. Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema
  • 34. Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema
  • 35. Figura 7. Classe Conta e Classe TestaContaEstouro com inconsistência no sistema
  • 36. 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!
  • 37. 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!
  • 38. Visibilidade e Ocultamento de Informação Existem 3 níveis principais de visibilidade (modificadores de acesso) entre classes e subclasses: private protected public
  • 39. 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?
  • 40. Figura 8. Modelagem da Classe Funcionario e da Classe Gerente. Poderíamos incluir as informações de Gerente em Funcionario? Poderíamos...
  • 41. Figura 9. Modelagem da Classe Funcionario e da Classe Gerente.
  • 42. 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!
  • 43. 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
  • 44. 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()
  • 45. Interfaces Imagine um Sistema Interno que autentica Gerente e Diretor. Funcionario Secretário Gerente É-UM É-UM Diretor É-UM Sistema Interno Autentica Autentica
  • 46. Figura 10. Métodos de autentica() das classes Gerente e Funcionário.
  • 47. Sistema Interno tem o seguinte método: Interfaces Funcionario Secretário Gerente É-UM É-UM Diretor É-UM Sistema Interno Autentica Autentica
  • 48. Interfaces Sistema Interno tem o seguinte método:Funcionario Secretário GerenteDiretor Sistema Interno Funcionario Autenticável É-UM É-UM É-UM É-UM
  • 49. Interfaces Sistema Interno tem o seguinte método:Funcionario Secretário GerenteDiretor Sistema Interno Funcionario Autenticável É-UM É-UM É-UM Cliente É-UM
  • 50. 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
  • 52. 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
  • 54. 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!
  • 55. 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).
  • 56. 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.
  • 57. 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
  • 58. 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).
  • 59. Figura 12. Funções para imprimir na tela e contar até zero. Funções e Listas
  • 60. 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
  • 61. A função map recebe uma outra função que é aplicada a uma lista de números. Funções e Listas
  • 62. 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.
  • 63. 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.
  • 64. 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.
  • 65. Funções recursivas e recursão de cauda Figura 14. Utilizando recursão em cauda na função de Fibonacci.
  • 66. +=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)
  • 67. 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.
  • 68. Funções preguiçosas Figura 16. Exemplo de função preguiçosa.
  • 69. 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
  • 70. Revisão e Conclusão "Se liga aí, que é hora da revisão!" 5
  • 71. 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.
  • 72. 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!
  • 73. 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.
  • 74. Próxima aula 1. Paradigma Lógico; 2. Paradigma Concorrente; 3. Paradigma Orientado a Eventos; 4. Orientações sobre o trabalho final.
  • 76. 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.
  • 77. 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.