Programação Funcional vs. OOP [closed]

91

Eu já ouvi muitas conversas sobre o uso de linguagens funcionais como o Haskell. Quais são algumas das grandes diferenças, prós e contras da programação funcional versus programação orientada a objetos?

    
por GSto 05.10.2010 / 21:02
fonte

5 respostas

66

Eu diria que é mais Programação Funcional vs Programação Imperativa .

A maior diferença é que a programação imperativa é sobre fluxo de controle enquanto a programação funcional é sobre fluxo de dados . Outra maneira de dizer é que a programação funcional usa apenas expressões enquanto na programação imperativa são usadas expressões e declarações .

Por exemplo, em variáveis de programação imperativas e loops são comuns ao lidar com estado, enquanto na programação funcional o estado é tratado via passagem de parâmetros, o que evita efeitos colaterais e atribuições.

Pseudo-código imperativo para uma função para calcular a soma de uma lista (a soma é mantida em uma variável):

int sumList(List<int> list) {
    int sum = 0;
    for(int n = 0; n < list.size(); n++) {
        sum = sum + list.get(n);
    }

    return sum;
}

Pseudo-código funcional para a mesma função (a soma é passada como um parâmetro):

fun sumList([], sum) = sum
 |  sumList(v::lst, sum) = sumList(lst, v+sum)

Eu recomendo a apresentação Taming Effects com programação funcional Simon Peyton -Jones para uma boa introdução aos conceitos funcionais.

    
por 05.10.2010 / 23:19
fonte
15

A programação funcional é baseada em um modelo declarativo e tem suas raízes no cálculo lambda. Ele oferece muitos ótimos conceitos que podem ser emprestados de linguagens mais imperativas, como C ++ e C #.

Alguns exemplos incluem transparência referencial, funções lambda, funções de primeira classe, avaliação preguiçosa e ansiosa e imutabilidade.

Se nada mais, aprender programação funcional é útil para os conceitos que ela contém. Isso mudará a maneira como você faz programação e pensa sobre programação. E eu diria que no futuro a programação funcional será tão importante quanto a programação orientada a objetos.

Para começar, você pode optar por usar uma linguagem funcional pura, como Haskell, ou usar uma linguagem híbrida como F # .

A maioria das boas universidades irá cobrir a programação funcional e se você for para a escola eu sugiro que você faça o curso.

What are some of the big differences, pros and cons of functional programming vs. object-oriented programming?

A programação orientada a objetos é boa porque permite que você modele seu problema complexo em hierarquias para simplificar o problema. Mas torna-se muito difícil quando você começa a considerar a programação multi-thread enquanto usa objetos mutáveis. Nesses casos, você precisa usar o uso pesado de objetos de sincronização e é quase impossível aperfeiçoar um aplicativo grande.

É aí que entra a programação funcional. Por causa de coisas como imutabilidade, a programação funcional realmente simplifica os programas multi-thread. Isso torna quase trivialmente fácil paralelizar algo quando você sabe que, dada a entrada X para uma função, ela sempre produzirá Y. Além disso, você sabe que uma variável (ou valor na programação funcional) não pode mudar o uso médio de outro encadeamento. p>     

por 05.10.2010 / 21:17
fonte
8

(Esta resposta é adaptada de uma resposta a uma pergunta fechada em StackOverflow .)

Uma das grandes diferenças entre programação funcional e programação orientada a objetos é que cada um é melhor em um tipo diferente de evolução de software:

  • Linguagens orientadas a objetos são boas quando você tem um conjunto fixo de operações em coisas , e conforme seu código evolui, você adiciona principalmente coisas novas. Isso pode ser feito adicionando novas classes que implementam métodos existentes e as classes existentes são deixadas em paz.

  • Linguagens funcionais são boas quando você tem um conjunto fixo de coisas , e conforme seu código evolui, você adiciona principalmente operações em coisas existentes. Isso pode ser feito adicionando novas funções que computam com tipos de dados existentes e as funções existentes são deixadas em paz.

Quando a evolução segue o caminho errado, você tem problemas:

  • Adicionar uma nova operação a um programa orientado a objeto pode exigir a edição de muitas definições de classe para adicionar um novo método.

  • Adicionar um novo tipo de coisa a um programa funcional pode exigir a edição de muitas definições de função para adicionar um novo caso.

Esse problema é bem conhecido há muitos anos; em 1998, Phil Wadler apelidou-o de "problema de expressão" . Embora alguns pesquisadores pensem que o problema da expressão possa ser tratado com recursos de linguagem como mixins, uma solução amplamente aceita ainda não atingiu o mainstream.

    
por 28.08.2014 / 22:43
fonte
4

Não há contra real. Eles podem ser perfeitamente complementares. Existem linguagens FP, que suportam OOP. Mas as comunidades diferem na forma como lidam com a modularidade.

Usuários de linguagens FP tendem a obter modularidade por meio de leis matemáticas. E prefira provas para mostrar conformidade com suas leis.

No OOP imperativo, os usuários tendem a capturar o comportamento do objeto em casos de teste, que podem ser executados novamente se o objeto for alterado e atingir assim a modularidade.

É apenas um pequeno aspecto, mas acho que vale a pena mencionar.

    
por 22.04.2012 / 13:09
fonte
2

Uma analogia:

Você recebeu um pedido de emprego. Você preenche seu nome, informações de contato e histórico de trabalho. Quando terminar, você não terá mais um aplicativo em branco.

Agora imagine que, antes de escrever, você o cobre com uma folha de celofane transparente. Você escreve seu nome. Você adiciona outra folha de celofane. Você escreve suas informações de contato. Mais celofane. Você escreve seu histórico de trabalho. Quando você terminar, ainda terá o aplicativo em branco intocado. Você também tem três folhas de celofane, cada uma capturando o efeito de uma única e discreta mudança.

O primeiro (OOP) abraça a ideia de mudar as coisas enquanto o segundo (FP) o evita. Ambos são paradigmas de gerenciamento de estado. Ambos podem, usando estratégias diferentes, capturar o efeito de concluir um pedido de emprego. OOP altera o instrumento inicial diretamente, enquanto o FP sobrepõe o que veio antes para efetuar a mudança de aparência .

    
por 19.06.2014 / 20:16
fonte