O que exatamente é a programação processual? Como exatamente é diferente de OOP? É o mesmo que programação funcional?

32

Estou programando em Java em um estilo muito orientado a objetos (OO). OOP é muito intuitivo para mim, mas tenho muito pouco conhecimento sobre outros tipos de programação.

O que exatamente é a programação processual ? Como exatamente é diferente de OOP? É a mesma coisa que programação funcional ?

Eu costumava pensar que toda a programação que não é OO é procedural. Mas estou começando a pensar que isso não é verdade.

Aviv Cohn
fonte
9
Compartilhar sua pesquisa ajuda a todos. Conte-nos o que você tentou e por que ele não atendeu às suas necessidades. Isso demonstra que você reservou um tempo para tentar ajudar a si mesmo, evita reiterar respostas óbvias e, acima de tudo, ajuda a obter uma resposta mais específica e relevante. Veja também How to Ask
gnat
2
Programação procedural não é a mesma coisa que programação funcional; na verdade, é essencialmente a mesma coisa que programação orientada a objetos, menos os objetos e as classes.
Mason Wheeler
1
OOP imperativo realmente é programação procedural, por isso é exatamente o que você está fazendo o tempo todo ...
Ingo

Respostas:

68

A Wikipedia tem boas explicações para esses termos. Independentemente disso, aqui está o resumo:


  • A programação declarativa é o oposto da programação imperativa - especifica o que calcular e não como (por exemplo, SQL, expressões regulares).

  • A programação funcional modela a computação como expressões que (podem) produzem valores. Funções são valores e podem ser passadas ou retornadas de outras funções. A mutação é desencorajada; todas as variáveis ​​são imutáveis ​​por padrão. Como resultado, é mais declarativo do que imperativo, pois enfatiza o que está sendo calculado, em vez da sequência de mudanças de estado necessárias para alcançá-lo.

  • A programação puramente funcional não permite a mutação completamente (embora, contrariamente à crença popular, ainda tenha mecanismos para obter efeitos colaterais).
  • A programação funcional total proíbe adicionalmente exceções e loop infinito. (Uma função total em matemática é uma função que retorna um valor para todas as suas entradas.)

Seus relacionamentos são um pouco complicados porque POO é um termo bastante carregado. Você pode usar objetos nas linguagens funcionais e nas procedurais, mas os idiomas que se anunciam como OO são procedurais. Para confundir ainda mais o problema:

  • A maioria das pessoas não sabe a diferença entre um objeto e um tipo de dados abstrato
  • As principais linguagens de POO não mencionam ADTs, fornecem muito pouco suporte a elas e apontam objetos como The One True Way.
  • Ninguém diz Programação Orientada a Tipos de Dados Abstratos (porque seria uma coisa boba de se fazer; você precisa de ADTs e objetos.)

Isso faz com que as pessoas pensem que OOP é a única maneira de obter abstração, e que a programação funcional e o OOP são de alguma forma opostos ou mutuamente exclusivos. Muitas pessoas também pensam que todas as linguagens funcionais são puras e não permitem mutações.

Além disso, as pessoas geralmente discutem o imperativo / o procedimento de maneira intercambiável, às vezes contrastando com OOP (implicando código sem abstração, geralmente C) e às vezes contrastando com programação funcional. O termo programação estruturada caiu em desuso, até onde posso perceber (provavelmente porque, neste momento, a maioria das pessoas tem como certo que goto e globals são considerados prejudiciais).

Doval
fonte
3
"proíbe saltos" é bastante genérico; que inclui if / while / etc .. talvez "proíba saltos arbitrários"?
Izkata 27/02
@ Izkata Bom ponto, mudou.
Doval 27/02
1
Pode valer a pena vincular as entradas da Wikipedia.
haylem 27/02
E é por isso que se chama Objeto "Orientado" e não Somente Objeto.
JeffO 27/02
1
@OrangeDog Como isso é diferente de um tipo de dado abstrato, que também define um conjunto encapsulado de dados e funções que podem atuar nele? Além disso, você pode ter objetos imutáveis; nesse caso, que estado ?
Doval
12

A programação processual é uma abordagem da programação que é um dos elementos básicos dos blocos de construção de muitos outros designs de linguagem (funcional não sendo um).

