Você está na página 1de 45

Paradigmas de L.P.

Prof. Froner
Paradigmas de LPs

Paradigmas

Imperativo Declarativo

Estruturado Orientado Concorrente Funcional Lógico


a Objetos

procedimental

Introdução Linguagens de Programação 2


Razões para entender

 se você entende o paradigma ou conceitos fundamentais sob os


quais uma determinada linguagem, framework ou biblioteca
foram construídos, a curva de aprendizado torna-se cada vez
mais rápida e a velocidade de adaptação a ele é muito maior.

Introdução Linguagens de Programação 3


Origem do imperativo
※ O fundamento para o paradigma imperativo é o conceito da Máquina de
Turing , que nada mais é que uma abstração matemática que corresponde
ao conjunto de funções computáveis. A máquina de Turing foi
aproximada por John von Neumann a uma arquitetura de computadores
que fundamenta os computadores construídos até hoje .
※ A essência da programação imperativa se resume a três conceitos :
– estados de uma máquina abstrata descritos por valores de um
conjunto de variáveis;
– reconhecedores de estados - expressões compostas por relações entre
esses valores ou os resultados de operações utilizando valores;
– comandos de atribuição e controle que manipulam o estado.
Introdução Linguagens de Programação 4
imperativo

※ Imperativo: que acentua o caráter de mando, de autoridade,


ou que exprime uma ordem; autoritário.
※ Então, imperatividade dá a ideia de dar ordens ou se dizer
com todas as letras o que se deve fazer a alguém. Na
programação imperativa possui ideia semelhante.

Introdução Linguagens de Programação 5


imperativa
※ Baseado em instruções e comandos, o programador diz como e
o quê exatamente um programa ou rotina deve realizar.
※ É neste paradigma que surgiram os famosos laços de
repetição, estruturas condicionais, atribuição de valor à
variáveis e controle de estado.
※ A maioria dos programadores utilizam este paradigma de
programação
※ Instruções como if, while, switch e for são típicas de
linguagens de programação imperativas.

Introdução Linguagens de Programação 6



exemplo, suponhamos que temos que implementar em uma página Web uma
funcionalidade que, caso o usuário marque a opção de seleção em um controle do tipo
checkbox, uma mensagem deve ser exibida, caso contrário, a mensagem deve ser
ocultada.


Para a implementação funcionar conforme o desejado foi necessária a criação de
uma função que possuísse a implementação, especificando de forma imperativa
o que deveria acontecer no caso o estado do controle checkbox fosse alterado

Introdução Linguagens de Programação 7


imperativa

※se baseia em especificar os passos que um programa deve


seguir para alcançar um estado desejado.
※ Os Procedimentos também são conhecidos como métodos,
subrotinas, rotinas ou funções
– Não confundir com funções matemática no parad
declarativo

Introdução Linguagens de Programação 8


recursos centrais das linguagem imperativas

※ as variáveis, as quais modelam as células de memória;


※ as instruções de atribuição, baseadas nas operações de
canalização, introduz a dependencia de ordem no programa;
※ e sequencia ordem na qual os comandos são escritos e
executados
※ a forma iterativa de repetição, o método mais eficiente desta
arquitetura.

Introdução Linguagens de Programação 9


Porque imperativo

o programador instruirá o computador da seguinte


forma:
- faça isso;
- depois isso;
- depois aquilo...

Introdução Linguagens de Programação 10


Vantagens e desvantagens
※ Vantagens
– Eficiência
– Modelagem natural dos problemas do mundo real
– Consolidado e com dominância de mercado
※ Desvantagens
– Foca no “COMO” e não o “QUE” precisa ser feito
– Difícil legilibilidade

Introdução Linguagens de Programação 11


Exemplo 2
※ Por exemplo, o programa a seguir, em linguagem C , que é uma
linguagem imperativa, resolve o problema de obter todos os
números binários de três dígitos. Note que esse programa
especifica “como” computar esse resultado, passo a passo. Para
cada estado (representado pelos valores das variáveis A, B e C),
o comando printf()mostra um número binário distinto.

