Comparar Programação Funcional, Programação Imperativa e Programação Orientada a Objetos

Como a Oracle Corporation introduziu alguns construtos funcionais no Java SE 8, hoje em dia a maioria dos entrevistadores estão interessados em fazer algumas perguntas sobre Programação Funcional. Como um desenvolvedor Java/Groovy/Scala ou qualquer desenvolvedor de Programação Funcional, devemos aprender as seguintes perguntas e respostas para passar nas entrevistas:

  1. O que é Programação Funcional?
  2. Quais são os “Prós e Contras” da Programação Funcional?
  3. Quais são as diferenças entre Programação Funcional e Programação Imperativa?
  4. Quais são as diferenças entre Programação Funcional e Programação Orientada a Objetos?
  5. Quais são as diferenças entre Programação Funcional, Programação Imperativa (IP) e Programação Orientada a Objetos?
  6. Quais são as principais vantagens da Programação Funcional sobre Programação Imperativa ou Programação Orientada a Objetos?
  7. Quando usar Programação Funcional?
  8. Quando usar Programação Orientada a Objetos?
  9. Quais são as desvantagens de POO?
  10. Quais são as desvantagens da POO-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:

  1. Programação Funcional (FP)
  2. Programação Imperativa (IP)
  3. 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 FP:- Scala, Haskell, Earlang etc são linguagens FP populares. O Java SE 8 também possui algumas Construções Funcionais (Consulte as postagens sobre Java 8 para mais detalhes)

Quais são as Características da FP?

Linguagens de Programação Funcional como Scala possuem as seguintes Características.

  1. O estado não existe.
    Os programas de FP não contêm estado. Isso significa que todos os dados são dados imutáveis e as funções não podem alterar o estado.2.
    Baixa importância da Ordem de Execução
    Em linguagens de FP, escrevemos programas com um conjunto de funções independentes. As funções contêm um conjunto de instruçõ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 independentemente. Mesmo se alterarmos a ordem de execução, ainda 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 um Modelo de Programação Sem Estado.4.
    As Funções são cidadãos de primeira classe
    Em linguagens de FP, as funções são objetos de primeira classe. As funções são unidades independentes, podemos executá-las em qualquer ordem.5.
    Unidades Principais de Manipulação
    Em linguagens de FP, as unidades principais 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
    Em 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 uma modularidade melhor do que OOP.7.
    Funções de Ordem Superior e Avaliação Preguiçosa
    As linguagens de programação funcional devem suportar funções de ordem superior e recursos de avaliação preguiçosa.8.
    Controles Principais de Fluxo
    Linguagens de FP não usam controles de fluxo como loops For, Do…While, While…Loop, etc., e também não usam declarações condicionais como If…Else ou Switch. Todas as linguagens de FP escrevem programas usando as seguintes coisas:
  • Funções
  • Funções chamadas
  • Chamadas de Funções com Recursão
  1. Abstração, Encapsulamento, Herança e Polimorfismo
    Assim como OOP, as linguagens de FP suportam todos os 4 conceitos: Abstração, Encapsulamento, Herança e Polimorfismo. As linguagens de FP suportam Herança com Classes de Tipos ou Implícitas. Elas suportam Polimorfismo com a ajuda de Genéricos. Também é conhecido como Polimorfismo Paramétrico.

Qual é o foco principal do FP?