A maioria dos idiomas se enquadra no conjunto de "Programação Procedimental" e é provavelmente a abordagem de design mais natural para a maioria das pessoas (se você pensa em termos de OO, diria que é uma minoria).

BASIC é processual.

Como outros já disseram, é um mecanismo para estruturar programas de maneira seqüencial.

  • Primeiro eu faço x
  • Segundo eu faço
  • Em terceiro lugar eu faço Z

Requer um mecanismo para definir "procedimentos" - blocos de código nomeado semelhantes aos métodos OO, que podem aceitar zero a muitos parâmetros e, opcionalmente, retornar um valor (que geralmente seria chamado de função - provavelmente levando à sua confusão com linguagens funcionais). )

O paradigma não determina quais serão as coisas que você fará ou a maneira como as coisas estão sendo repassadas.

Simplesmente descreve que o programa será estruturado como uma série de procedimentos (ou funções) que operam de maneira seqüencial. Os dados são então definidos independentemente dos procedimentos.

Isso difere da programação orientada a objetos, que estrutura o programa em torno de coleções de dados e métodos (não funções) que atuam nesses dados.

Uma maneira de pensar sobre isso é em termos de escopo de dados.

Em uma linguagem processual, o escopo é bastante simples. Uma variável pode estar no escopo de um determinado procedimento (declarado localmente), até o nível da principal coisa que chama coisas (declaradas globalmente), com escopos aninhados entre.

Em uma linguagem orientada a objetos, você adiciona um novo contexto de escopo, sendo o objeto atualmente em uso, ortogonal ao acima.

Outra maneira de pensar em procedimentos, em comparação com orientada a objetos, é considerar uma linguagem orientada a objetos em que todos os métodos devem ser declarados como estáticos. O resultado é uma linguagem processual em que as classes podem ser usadas para agrupar procedimentos.

Rob Baillie
fonte
5

Programação procedural definitivamente não é programação funcional.

A programação processual é quando você tem um modelo do computador como uma máquina em sua cabeça e pensa em como está modificando os dados na memória. Então, primeiro defina Ao valor 3, adicione 1 e armazene-o no local da memória Anovamente (substituindo o valor anterior).

A programação funcional seria dizer que Aé 3 e Bé A + 1e, em seguida, deixar o computador descobrir como calcular B. Depois de definido A, deve ser imutável (sem alterações). O Functional também permite que você faça coisas como passar uma função como um valor de primeira classe (uma função pode assumir uma função como argumento).

A programação orientada a objetos geralmente combina os dois e é meio ortogonal a ambos. Você pode usar a programação funcional e retornar um objeto imutável, e esse objeto pode ter um método que retorna algum valor calculado e até mesmo o faz preguiçosamente - isso é programação orientada a objetos funcional. Você também pode ter um objeto que represente um "repositório" (versão abstrata de um banco de dados) e pode "salvar" itens no repositório e "obter" itens de volta e deixar que o objeto lide com todos os detalhes de como isso é feito. . Isso é basicamente programação procedural orientada a objetos.

Scott Whitlock
fonte
0

OOP nada mais é do que uma forma um pouco refinada de programação procedural, que novamente pertence à família maior de programação imperativa. A prova dessa afirmação é que muitos programadores de C # / Java tendem a "fazer alguma coisa" e preferem métodos como:

void doThisAndThat(....) { ... do something ... }

Portanto, um programa que consiste em vários métodos void (anteriormente conhecidos como procedimentos (sic!)) E códigos como:

doThis();
if (state is that) doSomethingElse();
doThat();

é uma programação processual perfeita.

Ingo
fonte
doThisAndThat (....) implica que um método fará mais de uma coisa que geralmente não é uma boa prática. Os desenvolvedores de Java e C # aderem principalmente ao Princípio de Responsabilidade Única. Eu acho que sua analogia é falha. objectmentor.com/resources/articles/srp.pdf
JohnK
@ JohnK Eu sei que não é uma boa prática. No entanto, um comum. Especialmente entre os desenvolvedores de Java, se é possível julgar pelo que se vê todos os dias no SO.
Ingo
Os desenvolvedores @JohnK Java e C # aderem principalmente ao serviço Single Responsability Princip - Lip?
Ingo
Os desenvolvedores de Java aderem principalmente à responsabilidade única? Se isso fosse verdade na vida real ...
Sridhar Sarnobat