Durante uma entrevista esta semana me perguntaram “qual é a diferença entre Programação Funcional, Orientada a Objetos e Procedural” e para ser honesto, eu realmente não sabia como responder a essa pergunta (e foi a primeira vez que ouvi falar sobre Programação Procedural…). Então hoje, decidi fazer alguma pesquisa e (tentar) entender quais são as principais diferenças.
Deixamos começar com algumas definições:
“. A programação funcional (FP) é um paradigma de programação – um estilo de construção da estrutura e elementos de programas de computador – que trata a computação como a avaliação de funções matemáticas e evita a mudança de estado e dados mutáveis”. – Wikipedia
“. A programação orientada a objetos (OOP) é um paradigma de programação baseado no conceito de “objetos”, que podem conter dados, na forma de campos, muitas vezes conhecidos como atributos; e código, na forma de procedimentos, muitas vezes conhecidos como métodos”. – Wikipedia
“. A programação processual é um paradigma de programação, derivado da programação estruturada, baseado no conceito de chamada de procedimento. Procedimentos, também conhecidos como rotinas, sub-rotinas ou funções, simplesmente contêm uma série de passos computacionais a serem executados”. – Wikipedia
Ok, então essa é uma introdução, mas vamos em um pouco mais de detalhes.
Primeiro, o que é um paradigma de programação? É um estilo de programação, uma forma de pensar sobre a construção de software. Um paradigma de programação não se refere a uma linguagem específica mas sim a uma forma de programar, a uma metodologia. Algumas linguagens facilitam a escrita em alguns paradigmas mas não em outros. Para mais detalhes, veja o artigo da Wikipedia.
Agora vamos mergulhar nos três paradigmas de programação que nos interessam hoje:
Procedimento de programação (PP), também conhecido como programação em linha tem uma abordagem de cima para baixo. Trata-se de escrever uma lista de instruções para dizer ao computador o que fazer passo a passo. Ele se baseia em procedimentos ou rotinas.
Object-oriented programming (OOP) é sobre encapsular dados e comportamento em objetos. Uma aplicação OOP utilizará uma coleção de objetos que sabe como executar certas ações e como interagir com outros elementos da aplicação. Por exemplo, um objeto pode ser uma pessoa. Essa pessoa teria um nome (que seria uma propriedade do objeto), e saberia como andar (que seria um método). Um método no OOP pode ser considerado como um procedimento no PP, mas aqui ele pertence a um objeto específico. Outro aspecto importante do OOP são as classes. Uma classe pode ser considerada como um plano para um objeto.
Programação funcional (FP) é sobre passar dados de função para função para obter um resultado. Em FP, funções são tratadas como dados, o que significa que você pode usá-las como parâmetros, retorná-las, construir funções de outras funções e construir funções personalizadas. As funções no FP têm que ser funções puras, elas devem evitar estado compartilhado, e os efeitos colaterais e os dados devem ser imutáveis. Uma função pura é uma função que dado o mesmo tipo de entrada retornará sempre a mesma saída, não depende de um estado local ou global. Um estado compartilhado é um estado que é compartilhado entre mais de uma função ou mais de uma estrutura de dados. Assim, com o estado compartilhado, para entender os efeitos de uma função, você precisa conhecer todos os detalhes de cada variável compartilhada. Ele adiciona muita complexidade e permite menos modularidade.