Durante una entrevista esta semana me han preguntado «cuál es la diferencia entre la Programación Funcional, Orientada a Objetos y Procedimental» y para ser sincero no sabía muy bien cómo responder a esa pregunta (y era la primera vez que oía hablar de la Programación Procedimental…). Así que hoy, decidí investigar un poco y (tratar de) entender cuáles son las principales diferencias.
Comencemos con algunas definiciones:
» La programación funcional (PF) es un paradigma de programación -un estilo de construcción de la estructura y los elementos de los programas de ordenador- que trata la computación como la evaluación de funciones matemáticas y evita los datos mutables y de estado cambiante.» – Wikipedia
» La programación orientada a objetos (POO) es un paradigma de programación basado en el concepto de «objetos», que pueden contener datos, en forma de campos, a menudo conocidos como atributos; y código, en forma de procedimientos, a menudo conocidos como métodos.» – Wikipedia
» La programación procedimental es un paradigma de programación, derivado de la programación estructurada, basado en el concepto de llamada a procedimiento. Los procedimientos, también conocidos como rutinas, subrutinas o funciones, simplemente contienen una serie de pasos computacionales a realizar.» – Wikipedia
Ok, eso es una introducción pero entremos en un poco más de detalles.
Primero, ¿qué es un paradigma de programación? Es un estilo de programación, una forma de pensar en la construcción de software. Un paradigma de programación no se refiere a un lenguaje específico sino a una forma de programar, una metodología. Algunos lenguajes facilitan la escritura en algunos paradigmas, pero no en otros. Para más detalles, véase el artículo de Wikipedia.
Ahora vamos a sumergirnos en los tres paradigmas de programación que nos interesan hoy:
La programación procedimental (PP), también conocida como programación en línea adopta un enfoque descendente. Se trata de escribir una lista de instrucciones para decirle al ordenador lo que debe hacer paso a paso. Se basa en procedimientos o rutinas.
La programación orientada a objetos (POO) consiste en encapsular los datos y el comportamiento en objetos. Una aplicación OOP utilizará una colección de objetos que sabe cómo realizar ciertas acciones y cómo interactuar con otros elementos de la aplicación. Por ejemplo, un objeto podría ser una persona. Esa persona tendría un nombre (que sería una propiedad del objeto), y sabría cómo caminar (que sería un método). Un método en POO puede ser considerado como un procedimiento en PP, pero aquí pertenece a un objeto específico. Otro aspecto importante de la POO son las clases. Una clase puede ser considerada como un plano de un objeto.
La programación funcional (PF) consiste en pasar datos de función a función para obtener un resultado. En FP, las funciones son tratadas como datos, lo que significa que puedes usarlas como parámetros, devolverlas, construir funciones a partir de otras funciones y construir funciones personalizadas. Las funciones en FP tienen que ser funciones puras, deben evitar el estado compartido, y los efectos secundarios y los datos deben ser inmutables. Una función pura es una función que dado el mismo tipo de entrada siempre devolverá la misma salida, no depende de un estado local o global. Un estado compartido es un estado que se comparte entre más de una función o más de una estructura de datos. Así que con el estado compartido, para entender los efectos de una función, necesitas conocer todos los detalles de cada variable compartida. Esto añade mucha complejidad y permite menos modularidad.