Fui exposto principalmente à programação OO até agora e estou ansioso para aprender uma linguagem funcional. Minhas perguntas são:
- Quando você escolhe a programação funcional em vez de orientada a objetos?
- Quais são as definições típicas de problemas em que a programação funcional é uma escolha melhor?
oop
functional-programming
paradigms
Olivier Lalonde
fonte
fonte
Respostas:
Quando você antecipa um tipo diferente de evolução de software:
Linguagens orientadas a objeto são bons quando você tem um conjunto fixo de operações sobre as coisas , e como seus evolui de código, você adiciona principalmente coisas novas. Isso pode ser conseguido adicionando novas classes que implementam métodos existentes, e as classes existentes são deixadas em paz.
Os idiomas funcionais são bons quando você tem um conjunto fixo de coisas e, à medida que seu código evolui, você adiciona principalmente novas operações às coisas existentes. Isso pode ser conseguido 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 objetos 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ções para adicionar um novo caso.
Esse problema é bem conhecido há muitos anos; em 1998, Phil Wadler o chamou de "problema de expressão" . Embora alguns pesquisadores pensem que o problema da expressão pode ser resolvido com recursos de linguagem como mixins, uma solução amplamente aceita ainda não foi atingida.
Linguagens funcionais se destacam na manipulação de dados simbólicos em forma de árvore. Um exemplo favorito é de compiladores, onde os idiomas de origem e intermediários raramente mudam (principalmente as mesmas coisas ), mas os escritores do compilador estão sempre adicionando novas traduções e aprimoramentos ou otimizações de código (novas operações). Geralmente, compilação e tradução são "aplicativos matadores" para idiomas funcionais.
fonte
Você não precisa necessariamente escolher entre os dois paradigmas. Você pode escrever software com uma arquitetura OO usando muitos conceitos funcionais. FP e OOP são ortogonais por natureza .
Tome, por exemplo, C #. Você poderia dizer que é principalmente OOP, mas existem muitos conceitos e construções de FP. Se você considerar o Linq , as construções mais importantes que permitem a existência do Linq são funcionais por natureza: expressões lambda .
Outro exemplo, F #. Você poderia dizer que é principalmente FP, mas existem muitos conceitos e construções de OOP disponíveis. Você pode definir classes, classes abstratas, interfaces, lidar com herança. Você pode até usar a mutabilidade quando isso torna seu código mais claro ou quando aumenta drasticamente o desempenho.
Muitas línguas modernas são multiparadigma.
Leituras recomendadas
Como estou no mesmo barco (experiência OOP, aprendendo FP), sugiro algumas leituras que realmente apreciei:
Programação Funcional para o Desenvolvimento Diário do .NET , por Jeremy Miller. Um ótimo artigo (embora mal formatado) mostrando muitas técnicas e exemplos práticos do mundo real de FP em C #.
Programação Funcional do Mundo Real , de Tomas Petricek. Um ótimo livro que lida principalmente com conceitos de FP, tentando explicar o que são, quando devem ser usados. Existem muitos exemplos em F # e C #. Além disso, o blog de Petricek é uma ótima fonte de informação.
fonte
A Programação Orientada a Objetos oferece:
A programação funcional, em Haskell ou mesmo em Scala, pode permitir a substituição por meio de um mecanismo mais geral das classes de tipos. O estado interno mutável é desencorajado ou proibido. O encapsulamento da representação interna também pode ser alcançado. Veja Haskell vs OOP para uma boa comparação.
A afirmação de Norman de que "adicionar um novo tipo de coisa a um programa funcional pode exigir a edição de muitas definições de funções para adicionar um novo caso". depende de quão bem o código funcional empregou classes de tipo. Se a Correspondência de Padrões em um determinado Tipo de Dados Abstratos estiver espalhada por uma base de código, você realmente sofrerá com esse problema, mas talvez seja um projeto ruim para começar.
EDITED Removida referência a conversões implícitas ao discutir classes de tipos. No Scala, as classes de tipo são codificadas com parâmetros implícitos, não conversões, embora as conversões implícitas sejam outro meio de obter a substituição de tipos compatíveis.
fonte
Se você estiver em um ambiente altamente concorrente, a programação funcional pura será útil. A falta de estado mutável torna a concorrência quase trivial. Veja Erlang.
Em uma linguagem multiparadigm, você pode modelar algumas coisas funcionalmente se a existência de estado mutável for um detalhe de implementação e, portanto, FP é um bom modelo para o domínio do problema. Por exemplo, consulte as compreensões da lista em Python ou std.range na linguagem de programação D. Estes são inspirados pela programação funcional.
fonte