Como Oracle Corporation ha introducido algunos constructos funcionales en Java SE 8, hoy en día la mayoría de los entrevistadores están interesados en hacer preguntas sobre Programación Funcional. Como desarrollador de Java/Groovy/Scala o cualquier desarrollador de Programación Funcional, deberíamos aprender las siguientes preguntas y respuestas para superar entrevistas:
- ¿Qué es la Programación Funcional?
- ¿Cuáles son los “Pros y Contras” de la Programación Funcional?
- ¿Cuáles son las diferencias entre la Programación Funcional y la Programación Imperativa?
- ¿Cuáles son las diferencias entre la Programación Funcional y la Programación Orientada a Objetos?
- ¿Cuáles son las diferencias entre la Programación Funcional, la Programación Imperativa (IP) y la Programación Orientada a Objetos?
- ¿Cuáles son las principales ventajas de la Programación Funcional sobre la Programación Imperativa o la Programación Orientada a Objetos?
- ¿Cuándo usar Programación Funcional?
- ¿Cuándo usar Programación Orientada a Objetos?
- ¿Cuáles son las desventajas de la POO?
- ¿Cuáles son las desventajas de la POO-Herencia?
… Y más
En esta publicación, vamos a discutir sobre los siguientes tres paradigmas de programación populares uno por uno y también responder a las preguntas anteriores:
- Programación Funcional (FP)
- Programación Imperativa (IP)
- Programación Orientada a Objetos (OOP)
¿Qué es la Programación Funcional?
En palabras simples, la Programación Funcional (FP) es uno de los paradigmas de programación populares, que realiza cálculos como Funciones Matemáticas sin Cambiar Estado y Mutar Datos. En la Programación Funcional, las funciones son candidatas de primera clase. Escribimos programas definiendo un conjunto de Funciones y Datos Inmutables. Ejemplos de lenguajes de FP: Scala, Haskell, Earlang, etc., son lenguajes de FP populares. Java SE 8 también tiene algunos Constructos Funcionales (consulte las publicaciones de Java 8 para más detalles)
¿Cuáles son las características de FP?
Los lenguajes de Programación Funcional como Scala tienen las siguientes características.
- 1. El estado no existe.
Los programas de FP no contienen estado. Esto significa que todos los datos son datos inmutables y las funciones no pueden cambiar el estado.2. Baja importancia del orden de ejecución
En los lenguajes de FP, escribimos programas con un conjunto de funciones independientes. Las funciones contienen un conjunto de declaraciones. En FP, el orden de ejecución de esas funciones no tiene mucha importancia porque no tienen estado y todas las funciones funcionan de manera independiente. Incluso si cambiamos el orden de ejecución, aún así producen los mismos resultados.3. Modelo de programación sin estado
Todos los programas de FP utilizan datos inmutables y funciones, que no pueden modificar esos datos. Eso significa que los lenguajes de FP admiten un modelo de programación sin estado.4. Las funciones son ciudadanos de primera clase
En los lenguajes de FP, las funciones son objetos de primera clase. Las funciones son unidades independientes, podemos ejecutarlas en cualquier orden.5. Unidades de manipulación primaria
En los lenguajes de FP, las unidades de manipulación primaria son funciones y estructuras de datos porque todos los programas están hechos usando estas unidades.6. Programación modular
En los lenguajes de FP, necesitamos escribir unidades más pequeñas e independientes, llamadas funciones puras, para admitir el modelo de programación sin estado. Eso significa que FP admite una modularidad mejor que la OOP.7. Funciones de orden superior y evaluación perezosa
Los lenguajes de programación funcional deben admitir funciones de orden superior y características de evaluación perezosa.8. Controles de flujo primarios
Los lenguajes de FP no utilizan controles de flujo como bucles For…, Do…While, While…, etc., y tampoco usan declaraciones condicionales como If…Else o Switch. Todos los lenguajes de FP escriben programas usando las siguientes cosas:
- Funciones
- Llamadas de función
- Llamadas de función con Recursión
- Abstracción, Encapsulación, Herencia y Polimorfismo
Al igual que en la POO, los lenguajes de programación funcional admiten los 4 conceptos: Abstracción, Encapsulación, Herencia y Polimorfismo. Los lenguajes de programación funcional admiten la Herencia con Clases de Tipos o Implícitos. Admiten el Polimorfismo con la ayuda de los Genéricos. También se conoce como Polimorfismo Paramétrico.
¿Cuál es el enfoque principal de la FP?
A diferencia de los lenguajes de POO, todos los programas de lenguajes de programación funcional se centran principalmente en “Lo que estás haciendo” o “Lo que debe hacerse”. Se centran principalmente en las siguientes cosas:
- Qué información se desea que sean las Entradas.
- Qué transformaciones son necesarias, es decir, la Lógica Real.
Es decir, la FP se centra principalmente en “Lo que debe hacerse”. No se centra mucho en “Cómo debe hacerse”. Es por eso que podemos escribir Programación Funcional como una descripción del Dominio del Problema. Por eso, no solo los desarrolladores, sino también otras personas pueden entender fácilmente el código FP. Ahora discutiremos sobre los “Pros y Contras” (Ventajas y Desventajas) de la Programación Funcional.
Ventajas de la Programación Funcional?
Los lenguajes de programación funcional tienen las siguientes ventajas o beneficios:
- Código Libre de Errores
Como los lenguajes de programación funcional no admiten estado, no generan efectos secundarios, lo que significa que podemos escribir código libre de errores o código sin errores o código menos propenso a errores.
Programación Paralela Eficiente
Como los lenguajes de programación funcional no tienen estado mutable, no generan problemas de cambio de estado. Esto significa que utilizan solo datos inmutables. Utilizan unidades independientes para escribir programas, es decir, “Funciones”. Podemos escribir programación paralela o concurrente muy eficiente porque se ejecutan de forma independiente sin cambiar el estado.
Mejor Rendimiento
Como los programas de programación funcional se componen con todas las unidades independientes, pueden ejecutarse de forma paralela o concurrente. Por esta razón, las aplicaciones de programación funcional obtienen un mejor rendimiento.
Mejor Encapsulación
A diferencia de la programación orientada a objetos, la programación funcional admite una mejor encapsulación con funciones puras. Las funciones puras significan sin efectos secundarios.
Soporta Funciones Anidadas
Funciones Anidadas significa componer funciones dentro de otras funciones para resolver problemas. La programación funcional soporta Funciones Anidadas.
Aumento de la Reutilización
Como los programas de programación funcional están compuestos por unidades independientes, es decir, “Funciones”, podemos reutilizarlos muy fácilmente.
Mejor Modularidad
En los lenguajes de programación funcional, necesitamos escribir unidades más pequeñas e independientes, llamadas Funciones Puras, para soportar el modelo de programación sin estado. Esto significa que la programación funcional soporta una mejor modularidad que la programación orientada a objetos.
Fácil Evaluación Perezosa
En los lenguajes de programación funcional, es muy fácil escribir Evaluación Perezosa. Soportan Constructos Funcionales Perezosos como Listas Perezosas, Mapas Perezosos, etc.
Aumento de la Legibilidad y Mantenibilidad
La Programación Funcional (FP) también mejora la Legibilidad y Mantenibilidad porque trabajan de forma independiente y no cambian el estado.
Aumento de la Testabilidad
Como escribimos nuestros programas de FP utilizando Unidades Independientes, es decir, “Funciones”, podemos probarlas fácilmente a nivel de unidad.
Soporta Abstracción sobre Comportamiento
A diferencia de la programación orientada a objetos, la programación funcional soporta tanto la “Abstracción sobre Datos” como la “Abstracción sobre Comportamiento”. Porque el mundo real contiene ambos.
Soporte para Big Data
Como la programación funcional soporta la programación paralela y un mejor rendimiento, FP es muy bueno para desarrollar aplicaciones de Big Data.
Código Robusto y Confiable
Como FP utiliza Datos Inmutables, podemos desarrollar fácilmente Código Robusto y Confiable utilizando FP.
Desventajas de la Programación Funcional?
Además de los grandes beneficios, los lenguajes de programación funcional también tienen muy pocas o mínimas desventajas que pueden ser ignoradas. Solo tienen los siguientes contras:
- Requiere mucha memoria
La programación funcional no tiene estado. Siempre crea nuevos objetos para realizar acciones en lugar de modificar objetos existentes. Debido a esto, las aplicaciones de programación funcional consumen mucha memoria.- No se centra en la Sustitución de Liskov
Cuales son los principales conceptos de la Programación Funcional?
Los siguientes conceptos son principales e importantes en la Programación Funcional.
- Funciones de primera clase.
- Evaluación perezosa.
- Funciones de orden superior.
- Inmutabilidad (datos no mutables).
- Modularidad.
- Sin efectos secundarios.
- Evaluación perezosa.
- Llamadas recursivas de funciones.
¿Qué es la Programación Imperativa?
La Programación Imperativa (IP) es uno de los paradigmas de programación populares que ejecuta una secuencia de pasos/instrucciones en algún orden. Ejemplos de lenguajes de IP: Java, C, C++, etc.
¿Cuáles son las características principales de la Programación Imperativa?
Cualquier lenguaje de Programación Imperativa (IP) puede contener las siguientes características:
- Secuencia de declaraciones.
- El orden de ejecución de las declaraciones es muy importante.
- Contienen estado.
- Utilizan tanto datos inmutables como mutables.
- Pueden cambiar de estado.
- Pueden tener efectos secundarios.
- Modelo de programación con estado.
- Cambian directamente el estado del programa.
- Representan el estado con campos de datos.
¿Qué es la Programación Orientada a Objetos?
La Programación Orientada a Objetos es otro tipo de Paradigma de Programación. Representa todo como un Objeto. Cada Objeto contiene Algunos Campos de Datos y Métodos. Todos los Programas de POO contienen Estado. Utilizan Datos Mutables y Estructuras de Datos. Al igual que en la Programación Funcional, podemos escribir programas completos utilizando Datos Inmutables, pero no impone esta regla. La Programación Orientada a Objetos (POO) es un superconjunto de la Programación Imperativa. Sigue todas las características de la PI con algunas características adicionales. Esas características adicionales son:
- Todo es un Objeto.
- Cada Objeto contiene Algunos Campos de Datos y Métodos.
- Conceptos de POO: Abstracción, Encapsulación, Herencia y Polimorfismo
A diferencia de los Lenguajes de Programación Funcional, los Lenguajes de POO están principalmente enfocados en “Cómo se debe hacer”. Eso significa que como Desarrolladores, nos enfocamos en “Cómo lo estás haciendo”. Además, la POO combina tanto “Qué estás haciendo” como “Cómo lo estás haciendo”. Por eso no podemos escribir un código conciso y más legible. Solo los Desarrolladores pueden entender el código, otras personas pueden confundirse más para entender el código de la aplicación, no pueden entenderlo.
¿Desventajas de la Programación Orientada a Objetos (POO)?
Aunque la POO resuelve muchos problemas en tiempo real, aún tiene las siguientes desventajas (en comparación con la PF):
- No soporta una reutilización completa.
- No es completamente modular.
- Rompe el concepto de encapsulamiento.
- La herencia tiene muchas desventajas.
Principales desventajas de la herencia:
- Rompe el principio de encapsulamiento
- Cuando los niveles de herencia aumentan, es muy difícil y duro de mantener y crear objetos.
¿Cuándo usar la programación funcional?
Deberíamos optar por la programación funcional (FP) en los siguientes escenarios:
- Cuando vamos a realizar muchas operaciones diferentes en los datos que están fijos.
- En otras palabras, cuando tenemos pocas cosas con más operaciones.
¿Cuándo usar la programación orientada a objetos?
Deberíamos optar por la programación orientada a objetos (OOP) en los siguientes escenarios:
- Cuando vamos a realizar pocas operaciones en muchas variantes diferentes que tienen un comportamiento común.
- En otras palabras, cuando tenemos más cosas con pocas operaciones.
NOTA: – Aquí las cosas son objetos del mundo real y las operaciones son acciones del mundo real. Por ejemplo, en Java representamos estas cosas del mundo real como “Clases” y las acciones del mundo real como Métodos (Operaciones).
¿Cuáles son las diferencias entre FP y OOP (IP)?
Functional Programming | OOP |
---|---|
Does not exist State | Exists State |
Uses Immutable data | Uses Mutable data |
It follows Declarative Programming Model | It follows Imperative Programming Model |
Stateless Programming Model | Stateful Programming Model |
Main Fcous on: “What you are doing” | Main focus on “How you are doing” |
Good for Parallel (Concurrency) Programming | Poor for Parallel (Concurrency) Programming |
Good for BigData processing and analysis | NOT Good for BigData processing and analysis |
Supports pure Encaspulation | It breaks Encaspulation concept |
Functions with No-Side Effects | Methods with Side Effects |
Functions are first-class citizens | Objects are first-class citizens |
Primary Manipulation Unit is “Function” | Primary Manipulation Unit is Objects(Instances of Classes) |
Flow Controls: Function calls, Function Calls with Recursion | Flow Controls: Loops, Conditional Statements |
It uses “Recursion” concept to iterate Collection Data. | It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java |
Order of execution is less importance. | Order of execution is must and very important. |
Supports both “Abstraction over Data” and “Abstraction over Behavior”. | Supports only “Abstraction over Data”. |
We use FP when we have few Things with more operations. | We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java. |
Eso es todo acerca de tres paradigmas de programación populares. NOTA: – Básicamente provengo de OOP, pero comencé a trabajar en FP hace solo un año. Entonces, si los expertos en Programación Funcional encuentran algún error en esta publicación, por favor, bríndenme sus valiosos aportes. Por favor, déjenme un comentario si les gusta mi publicación o tienen alguna duda o sugerencia.