FP y OO ortogonal?

13

Lo he escuchado una y otra vez y estoy tratando de entender y validar la idea de que FP y OO son ortogonales.

En primer lugar, ¿qué significa que 2 conceptos sean ortogonales?

FP fomenta la inmutabilidad y la pureza tanto como sea posible. y OO parece algo construido para el estado y la mutación (¿una versión ligeramente organizada de programación imperativa?). Y me doy cuenta de que los objetos pueden ser inmutables. Pero OO parece implicar estado / cambio para mí.

Parecen opuestos. ¿Eso significa que son ortogonales?

Un lenguaje como Scala hace que sea fácil hacer OO y FP, ¿afecta esto a la ortogonalidad de los 2 métodos?

letronje
fuente
55
La orientación a objetos no requiere objetos para manipular su estado. Los métodos pueden devolver nuevos objetos como resultados. El hecho de que uno pueda, ya menudo lo hace, modificar el estado de un objeto no significa que tenga que hacerlo o que sea una buena idea. OO y FP no son opuestos.
Huperniketes
44
Duplicar en stackoverflow: ¿ FP y OO ortogonal?
sepp2k

Respuestas:

22

El término "ortogonal" proviene de las matemáticas, donde tiene un sinónimo: "perpendicular". En este contexto, se podría entender como "las dos cosas no tienen nada que ver entre sí".

Cuando las personas comparan FP y OO, a menudo confunden dos ejes separados.

Por un lado, tiene programación funcional versus programación imperativa. Jonas da una buena comparación de los dos. La versión de una oración dice que "flujo de datos versus flujo de control".

El otro eje es la abstracción de datos. Idiomas como Haskell usan tipos de datos abstractos para, bueno, datos abstractos. Smalltalk utiliza objetos, que fusionan los datos y las operaciones en esos datos en una sola unidad. William Cook explica mejor de lo que podría en su artículo Sobre la comprensión de la abstracción de datos, Revisited .

Es perfectamente comprensible que la mayoría de la gente termine pensando que FP y OO son opuestos: la mayoría de los lenguajes OO son imprescindibles, por lo que si compara, por ejemplo, Haskell y Java, tiene flujo de datos + ADT versus flujo de control + objeto. ¡Pero hay otras posibilidades! Matthias Felleisen explica cómo casarse felizmente con FP y OO en su charla Functional Objects .

Frank Shearar
fuente
+1, gran respuesta. Sin embargo, su respuesta se pierde en las clases de tipos de Haskell.
missingfaktor
Sin lugar a duda. Sólo he acaba de empezar realmente aprender Haskell.
Frank Shearar
Me pregunto si hay alguna grabación de esa presentación de Objetos Funcionales ... Estoy realmente interesado, pero las diapositivas por sí solas no le hacen justicia.
Rei Miyasaka
9

En primer lugar, ¿qué significa que 2 conceptos sean ortogonales?

Significa que los dos conceptos no tienen ideas contrastantes o no son incompatibles entre sí.

FP fomenta la inmutabilidad y la pureza tanto como sea posible. y OO parece algo construido para el estado y la mutación (¿una versión ligeramente organizada de la programación imperativa?). Y me doy cuenta de que los objetos pueden ser inmutables. Pero OO parece implicar estado / cambio para mí.

Parecen opuestos. ¿Cómo afecta a su ortogonalidad?

Un lenguaje como Scala hace que sea fácil hacer OO y FP, ¿afecta esto a la ortogonalidad de los 2 métodos?

OO se trata de encapsulación, composición de objetos, abstracción de datos, polimorfismo mediante subtipo y mutación controlada cuando sea necesario (también se recomienda la inmutabilidad en OO). FP se trata de composición de funciones, abstracción de control y polimorfismo restringido (también conocido como polimorfismo paramétrico). Por lo tanto, las dos ideas no son contradictorias. Ambos le brindan diferentes tipos de poderes y mecanismos de abstracción, que sin duda es posible tener en un idioma. De hecho, esta es la tesis sobre la cual Scala se construyó .

En su charla de Experimento Scala en Google, Martin Odersky explica muy bien cómo cree que los dos conceptos, OO y FP, son ortogonales entre sí y cómo Scala unifica los dos paradigmas de manera elegante y sin problemas en un nuevo paradigma conocido popularmente en la comunidad Scala como paradigma objeto-funcional. Debo ver hablar por ti. :-)


Otros ejemplos de lenguajes funcionales de objeto: OCaml , F # , Nemerle .

missingfaktor
fuente
1
"Significa que los dos conceptos no tienen ideas contrastantes o no son incompatibles entre sí". - Eso es cierto, pero creo que diría algo como " distinto pero no incompatible". Por ejemplo, si uno fuera un subconjunto del otro, no serían incompatibles, pero tampoco serían ortogonales.
Tim Goodman el
@Tim: Ese fue mi intento [quizás fallido] de definir el término. No soy un gurú inglés, ya ves. : - |
missingfaktor
7

Ortogonal significa más o menos "independiente".

Entonces, si FP y OO son ortogonales, eso significa que puede usar la inmutabilidad si usa objetos o no, y puede usar objetos si son inmutables o no.

Nota para uno mismo - piense en un nombre
fuente
2
"Independiente" es una buena manera de decirlo. No es que sean opuestos, pero si su código es un estilo de programación funcional o un estilo de programación orientado a objetos son dos cosas separadas. Piense en ellos como los ejes x e y en un gráfico: puede moverse hacia arriba y hacia abajo uno mientras permanece fijo en el otro. (En el sentido matemático, un vector en la dirección xy un vector en la dirección y son literalmente ortogonales, la definición CS está relacionada)
Tim Goodman,
@TimGoodman: Realmente me gustó el eje x, y en la analogía gráfica que hiciste. ¿Puede esto ser asignada a resultado final logra cuando un movimiento en una dirección frente a otra (me refiero en última instancia, tanto la programación de metas paradigma es tener código sea más fácil y fácil de mantener, no lo es?)
rahulaga_dev
0

* He escuchado esto una y otra vez y estoy tratando de entender y validar la idea de que FP y OO son ortogonales. * *

En primer lugar, ¿qué significa que 2 conceptos sean ortogonales?

Cita de Wikipedia: "La ortogonalidad garantiza que la modificación del efecto técnico producido por un componente de un sistema no crea ni propaga efectos secundarios a otros componentes del sistema".

Simplemente, solo significa que el cambio a un sistema no afecta, y no puede afectar, un cambio en el otro sistema.

Por ejemplo, un automóvil tiene componentes y controles ortogonales (por ejemplo, acelerar el vehículo no influye en nada más que en los componentes involucrados exclusivamente con la función de aceleración. No afecta la radio, por ejemplo (aunque no estoy seguro de si afecta la reproducción de CD, ya que el mío salta a veces)).

FP fomenta la inmutabilidad y la pureza tanto como sea posible. y OO parece algo construido para el estado y la mutación (¿una versión ligeramente organizada de la programación imperativa?). Y me doy cuenta de que los objetos pueden ser inmutables. Pero OO parece implicar estado / cambio para mí.

Parecen opuestos. ¿Eso significa que son ortogonales?

Un poco El problema es que ninguno de estos conceptos está realmente definido como roca. Pero sí, ya entendiste lo esencial.

Torre
fuente