Introdução Linguagens de Programação 12


include
int main()
{

for(int A=0; A<2; A++)

for(int B=0; B<2; B++)


for(int C=0; C<2; C++)
printf("%d%d%d\n",A,B,C);
return 0;
}

Introdução Linguagens de Programação 13


Linguagens
※ Fortran, Pascal, C, ADA

Introdução Linguagens de Programação 14


Linguagens
※ Fortran, Pascal, C, ADA

Introdução Linguagens de Programação 15


DECLARATIVA

Introdução Linguagens de Programação 16


Declarativa
※ A ideia do paradigma declarativo , por sua vez, é que um
programa pode ser visto como um teorema em uma lógica
apropriada. Por essa linha de raciocínio, a programação é
levada a um nível mais alto de abstração, onde o programador
pode concentrar-se em descrever o resultado o que deve ser
computado, e não necessariamente como esse resultado deve
ser computado

Introdução Linguagens de Programação 17


Declarativa
※ Uma das principais características do paradigma declarativo
é que não há preocupação na maneira ou método de execução
de uma determinada rotina. Em outras palavras, o foco não
está no “como” e sim no “que”.
※ baseado em programação funcional, programação lógica ou
programação restritiva.

Introdução Linguagens de Programação 18


Declarativa
※ linguagem SQL - Quando especificamos uma simples
instrução SELECT, simplesmente declaramos ao banco de
dados o que queremos, sem necessidade de nos importarmos
com os procedimentos que o gerenciador de banco de dados
adotará para fazer funcionar corretamente a instrução.
※ Esta característica torna o modo de programação declarativo
mais simples e legível em comparação à programação
imperativa.

Introdução Linguagens de Programação 19



exemplo, suponhamos que temos que implementar em uma página Web uma
funcionalidade que, caso o usuário marque a opção de seleção em um controle do tipo
checkbox, uma mensagem deve ser exibida, caso contrário, a mensagem deve ser
ocultada.


um modo de programação declarativo, a implementação ficaria com maior
simplicidade

Possui exatamente o mesmo resultado da anterior implementação imperativa,
mas com nenhuma linha de código adicional além do HTML. O modo de
programação declarativa tem se mostrado bastante eficaz para front-end.

Introdução Linguagens de Programação 20


Vantagens e desvantagens
※ Vantagens
– Reduzir efeito colaterais
– Minimizar mutabilidade
– Mais legilibilidade e menos bugs
※ Desvantagens
– Não oferece alocação explícita de memória ou
declaração explícita de variáveis, necessários para a
resolução de muitos problemas reais.

Introdução Linguagens de Programação 21


Exemplo 2
※ o programa a seguir, em linguagem Prolog , que é uma
linguagem declarativa, resolve o problema de obter todos os
números binários de três dígitos. Note que esse programa
especifica “o que” deve ser computado como resultado. O
programa declara os dígitos que podem ser usados na
composição de um número binário, e define um binário de três
dígitos como uma tupla (A,B,C), em que cada componente
representa um dígito binário. Para ver o resultado computado
pelo programa, o usuário deve fazer a consulta: ?-binário(N).

Introdução Linguagens de Programação 22


Exemplo 2 prolog

dígito(0).
dígito(1).

binário(N) :- N=(A,B,C), dígito(A), dígito(B), dígito(C).

Introdução Linguagens de Programação 23


Breve comparação
※ Na declarativa a programação se torna sem efeitos colaterais,
isto é, dadas algumas declarações e realizada alguma
interação entre elas, o resultado será sempre o mesmo para
aquelas declarações, enquanto que, na programação
imperativa, um mesmo trecho de código nem sempre retornará
o mesmo resultado (pois o resultado depende do estado em que
ele é computado).

Introdução Linguagens de Programação 24


