FP e OO ortogonais?

13

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?

letronje
fonte
5
A orientação a objetos não requer objetos para manipular seu estado. Os métodos podem retornar novos objetos como resultados. O fato de alguém poder modificar, e frequentemente modifica, o estado de um objeto não significa que ele precisa ou que é uma boa ideia. OO e FP não são opostos.
Huperniketes
4
Duplicar no stackoverflow: FP e OO ortogonais?
sepp2k

Respostas:

22

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 .

Frank Shearar
fonte
+1, ótima resposta. Sua resposta está errada nas classes Typk de Haskell.
missingfaktor
Com certeza. Eu apenas comecei a aprender Haskell.
Frank Shearar
Gostaria de saber se há alguma gravação dessa apresentação dos Objetos Funcionais ... Estou realmente interessado, mas os slides por si só não fazem justiça.
Rei Miyasaka
9

Primeiro de tudo, o que significa 2 conceitos serem ortogonais?

Isso significa que os dois conceitos não têm idéias contrastantes ou não são incompatíveis entre si.

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. Como isso afeta sua ortogonalidade?

Uma linguagem como Scala facilita a execução de OO e FP, isso afeta a ortogonalidade dos 2 métodos?

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 .

desaparecido
fonte
1
"Isso significa que os dois conceitos não têm idéias contrastantes ou não são incompatíveis entre si". - Isso é verdade, mas acho que diria algo como " distinto, mas não incompatível". Por exemplo, se um fosse um subconjunto do outro, eles não seriam incompatíveis, mas também não seriam ortogonais.
Tim Goodman
@ Tim: Essa foi a minha tentativa [talvez falhada] de definir o termo. Eu não sou um guru inglês, você vê. : - |
missingfaktor
7

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.

Nota para pensar em um nome
fonte
2
"Independente" é uma boa maneira de colocá-lo. Não é que eles sejam opostos, mas se o seu código é um estilo de programação funcional ou um estilo de programação orientado a objetos são duas coisas distintas. Pense neles como os eixos xey em um gráfico - você pode subir e descer um enquanto permanece fixo no outro. (No sentido matemático, um vector na direcção x e um vector na direcção y são literalmente ortogonal - a definição está relacionada com CS.)
Tim Goodman
@ TimGoodman: Gostei muito do eixo x, y na analogia gráfica que você criou. Isso pode ser mapeado para resultado final alcançado quando um movimento em uma direção vs outro (quero dizer, em última análise, tanto objetivo paradigma de programação é ter código mais fácil e sustentável, não é?)
rahulaga_dev
0

* 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.

Torre
fonte