Ao contrário das linguagens de OOP, todos os programas de linguagens de FP se concentram principalmente em “O que você está fazendo” 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 o FP está principalmente focado em “O que deve ser feito”. Não se concentra muito em “Como deve ser feito”. É por isso que podemos escrever Programação Funcional como uma descrição do Domínio do Problema. Por isso, não apenas os desenvolvedores, mas também outras pessoas podem entender o código FP muito facilmente. 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 FP 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 FP não têm estado mutável, elas não geram problemas de mudança de estado. Isso significa que elas usam apenas dados imutáveis. Elas utilizam Unidades Independentes para escrever programas, que são “Funções”. Podemos escrever Programação Paralela ou Concorrente muito eficiente porque elas são executadas de forma independente sem alterar o estado.- Melhor Desempenho
    Como os programas FP são compostos por todas as unidades independentes, eles podem ser executados Paralela ou Concorrentemente. Por esse motivo, as aplicações FP ganham melhor desempenho.- Melhor Encapsulamento
    Ao contrário da OOP, FP 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. FP suporta Funções Aninhadas.- Aumenta a Reutilização
    Como os programas FP são compostos por Unidades Independentes, que são “Funções”, podemos reutilizá-las facilmente.- Melhor Modularidade
    Nas linguagens FP, precisamos escrever unidades menores e independentes, chamadas Funções Puras, para suportar o modelo de Programação Sem Estado. Isso significa que FP suporta melhor Modularidade do que OOP.- Fácil Avaliação Preguiçosa
    Nas linguagens FP, é muito fácil escrever Avaliação Preguiçosa. Elas suportam Construções Funcionais Preguiçosas como Listas Preguiçosas, Mapas Preguiçosos, etc.- Aumenta a Legibilidade e Manutenibilidade
    A Programação Funcional (FP) também melhora a Legibilidade e Manutenibilidade porque elas funcionam de forma independente e não alteram o estado.- Aumenta a Testabilidade
    Como escrevemos nossos programas FP usando Unidades Independentes, que são “Funções”, podemos testá-las de forma muito fácil.- Suporta Abstração sobre Comportamento
    Ao contrário da OOP, FP suporta tanto “Abstração sobre Dados” quanto “Abstração sobre Comportamento”. Porque o mundo real contém ambos.- Suporte para BigData
    Como FP suporta programação paralela e melhor desempenho, FP é muito bom para desenvolver Aplicações BigData.- Código Robusto e Confiável
    Como FP 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 muito poucas ou mínimas desvantagens, que podem ser ignoradas. Elas têm apenas os seguintes contras:

  • Requer Muita MemóriaA PF não tem estado. Ela sempre cria novos objetos para realizar ações em vez de modificar objetos existentes. Por causa disso, 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 Ordem Superior.
  • Imutabilidade (Dados Não Mutáveis).
  • Modularidade.
  • Sem Efeitos Colaterais.
  • Avaliação Preguiçosa.
  • Chamadas de Função Recursivas.

O que é Programação Imperativa?

A Programação Imperativa (PI) é um dos Paradigmas de Programação populares que executa uma sequência de passos/instruções/afirmaçõ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 Afirmações.
  • A ordem de execução das Afirmaçõ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 alteram diretamente o estado do Programa.
  • Elas representam o 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. Representa tudo como um Objeto. Cada Objeto contém Alguns Campos de Dados e Métodos. Todos os Programas de OOP contêm Estado. Eles usam Dados Mutáveis e Estruturas de Dados. Assim como FP, podemos escrever programas completos usando Dados Imutáveis, mas isso não impõe essa regra. A Programação Orientada a Objetos (OOP) é um superconjunto da Programação Imperativa. Segue todas as características da IP com algumas funcionalidades extras. Essas funcionalidades extras são:

  • Tudo é um Objeto.
  • Cada Objeto contém Alguns Campos de Dados e Métodos.
  • Conceitos de OOP: Abstração, Encapsulamento, Herança e Polimorfismo

Ao contrário das Linguagens de Programação Funcional, as Linguagens de OOP estão principalmente focadas em “Como fazer isso”. Isso significa que, como Desenvolvedor, nos concentramos em “Como você está fazendo”. Além disso, OOP combina tanto “O que você está fazendo” quanto “Como você está fazendo”. É por isso que 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 do aplicativo, elas não podem compreendê-lo.

Desvantagens da Programação Orientada a Objetos (OOP)?

Mesmo que a OOP resolva muitos problemas em tempo real, ainda possui as seguintes desvantagens (quando comparada à FP):

  • Não suporta 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 Programação Funcional?

Devemos optar pela Programação Funcional (PF) nos seguintes cenários:

  • Quando vamos realizar muitas operações diferentes em dados que são fixos.
  • Em outras palavras, quando temos poucas coisas com mais operações.

Quando usar Programação Orientada a Objetos?

Devemos optar pela Programação Orientada a Objetos (POO) 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 as 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. Portanto, se especialistas em Programação Funcional encontrarem algum erro neste post, por favor me forneçam seus valiosos inputs. Por favor, deixe um comentário se você gostou do meu post ou tiver alguma dúvida ou sugestão.

Source:
https://www.digitalocean.com/community/tutorials/functional-imperative-object-oriented-programming-comparison