Estrutural
※ criado no final de 1950 junto às linguagens ALGOL 58 e ALGOL 60,
※ Este paradigma é normalmente formado por código em um único bloco e
foi impulsionado pelas vantagens práticas que o paradigma oferece, e
também pelo 'teorema do programa estruturado (de 1966, também
chamado de teorema de Böhm-Jacopini)
※ Em 1968 e 1987, Edsger W. Dijkstra e Niklaus Wirth
respectivamente, publicaram artigos nos quais defendiam a abolição do
goto nas linguagens de programação de alto nível, alegando que o
comando induzia a vários erros de programação e promovia práticas
ruins, além de tornar extremamente difícil a leitura de programas.

Introdução Linguagens de Programação 25
Estrutural
※ Este movimento deu origem à programação estruturada, que se
fundamenta em três estruturas de controle de fluxo de código :
※ Estrutura de sequência: na qual um comando é executado após o
outro, de forma linear, e, portanto sem o uso de goto;
※ Estrutura de decisão: na qual trechos do programa podem ser
executados dependendo do resultado de um teste lógico;
※ Estrutura de iteração: na qual determinado trecho de código é
repetido por um número finito de vezes, enquanto um teste lógico
for verdadeiro.
※ Expoentes: Cobol, PHP e Perl

Introdução Linguagens de Programação 26


Estrutural exemplo comparativo

O Exemplo A mostra um programa (em pseudocódigo)


que lê dois números e imprime o maior entre eles
(execução condicional), usando goto. O Exemplo B
mostra um programa estruturado correspondente, sem o
uso de goto.

Introdução Linguagens de Programação 27


Estrutural exemplo comparativo
A B
begin: read a
read a
read b
read b
if b > a
if b > a goto impb
print a
print b
goto end else
impb: print a
print b
end:

Introdução Linguagens de Programação 28


Procedimental
※ é uma derivação do paradigma estruturado. Este paradigma agrega o
conceito de procedimento (em inglês procedure, termo que dá nome ao
paradigma).
※ Procedimento, também conhecido como rotina, subrotina, ou função, é
uma unidade do programa que armazena uma sequência de instruções
modularizadas a fim de executar uma tarefa específica.
※ Esta unidade pode então ser chamada em qualquer parte do programa
(e.g., ser chamada por outros procedimentos e por si própria) onde
aquela determinada tarefa precise ser realizada. Desta forma, o uso de
procedimentos possibilita abstrair tarefas específicas, permitindo aos
programadores se preocupar em o que será feito, em vez de como.
Introdução Linguagens de Programação 29
Procedimental
※ Para ilustrar o uso de procedimentos, o Exemplo C mostra a
definição de um procedimento em linguagem C que ordena um
vetor de números inteiros. O exemplo D mostra o uso desse
codigo como procedimento

Introdução Linguagens de Programação 30


