Conforme a Oracle Corporation introduziu alguns construtos funcionais no Java SE 8, hoje em dia a maioria dos entrevistadores está interessada em fazer perguntas sobre Programação Funcional. Como desenvolvedor Java/Groovy/Scala ou qualquer desenvolvedor de Programação Funcional, devemos aprender as seguintes perguntas e respostas para passar em entrevistas:
- O que é Programação Funcional?
- Quais são os “Prós e Contras” da Programação Funcional?
- Quais são as diferenças entre Programação Funcional e Programação Imperativa?
- Quais são as diferenças entre Programação Funcional e Programação Orientada a Objetos?
- Quais são as diferenças entre Programação Funcional, Programação Imperativa (IP) e Programação Orientada a Objetos?
- Quais são as principais vantagens da Programação Funcional em relação à Programação Imperativa ou Programação Orientada a Objetos?
- Quando usar Programação Funcional?
- Quando usar Programação Orientada a Objetos?
- Quais são as desvantagens da OOP?
- Quais são as desvantagens da OOP-Herança?
… E Mais
Neste post, vamos discutir sobre os seguintes três paradigmas de programação populares um por um e também responder às perguntas acima:
- Programação Funcional (FP)
- Programação Imperativa (IP)
- Programação Orientada a Objetos (OOP)
O que é Programação Funcional?
Em termos simples, a Programação Funcional (FP) é um dos paradigmas de programação populares, que realiza computações como Funções Matemáticas sem Alterar o Estado e Mutar Dados. Na Programação Funcional, as Funções são candidatas de primeira classe. Escrevemos programas definindo um conjunto de Funções e Dados Imutáveis. Exemplos de Linguagens de FP:- Scala, Haskell, Earlang etc são linguagens de FP populares. O Java SE 8 também possui alguns Conceitos Funcionais (Consulte as postagens sobre o Java 8 para mais detalhes)
Quais são as Características da FP?
Linguagens de Programação Funcional como Scala têm as seguintes Características.
- 1. Estado não existe.
Programas de FP não contêm estado. Isso significa que todos os Dados são Dados Imutáveis e Funções não podem alterar o estado.
2. Baixa importância da Ordem de Execução
Nas Linguagens de FP, escrevemos programas com um conjunto de Funções Independentes. Funções contêm um conjunto de declarações. Em FP, a ordem de execução dessas Funções não tem muita importância porque elas não têm estado e todas as Funções funcionam de forma independente. Mesmo se mudarmos a ordem de execução, ainda assim produzem os mesmos resultados.
3. Modelo de Programação sem Estado
Todos os programas de FP usam dados e funções imutáveis, que não podem modificar esses dados. Isso significa que as Linguagens de FP suportam o Modelo de Programação sem Estado.
4. Funções são cidadãos de primeira classe
Nas Linguagens de FP, Funções são objetos de primeira classe. Funções são unidades independentes, podemos executá-las em qualquer ordem.
5. Unidades Primárias de Manipulação
Nas Linguagens de FP, as unidades primárias de manipulação são Funções e Estruturas de Dados, porque todos os programas são feitos usando essas unidades.
6. Programação Modular
Nas Linguagens de FP, precisamos escrever unidades menores e independentes, chamadas de Funções Puras, para suportar o modelo de programação sem estado. Isso significa que FP suporta melhor a Modularidade do que OOP.
7. Funções de Alta Ordem e Avaliação Preguiçosa
As Linguagens de Programação Funcional devem suportar funções de alta ordem e recursos de Avaliação Preguiçosa.
8. Controles de Fluxo Primários
As Linguagens de FP não usam Controles de Fluxo como For…Loop, Do…While Loop, While…Loop, etc., e também não usam declarações condicionais como If…Else ou Switch Statements. Todas as Linguagens de FP escrevem programas usando as seguintes coisas:
- Funções
- Funções chamadas
- Chamadas de funções com Recursão
- Abstração, Encapsulamento, Herança e Polimorfismo
Assim como a OOP, as linguagens de programação funcional suportam todos os 4 conceitos: Abstração, Encapsulamento, Herança e Polimorfismo. As linguagens de programação funcional suportam Herança com Tipos de Classes ou Implicits. Elas suportam Polimorfismo com a ajuda de Genéricos. Também é conhecido como Polimorfismo Paramétrico.
Qual é o foco principal da FP?
Ao contrário das linguagens de programação orientada a objetos, todos os programas em linguagens de programação funcional se concentram principalmente em “O que está sendo feito” ou “O que deve ser feito”. Eles se concentram principalmente nas seguintes coisas:
- Que informações são desejadas, ou seja, Entradas.
- Quais transformações são necessárias, ou seja, Lógica Real.
Isso significa que a FP está principalmente focada em “O que deve ser feito”. Não se concentra muito em “Como deve ser feito”. Por isso, podemos escrever Programação Funcional como uma descrição do domínio do problema. É por isso que, não apenas os desenvolvedores, mas também outras pessoas podem entender facilmente o código FP. Agora vamos discutir sobre os “Prós e Contras” (Vantagens e Desvantagens) da Programação Funcional.
Vantagens da Programação Funcional?
As Linguagens de Programação Funcional têm as seguintes vantagens ou benefícios:
- Código Livre de Bugs
Como as Linguagens de Programação Funcional não suportam estado, elas não geram efeitos colaterais, o que significa que podemos escrever código livre de erros ou código livre de bugs ou código com menos propensão a erros.-
Programação Paralela Eficiente
Como as Linguagens de Programação Funcional não possuem estado mutável, elas não geram problemas de mudança de estado. Isso significa que elas usam apenas dados imutáveis. Elas usam Unidades Independentes para escrever programas, ou seja, “Funções”. Podemos escrever programação paralela ou concorrente muito eficiente porque elas são executadas independentemente sem alterar o estado.-
Melhor Desempenho
Como os programas de Programação Funcional são compostos por unidades independentes, eles podem ser executados em paralelo ou de forma concorrente. Por esse motivo, as aplicações de Programação Funcional ganham melhor desempenho.-
Melhor Encapsulamento
Ao contrário da Programação Orientada a Objetos, a Programação Funcional suporta melhor encapsulamento com Funções Puras. Funções puras significam sem efeitos colaterais.-
Suporta Funções Aninhadas
Funções Aninhadas significam compor funções dentro de outras funções para resolver problemas. A Programação Funcional suporta Funções Aninhadas.-
Aumento da Reutilização
Como os programas de Programação Funcional são compostos por Unidades Independentes, ou seja, “Funções”, podemos reutilizá-las com muita facilidade.-
Melhor Modularidade
Nas Linguagens de Programação Funcional, precisamos escrever unidades menores e independentes, chamadas de Funções Puras, para suportar o modelo de Programação sem Estado. Isso significa que a Programação Funcional suporta melhor modularidade do que a Programação Orientada a Objetos.-
Avaliação Preguiçosa Fácil
Nas Linguagens de Programação Funcional, é muito fácil escrever Avaliação Preguiçosa. Elas suportam Construções Funcionais Preguiçosas como Listas Preguiçosas, Mapas Preguiçosos, etc.-
Aumento da Legibilidade e Manutenibilidade
A Programação Funcional (FP) também melhora a Legibilidade e Manutenibilidade porque trabalham de forma independente e não alteram o estado.-
Aumento da Testabilidade
Como escrevemos nossos programas de Programação Funcional usando Unidades Independentes, ou seja, “Funções”, podemos testá-las unitariamente com muita facilidade.-
Suporta Abstração sobre Comportamento
Ao contrário da Programação Orientada a Objetos, a Programação Funcional suporta tanto “Abstração sobre Dados” quanto “Abstração sobre Comportamento”. Porque o mundo real contém ambos.-
Suporte para BigData
Como a Programação Funcional suporta programação paralela e melhor desempenho, ela é muito boa para desenvolver Aplicações de Big Data.-
Código Robusto e Confiável
Como a Programação Funcional usa Dados Imutáveis, podemos desenvolver facilmente Código Robusto e Confiável usando FP.
Desvantagens da Programação Funcional?
Além dos grandes benefícios, as linguagens de programação funcional também têm poucas ou mínimas desvantagens, que podem ser ignoradas. Elas possuem apenas os seguintes contras:
- Requer Muita Memória
A PF não possui estado. Ela sempre cria novos objetos para realizar ações em vez de modificar objetos existentes. Por causa disso, as aplicações de PF consomem muita memória. – Não se concentra na Substituição de Liskov
Quais são os principais conceitos da Programação Funcional?
Os seguintes conceitos são importantes e principais na Programação Funcional.
- Funções de Primeira Classe.
- Avaliação Preguiçosa.
- Funções de Alta Ordem.
- Imutabilidade (Dados Não Mutáveis).
- Modularidade.
- Sem Efeitos Colaterais.
- Avaliação Preguiçosa.
- Chamadas de Funções Recursivas.
O que é Programação Imperativa?
A Programação Imperativa (PI) é um dos Paradigmas de Programação populares que executa uma sequência de etapas/instruções/declarações em alguma ordem. Exemplos de Linguagens de PI: Java, C, C++ etc
Principais Características da Programação Imperativa?
Qualquer Linguagem de Programação Imperativa (PI) pode conter as seguintes Características:
- Sequência de Declarações.
- A ordem de execução das Declarações é muito importante.
- Elas contêm estado.
- Elas usam tanto Dados Imutáveis quanto Mutáveis.
- Elas podem alterar o estado.
- Elas podem ter Efeitos Colaterais.
- Modelo de Programação com Estado.
- Elas mudam diretamente o estado do Programa.
- Elas representam estado com Campos de Dados.
O que é Programação Orientada a Objetos?
A Programação Orientada a Objetos é outro tipo de Paradigma de Programação. Ela representa tudo como um Objeto. Cada Objeto contém Alguns Campos de Dados e Métodos. Todos os programas de POO contêm Estado. Eles usam Dados Mutáveis e Estruturas de Dados. Assim como na Programação Funcional, podemos escrever programas completos usando Dados Imutáveis, mas isso não é uma regra. A Programação Orientada a Objetos (POO) é um superconjunto da Programação Imperativa. Ela segue todas as características da PI com algumas características adicionais. Essas características adicionais são:
- Tudo é um Objeto.
- Cada Objeto contém Alguns Campos de Dados e Métodos.
- Conceitos de POO: Abstração, Encapsulamento, Herança e Polimorfismo
Ao contrário das Linguagens de Programação Funcional, as Linguagens de POO estão principalmente focadas em “Como fazer isso”. Isso significa que como desenvolvedor, nos concentramos em “Como você está fazendo”. Além disso, a POO combina tanto “O que você está fazendo” quanto “Como você está fazendo”. Por isso, não podemos escrever um código conciso e mais legível. Apenas os desenvolvedores podem entender o código, outras pessoas podem ficar mais confusas para entender o código da aplicação, elas não conseguem entendê-lo.
Desvantagens da Programação Orientada a Objetos (POO)?
Mesmo que a POO resolva muitos problemas em tempo real, ainda possui as seguintes desvantagens (quando comparada à Programação Funcional):
- Não oferece suporte à Reutilização completa.
- Não é totalmente Modular.
- Quebra o conceito de Encapsulamento.
- A Herança tem muitas desvantagens.
Principais Desvantagens da Herança:
- Quebra o princípio de Encapsulamento
- Quando os níveis de herança aumentam, é muito difícil e complicado manter e criar objetos.
Quando usar a Programação Funcional?
Deveríamos optar pela Programação Funcional (FP) nos seguintes cenários:
- Quando vamos realizar muitas operações diferentes em dados fixos.
- Em outras palavras, quando temos poucas coisas com mais operações.
Quando usar a Programação Orientada a Objetos?
Deveríamos optar pela Programação Orientada a Objetos (OOP) nos seguintes cenários:
- Quando vamos realizar poucas operações em muitas variantes diferentes que têm comportamento comum.
- Em outras palavras, quando temos mais coisas com poucas operações.
NOTA:- Aqui as Coisas são objetos do mundo real e operações são Ações do mundo real. Por exemplo, em Java representamos essas Coisas do mundo real como “Classes” e Ações do mundo real como Métodos (Operações).
Diferenças entre FP e OOP (IP)?
Functional Programming | OOP |
---|---|
Does not exist State | Exists State |
Uses Immutable data | Uses Mutable data |
It follows Declarative Programming Model | It follows Imperative Programming Model |
Stateless Programming Model | Stateful Programming Model |
Main Fcous on: “What you are doing” | Main focus on “How you are doing” |
Good for Parallel (Concurrency) Programming | Poor for Parallel (Concurrency) Programming |
Good for BigData processing and analysis | NOT Good for BigData processing and analysis |
Supports pure Encaspulation | It breaks Encaspulation concept |
Functions with No-Side Effects | Methods with Side Effects |
Functions are first-class citizens | Objects are first-class citizens |
Primary Manipulation Unit is “Function” | Primary Manipulation Unit is Objects(Instances of Classes) |
Flow Controls: Function calls, Function Calls with Recursion | Flow Controls: Loops, Conditional Statements |
It uses “Recursion” concept to iterate Collection Data. | It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java |
Order of execution is less importance. | Order of execution is must and very important. |
Supports both “Abstraction over Data” and “Abstraction over Behavior”. | Supports only “Abstraction over Data”. |
We use FP when we have few Things with more operations. | We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java. |
Isso é tudo sobre três Paradigmas de Programação populares. NOTA:- Eu sou basicamente de OOP, mas comecei a trabalhar com FP há apenas um ano. Então, se os Especialistas em Programação Funcional encontrarem algum erro neste post, por favor, forneçam-me seus valiosos comentários. Por favor, deixe um comentário se você gostou do meu post ou tiver alguma dúvida ou sugestão.