paradigmas de programação - imperativo, orientado a objetos e funcional

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

Upload: gustavo-coutinho

Post on 11-Apr-2017

63 views

Category:

Technology


3 download

TRANSCRIPT

Linguagens de ProgramaçãoAula 23 - Paradigmas de Linguagens de ProgramaçãoProf. 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!

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

ProgramaVariáveis

Entrada Saída

Controle AritméticaLó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...

1Baseado na arquitetura de John von Neumann.

2No coração desse paradigma, temos a idéia de atribuição.

3Comandos executados na ordem que aparecem na memória.

4Suporte a declaração de variáveis, condicionais, laços.

5Suporte a abstração procedural.

6Linguagens PopularesC, 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 : 852369Cliente: LudmilaSaldo : R$1500,00Limite : R$100,00

Número : 741582Cliente: FernandaSaldo : R$2500,00Limite : R$200,00

Número : 564897Cliente: GilbertoSaldo : R$1000,00Limite : R$150,00

Figura 5. Projeto de uma conta bancária.

Conta

Número : 852369Cliente: LudmilaSaldo : R$1500,00Limite : R$100,00

Número : 741582Cliente: FernandaSaldo : R$2500,00Limite : R$200,00

Número : 564897Cliente: GilbertoSaldo : R$1000,00Limite : 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...

1P.O.O. trata os programas como uma coleção de objetos que se comunicam passando mensagens.

2No coração desse paradigma, temos o conceito de classes e suas instâncias, os objetos.

3Classes são compostas por informações, chamadas de atributos, e funcionalidades, chamadas de métodos.

4Atributos e métodos podem ter diferentes visibilidades com relação a outras classes.

5P.O.O. oferece conceitos de herança, polimorfismo e interfaces.

6Linguagens PopularesC++, 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...

1Computação é vista como uma função matemática. A noção de estado não existe!

2Expressões Lambda é a base do Paradigma Funcional!

3Funções são o coração do paradigma, permitindo inclusive iterações através de recursão.

4Funções de ordem superior podem receber e retornar outras funções.

5Recursão em cauda tenta resolver o problema do empilhamento excessivo.

6Linguagens PopularesClojure, 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íciosPraticando 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!

[email protected]