Comparativa de Paradigmas de Programación: Imperativo vs. Funcional
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 9,36 KB
Paradigmas de la Programación
Son modelos para resolver problemas comunes con nuestro código, proporcionando herramientas y un enfoque específico para llevar el problema a la implementación.
Paradigma Imperativo
Es un enfoque en el que nos centramos en cómo resolvemos el problema. Se basa en una secuencia de instrucciones que se ejecutan en orden para cambiar el estado del programa. Ejemplos de lenguajes que usan este paradigma son Java, C, C#, y Python.
Programación Orientada a Objetos (POO)
Su objetivo es manejar la complejidad del mundo real abstrayendo sus datos importantes y encapsulándolos en objetos para la resolución del problema en cuestión. Ejemplos de lenguajes que usan este paradigma son Smalltalk, Python, Java, y C++.
Conceptos clave en POO
Objeto: es una entidad que tiene dos características: estado y comportamiento.
Estado: está representado por los atributos, es decir, las propiedades relevantes de un objeto.
Comportamiento: está representado por una serie de funciones o métodos que modifican o no el estado del objeto.
Clase: "Modelo o molde" para definir objetos que pueden realizar las mismas acciones y poseen características similares.
Clases abstractas: son aquellas de las que no podemos tener instancias.
Instancia: Objeto particular de una clase.
Método: Implementación de un mensaje. El envío de un mensaje a un objeto es invocar al método correspondiente.
Características de la POO
Encapsulamiento: ocultamiento del estado interno de un objeto. Ocultamiento: Solo puede modificarse la estructura interna de un objeto, desde fuera de la clase, a través de los mensajes que entiende el objeto.
Binding dinámico: significa que la unión entre el objeto receptor (OR) y el método que se va a ejecutar se realizará en tiempo de ejecución.
Herencia: Es la capacidad de crear nuevas clases a partir de otras ya existentes, ampliando su estructura y comportamiento.
Las clases están organizadas en una jerarquía de clases, donde las SUBCLASES heredan estado y comportamiento de las superclases (clases padre). Pudiendo agregar atributos o métodos, o redefinir a estos últimos.
Clasificación de herencia
- De estado: se heredan solo los atributos de la superclase.
- De comportamiento: se heredan solo los métodos de la superclase.
- Total o parcial: se heredan todos los atributos y métodos, o solo parte de ellos.
- Simple o múltiple: se hereda de una sola superclase (tiene 1 clase padre), o se hereda de varias superclases (+ de una clase padre).
Generalización: Se agrupan clases creando superclases que tengan características comunes.
Especialización: Agrega una subclase.
Implementación de herencia en diferentes lenguajes
- En Smalltalk: Herencia de Estructura/Estado es Total, mientras que la herencia de Comportamiento es Parcial/selectiva. Y Simple en cuanto a superclases se refiere.
- En C++: Herencia es Simple y Múltiple (de superclases). La herencia de atributos es Parcial, ya que solo se heredan los miembros públicos y protegidos, mientras que los miembros privados no se heredan. No hereda el constructor ni el destructor.
- En Python: al igual que C++, presenta herencia simple y múltiple. En cuanto a herencia de Estructura, pueden solo heredarse algunos atributos.
Clases
Están compuestas por una zona de declaración y otra de implementación. En la de declaración se definen los datos miembro y se especifican las operaciones. En la zona de implementación se codifican las operaciones.
Visibilidad
Todo lo que se define dentro de una clase sin especificar su visibilidad es privado por defecto, puede modificarse entre: private, protected, public.
- Private y protected: se accede a través de las funciones miembro, no se hereda.
- Public: se accede directamente.
Smalltalk
Tipos de colecciones
- Array (no admite el add: y tampoco el remove:).
- OrderedCollection (subclase de IndexedCollection).
- SortedCollection (subclase de OrderedCollection).
- Dictionary (subclase de Set).
Iteradores/enumeradores de colección
- do: itera sobre cada elemento de la colección (No se debe agregar ni remover).
- to: do: repite un número conocido de veces un proceso.
- Collect: Recorre una colección retornando otra colección, pero habiendo aplicado a cada objeto de la colección original una operación determinada.
- Select: Recorre una colección retornando una nueva colección con los objetos que cumplen una determinada condición.
- Reject: Recorre una colección retornando los elementos que no cumplen con una condición especificada.
- Detect: Retorna un puntero al primer objeto que cumple una condición. Este puntero hace que se pueda modificar un objeto determinado de una colección original.
Smalltalk tiene 2 tipos de herencia. Herencia de estructura (es total) y herencia de comportamiento (es parcial). Para programar usando herencia se utilizan las pseudo variables self y super:
- self: hace referencia al objeto receptor del mensaje
- super: hace referencia a la superclase de la clase que contiene el método en el cual aparece dicha pseudovariable
Paradigma Funcional
Características
Un programa, en este paradigma, es un conjunto de funciones o ecuaciones matemáticas, cuya evaluación permite obtener el resultado de una consulta. Se evalúa las funciones y devuelve un resultado.
Se basa en el concepto algebraico de función: para un argumento dado existe solo un resultado posible. Las variables se usan como variables matemáticas cuyo valor se liga al argumento de la función y no cambia. Estas dos características son la base de la transparencia referencial, la cual asegura que no habrá efectos laterales que modifiquen el valor final resultante. En el Paradigma Imperativo se pueden tener efectos laterales.
Definición de funciones
- Se debe definir un script o ambiente en el que se detalla el tipo de la función (dominio y codominio) y la ecuación que la describe.
- Tipos de datos: standard: num. bool, char, α. Derivado: par ordenado, lista, función. No existen las estructuras de control.
Formas de definir funciones
- Por análisis de casos o Guardas -> min(x,y):= x, if x < y
:= y, otherwise - Con definiciones locales -> potCuarta(x):= cuad(x)*cuad(x)
where cuad(x):=x*x - Por patrones -> and(x,true):=x
and(x,false):=false - Recursivas -> fact(0):=1
fact(x):= x* fact(x-1) - De alto orden (composición de funciones) -> usando map, filter, take, take while
Reducción de funciones
Se reducen a la forma más simple o forma normal:
- Aplicativo: primero se simplifican los argumentos y luego se evalúa la función.
- Normal: primero se evalúa la función y después se simplifican los argumentos.
Listas
Son conjuntos de elementos del mismo tipo, incluso puede haber listas de listas.
▫ Lista vacía [ ]
▫ Lista unitaria [X]
▫ Lista simple Xs o (X: Xs) -> cabeza: cuerpo
▫ Lista de listas Xss o (Xs: Xss) -> cabeza: cuerpo
Operaciones:
→ Concatenación: Combina dos listas en una sola, agregando los elementos de la segunda lista al final de la primera.
→ Longitud: Devuelve el número de elementos en la lista
→ Head: Devuelve el primer elemento de la lista
→ Tail: Devuelve la lista sin el primer elemento.
Funciones de alto orden:
❖ Map: Aplica una función a cada elemento de una lista y devuelve una nueva con los resultados de esa función aplicada a cada elemento (similar a collect en Smalltalk).
❖ Filter: Retorna una lista con los elementos de la lista original que cumplen una condición dada (similar a select en Smalltalk)
❖ Take: Devuelve una nueva lista con los primeros n elementos de la lista original. Solo toma los primeros elementos hasta un número indicado.
❖ TakeWhile: Devuelve los primeros elementos sucesivos de una lista que cumplan una condición dada. La operación se detiene en el primer elemento que no cumple la condición.