Exemplo Procedimental
C D
void bubble_sort(long[] list, long n) int main()
{
{
long c, d, t;
for (c = 0 ; c < ( n - 1 ); c++)
{ int n= 10;
for (d = 0 ; d < (n - 1 - c); d++) int[n] array = {0,9,7,5,3,1,2,4,6,8};
{
bubble_sort(array, n);
if (list[d] > list[d+1])
{
t = list[d]; printf("Numeros ordenados em ordem
list[d] = list[d+1]; ascendente:\n");
list[d+1] = t; for ( int c = 0 ; c < n ; c++ )
} printf("%ld\n", array[c]);
}
return 0;
}
} }

Introdução Linguagens de Programação 31


Procedimental
※ mostra como esse procedimento pode ser usado no corpo de
programa também escrito em linguagem C. Note que o código
do programa ficou mais simples e fácil de ler do que se o
código de ordenação estivesse diretamente no programa
principal. Essa modularização de tarefas em procedimentos
permite um desenvolvimento mais produtivo (pois
procedimentos já feitos e testados podem ser reusados) e de
maior manutenabilidade.

Introdução Linguagens de Programação 32


Imperativo OO
※ Com a evolução da programação, o foco, anteriormente
voltado para a arquitetura agora volta-se para os dados.
Fomentando o surgimento do paradigma de programação
orientado a objetos.
※ Onde não coloca-se em voga as funcionalidades do programa
em desenvolvimento e sim as categorias de dados a serem
manipulados (as classes que dão origem a objetos).
※ A metodologia orientada a objeto inicia-se com a abstração de
dados.

Introdução Linguagens de Programação 33


Imperativo OO
※ A abstração de dados trata-se de encapsular os dados por meio
de procedimentos (métodos) que controlaram a acesso a estes.
※ Adiciona-se também o conceito de herança e outras
características.
※ Herança é um conceito poderoso que potencializa a reutilização
de código.
※ O desenvolvimento da programação orientada a objeto se deu
em paralelo com a linguagem que suportou seus conceitos a
Smaltalk.(Hoje suportados em C++, Java, etc.)

Introdução Linguagens de Programação 34


Classe OO
※ Uma classe é uma estrutura que abstrai um conjunto de
objetos do mesmo tipo . É nela que são definidas as
características (estrutura) dos objetos daquele tipo, ou seja,
que dados (atributos) são armazenados pelo objeto e que
operações (métodos) podem ser efetuadas com estes dados.
※ É importante que cada classe tenha apenas uma ou um
pequeno número de responsabilidades. Se uma classe possui
excesso de responsabilidades, sua implementação se tornará
muito confusa e difícil de manter e entender.

Introdução Linguagens de Programação 35


Classe OO
※ Atributo
※ Os dados contidos em uma classe são conhecidos como atributos daquela
classe e representam características presentes nos objetos do tipo da classe.
Cada atributo deve ter um escopo de acessibilidade, um nome e ser de um tipo,
que será ou um tipo de dado nativo da linguagem (geralmente tipos inteiro,
real, caractere, string, booleano), ou outra classe já existente na linguagem ou
definida pelo programador.

※ Por exemplo, para a classe Pessoa, que representa uma abstração de uma
pessoa, seus atributos poderiam ser os seguintes: nome (cadeia), idade
(inteiro), peso (real) e rg (cadeia). Consequentemente cada objeto do tipo
Pessoa teria estes atributos, cada um deles com um valor específico.

Introdução Linguagens de Programação 36


Classe OO
※ Método
※ Métodos definem os comportamentos dos objetos da classe, sendo equivalentes
às funções e/ou procedimentos do paradigma procedimental, mas diretamente
ligados a um objeto ou uma classe. Ou seja, são trechos de código modularizados
que executam uma ação com os atributos acessíveis ao seu contexto.

※ Assim como no paradigma procedimental, além dos métodos poderem ter suas
próprias variáveis locais, estes também podem acessar as variáveis globais, que
no caso da orientação a objetos são os atributos da classe ou da sua instância
em questão. Estes também podem receber ou não parâmetros, e podem retornar
um valor a quem o chamou (similar a uma função) ou apenas executar alguma
ação com os atributos acessíveis a ele (similar a um procedimento).

Introdução Linguagens de Programação 37


Classe OO
※ Construtores
※ Construtores de instâncias, ou simplesmente construtores, são
métodos chamados automaticamente quando ocorre uma
instanciação de uma classe, ou seja, quando um objeto é criado. Estes
realizam as ações necessárias para a inicialização correta do objeto,
como por exemplo, atribuir valores aos atributos de controle interno
do objeto, para que então este possa ser usado corretamente .
※ O método construtor deve ter o mesmo nome da classe e não deve ter
tipo de retorno, nem mesmo void. Um construtor que não tem
parâmetros é chamado de construtor default.

Introdução Linguagens de Programação 38


Classe OO
※ Destrutores
※ métodos destrutores, que são executados automaticamente quando o
escopo em que os objetos estão definidos é finalizado (i.e., quando
uma instância de uma classe não pode ser mais referenciada, ela é
removida da memória pelo mecanismo de coleta automática de lixo,
também denominado Garbage Collector. Contudo, quando seu objeto
utiliza recursos não gerenciáveis automaticamente, como arquivos,
conexões de rede, etc. é necessário usar o destrutor para liberar esses
recursos). Seu principal objetivo é a liberação de recursos alocados
pelo objeto que será destruído (liberar arquivos, sockets, conexões
com banco de dados, etc).
Introdução Linguagens de Programação 39
Classe OO
※ Objeto
※ Um objeto ou instância é uma materialização da classe, e
pode ser usado para armazenar dados e realizar as operações
definidas na classe. Na grande maioria das linguagens
orientadas a objetos mais recentes, como Java e C# , a
instanciação de um objeto é feita quando o operador new é
seguido da chamada de algum método construtor. Para que os
objetos ou instâncias possam ser manipulados, é necessária a
criar uma instância da classe, que é basicamente criar
variáveis do tipo da classe.
Introdução Linguagens de Programação 40
Classe OO
※ Encapsulamento
※ Encapsulamento permite que detalhes complicados da
implementação da classe (regras de negócio, atributos para
controle interno, métodos, etc.) sejam escondidos de quem os
usa, sendo que estes apenas interagem com o que precisam
através de interfaces, permitindo assim ocultar do usuário
toda a parte que é irrelevante para este .
※ A ideia do encapsulamento é tornar o software mais flexível,
fácil de modificar e de criar novas implementações

Introdução Linguagens de Programação 41


Classe OO
※ Herança
※ O conceito de herança é construído sobre a ideia de que algumas
classes estão intimamente ligadas a outras classes, e que por conta
disso, compartilham características em comum (i.e., atributos,
métodos, comportamentos, etc.).
※ Partindo dessa ideia, podemos estabelecer um relacionamento
hierárquico entre classes, em que a classe no topo da árvore é a classe
mais genérica (geralmente chamada de classe base, ou classe mãe) e à
medida que descemos de nível na hierarquia, temos uma nova classe
(classe derivada, ou classe filha), que é uma especialização da classe
acima. .
Introdução Linguagens de Programação 42
Classe OO
※ Polimorfismo
※ A palavra polimorfismo vem do grego, πολύς (poli) que significa muitas e
μορφή (morphos) que significa formas, ou seja, muitas formas.
※ Em programação, é dito que um objeto é polimórfico quando o sistema de
tipo da linguagem atribui mais de um tipo a este .
※ Linguagens tipadas convencionais, como Pascal, baseiam-se na ideia de
que funções e procedimentos e, consequentemente, seus parâmetros, têm
um tipo único. Tais linguagens são ditas monomórficas, no sentido de que
cada variável pode ser interpretada como sendo de um tipo. Linguagens
de programação monomórficas contrastam com as linguagens
polimórficas em que algumas variáveis podem ter mais de um tipo .

Introdução Linguagens de Programação 43


Classe OO
※ Polimorfismo
※ mesmo nas linguagens de programação mais convencionais há
um certo grau de polimorfismo. Em muitas linguagens, por
exemplo, o operador de soma (+), aceita tanto soma entre
números inteiros (int x int -> int), quanto soma entre números
reais (float x float -> float), e em algumas linguagens ainda,
age como concatenador de strings (string x string -> string).
Sendo assim, podemos dizer que operador de soma é
polimórfico, pois possui mais de um tipo, e assume um deles de
acordo com o contexto.
Introdução Linguagens de Programação 44
Exercicio

1) Pesquise o que é Backus-Naur Form (BNF) para


linguagens imperativas e traga exemplos da mesma e a
fonte (autor e local) de onde pesquisou
2) Traga exemplos dos 4 tipos de polimorfirmos existente
https://leandromoh.gitbooks.io/tcc-paradigmas-de-
programacao/4_paradigma_orientado_a_objetos/
47_interface.html
Introdução Linguagens de Programação 45

Você também pode gostar