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?
Respuestas:
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 .
fuente
Significa que los dos conceptos no tienen ideas contrastantes o no son incompatibles entre sí.
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 .
fuente
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.
fuente
* 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.
fuente