Eu ouvi isso várias vezes e estou tentando entender e validar a ideia de que FP e OO são ortogonais.
Primeiro de tudo, o que significa 2 conceitos serem ortogonais?
O FP incentiva ao máximo a imutabilidade e a pureza. e OO parece algo construído para estado e mutação (uma versão ligeiramente organizada da programação imperativa?). E percebo que os objetos podem ser imutáveis. Mas OO parece implicar estado / mudança para mim.
Eles parecem opostos. Isso significa que eles são ortogonais?
Uma linguagem como Scala facilita a execução de OO e FP, isso afeta a ortogonalidade dos 2 métodos?
Respostas:
O termo "ortogonal" vem de matemática, onde tem um sinônimo: "perpendicular". Nesse contexto, você pode entender como "as duas coisas não têm nada a ver uma com a outra".
Quando as pessoas comparam FP e OO, muitas vezes confundem dois eixos separados.
Por um lado, você tem programação funcional versus programação imperativa. Jonas faz uma boa comparação dos dois. A versão de uma frase diz que "fluxo de dados versus fluxo de controle".
O outro eixo é a abstração de dados. Idiomas como Haskell usam tipos de dados abstratos para, bem, abstrair dados. O Smalltalk usa objetos que fundem os dados e operações nesses dados em uma única unidade. William Cook explica melhor do que eu poderia em seu artigo Sobre a compreensão da abstração de dados, revisitado .
É perfeitamente compreensível que a maioria das pessoas acabe pensando que FP e OO são opostos: a maioria das linguagens OO é imperativa; portanto, se você comparar, digamos, Haskell e Java, terá fluxo de dados + ADT versus fluxo de controle + objeto. Mas existem outras possibilidades! Matthias Felleisen explica como se casar felizmente com FP e OO em sua palestra Functional Objects .
fonte
Isso significa que os dois conceitos não têm idéias contrastantes ou não são incompatíveis entre si.
OO é sobre encapsulamento, composição de objetos, abstração de dados, polimorfismo via subtipagem e mutação controlada quando necessário (a imutabilidade também é incentivada no OO). FP é sobre composição de funções, abstração de controle e polimorfismo restrito (também conhecido como polimorfismo paramétrico). Assim, as duas idéias não são contraditórias. Ambos fornecem diferentes tipos de poderes e mecanismos de abstração, que certamente são possíveis em um idioma. De fato, esta é a tese sobre a qual Scala foi construída!
Em sua palestra sobre o Scala Experiment no Google, Martin Odersky explica muito bem como ele acredita que os dois conceitos - OO e FP - são ortogonais entre si e como Scala unifica os dois paradigmas de maneira elegante e contínua em um novo paradigma popularmente conhecido na comunidade Scala como paradigma objeto-funcional. Deve assistir falar por você. :-)
Outros exemplos de linguagens funcionais de objetos: OCaml , F # , Nemerle .
fonte
Ortogonal significa aproximadamente "independente".
Portanto, se FP e OO são ortogonais, isso significa que você pode usar a imutabilidade, usando objetos ou não, e você pode usar objetos, sejam eles imutáveis ou não.
fonte
* Eu ouvi essa e outra vez e estou tentando entender e validar a ideia de que FP e OO são ortogonais. *
Primeiro de tudo, o que significa 2 conceitos serem ortogonais?
Citação da Wikipedia: "A ortogonalidade garante que a modificação do efeito técnico produzido por um componente de um sistema não crie nem propague efeitos colaterais para outros componentes do sistema".
Simplesmente, significa apenas que a alteração em um sistema não afeta e não pode afetar uma alteração no outro sistema.
Por exemplo, um carro possui componentes e controles ortogonais (por exemplo, acelerar o veículo não influencia em nada além dos componentes envolvidos exclusivamente com a função de aceleração. Não afeta o rádio, por exemplo (embora eu não tenha certeza se isso afeta a reprodução do CD, já que o meu pula algumas vezes)).
O FP incentiva ao máximo a imutabilidade e a pureza. e OO parece algo construído para estado e mutação (uma versão ligeiramente organizada da programação imperativa?). E percebo que os objetos podem ser imutáveis. Mas OO parece implicar estado / mudança para mim.
Eles parecem opostos. Isso significa que eles são ortogonais?
Meio. O problema é que nenhum desses conceitos é realmente bem definido. Mas sim, você entendeu.
fonte