Estou programando em Java em um estilo muito orientado a objetos (OO). A POO é muito intuitiva para mim, mas tenho muito pouco conhecimento sobre outros tipos de programação.
O que exatamente é programação procedural ? Como exatamente é diferente do OOP? É a mesma coisa que programação funcional ?
Eu costumava pensar que toda programação que não “OO é procedural. Mas eu” estou começando a achar que isso não é “verdade.
Comentários
- Compartilhar sua pesquisa ajuda a todos. Conte-nos o que você ‘ tentamos e por que não atendeu às suas necessidades. Isso demonstra que você dedicou um tempo para tentar se ajudar, nos poupa de reiterar respostas óbvias e, acima de tudo, ajuda você a obter mais resposta específica e relevante. Consulte também Como perguntar
- Programação de procedimentos não é a mesma coisa que programação funcional; é ‘ s na verdade essencialmente a mesma coisa que a programação orientada a objetos, menos os objetos e classes.
- OOP imperativo na verdade é programação procedural, então é exatamente o que você ‘ está fazendo o tempo todo …
Resposta
A Wikipedia tem boas explicações para esses termos. Independentemente disso, aqui está o resumo:
- Programação imperativa modela a computação como uma sequência de instruções que alteram o estado mutável.
- Programação de procedimentos é uma programação imperativa que divide o código em sub-rotinas.
- Programação estruturada é uma abordagem mais disciplinada da programação procedural que proíbe saltos arbitrários (por exemplo, goto) e mudanças de estado global.
-
Programação declarativa é o oposto da programação imperativa – ela especifica o que calcular em vez de como (por exemplo, SQL, regexes).
-
Programa funcional ming modela a computação como expressões que (podem) produzir 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 mutação por completo (embora ao contrário da crença popular ainda tenha mecanismos para alcançar o lado efeitos).
- Programação funcional total proíbe ainda exceções e loops infinitos. (Uma função total em matemática é uma função que retorna um valor para todas as suas entradas.)
- Programação orientada a objetos enfatiza o uso de objetos / interfaces para obter abstração e modularidade.
Seus relacionamentos são um pouco complicados porque OOP é um termo bastante carregado. Você pode usar objetos em linguagens funcionais e linguagens procedurais, mas as linguagens 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
- Linguagens OOP mainstream não fazem menção aos ADTs, fornecem suporte muito pobre para eles e tout objetos como o único caminho verdadeiro.
- Ninguém diz Programação orientada a tipo 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 programação funcional e 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ção.
Além disso, as pessoas geralmente usam imperativo / procedural como sinônimos, às vezes contrastando-o com OOP (implicando em código sem abstração, geralmente C) e às vezes contrastando-o com a programação funcional.O termo programação estruturada quase caiu em desuso, tanto quanto eu posso dizer (provavelmente porque neste ponto a maioria das pessoas tem como certo que goto e globais são considerados prejudiciais).
Comentários
- ” proíbe saltos ” é bastante genérico; isso inclui se / enquanto / etc. talvez ” proíba saltos arbitrários “?
- @Izkata Bom argumento, alterado.
- Pode valer a pena vincular às entradas da Wikipédia.
- E isso ‘ é por que ‘ s chamados Objeto ” Orientado ” e não somente objeto.
- @OrangeDog Como é isso qualquer diferente de um tipo de dados abstrato, que também define um conjunto encapsulado de dados e funções que podem atuar sobre ele? Além disso, você pode ter objetos imutáveis, então, nesse caso, qual estado ?
Resposta
A Programação de Procedimentos é uma abordagem de programação que é um dos blocos básicos de construção para muitos outros designs de linguagem (funcional, não sendo um).
A maioria das linguagens se enquadra no conjunto de “Programação de Procedimentos” e é provavelmente a abordagem de design mais natural para a maioria das pessoas (se você pensar em termos de OO, então eu diria que você está em uma minoria).
BASIC é procedural.
Como outros já disseram, é um mecanismo para estruturar programas de maneira sequencial.
- Primeiro, eu faço x
- Segundo, eu faço y
- 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 de zero a muitos parâmetros e, opcionalmente, retornar um valor (que seria então geralmente chamado de função – provavelmente levando à sua confusão com linguagens funcionais)
O para digm não dita quais serão as coisas que você fará ou a maneira como as coisas serão transmitidas.
Ele simplesmente descreve que o programa será estruturado como uma série de procedimentos (ou funções) que operam em de forma sequencial. 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 agem sobre esses dados.
Uma maneira de pensar sobre isso é em termos de escopo de dados.
Em uma linguagem procedural, o escopo é bastante simples. Uma variável pode estar no escopo de um determinado procedimento (declarado localmente), até o nível do item principal de chamada (declarado globalmente), com escopos aninhados entre eles.
Em uma linguagem orientada a objetos, você adicione um novo contexto de escopo, sendo o do objeto atualmente em uso, que é ortogonal ao anterior.
Outra maneira de pensar em procedural, em comparação com orientado a objetos, é considerar uma linguagem orientada a objetos onde todos os métodos devem ser declarados como estáticos. O resultado é uma linguagem procedural em que as classes podem ser usadas para agrupar procedimentos.
Resposta
Programação de procedimentos definitivamente não é programação funcional.
Programação de procedimentos é quando você tem um modelo do computador como uma máquina em sua cabeça e está pensando em como isso “s modificando dados na memória. Então, primeiro você define A
para o valor 3, depois adiciona 1 e armazena isso no local da memória A
novamente (substituindo o valor anterior) .
A programação funcional diria que A
é 3 e B
é A + 1
e, em seguida, deixando o computador descobrir como calcular B
. Depois de definir A
, ele deve ser imutável (não muda). Funcional também permite que você faça coisas como passar uma função como um primeiro valor de classe (uma função pode ter uma função como argumento).
A programação orientada a objetos geralmente combina os dois e é ortogonal a ambos. Você pode usar a programação funcional e retornar um objeto imutável, e isso O objeto pode ter um método que retorna algum valor calculado, e até mesmo fazer isso preguiçosamente – essa é a programação funcional orientada a objetos. Você também pode ter um objeto que representa um “repositório” (versão abstrata de um banco de dados), e você pode “salvar” coisas no repositório e “pegar” coisas de volta, e deixar esse objeto lidar com todos os detalhes de como isso ” está feito. Basicamente, é programação procedural orientada a objetos.
Resposta
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 C # / Java tendem a “fazer algo” e preferem métodos como:
void doThisAndThat(....) { ... do something ... }
Portanto, um programa que consiste em um monte de métodos void (anteriormente conhecidos como procedimentos (sic!)) e códigos como:
doThis(); if (state is that) doSomethingElse(); doThat();
é a programação procedural perfeita.
Comentários
- doThisAndThat (….) implica que um método fará mais de uma coisa que, em geral, não é uma boa prática. Os desenvolvedores Java e C # geralmente aderem ao Princípio de Responsabilidade Única. Acho que sua analogia é falha. objectmentor.com/resources/articles/srp.pdf
- @JohnK Sei que não é uma boa prática. Ainda um comum. Especialmente entre os desenvolvedores Java, se alguém puder julgar pelo que vemos todos os dias no SO.
- @JohnK Os desenvolvedores Java e C # aderem principalmente ao Princípio de Responsabilidade Única – Atenciosamente?
- Os desenvolvedores Java aderem principalmente à responsabilidade única? Se isso fosse verdade na vida real …