JS: Funciones

Teoría: Abstracción mediante funciones

La principal razón para crear funciones es aumentar el nivel de abstracción, no reducir la duplicación de código. Lo segundo es una consecuencia de lo primero. De hecho, en lugar de implementar la clasificación por sí mismo en cada lugar donde se requiere, se puede utilizar la función sort(), que oculta la implementación interna y permite al programador no distraerse con detalles innecesarios (como el tipo de clasificación, el código para ejecutarla).

Abstracción con funciones

Esa es la esencia de la abstracción, ignoramos los aspectos, propiedades y relaciones no esenciales del objeto o proceso considerado, lo que nos permite presentar una idea compleja de una forma más simple. La capacidad de abstraer es una de las propiedades más importantes de nuestro cerebro. Los niños pequeños aprenden rápidamente a clasificar los objetos de nuestro mundo. Sin mucho esfuerzo, entienden que un árbol es un árbol, incluso si ven una especie de árbol por primera vez. Y dos dedos separados representan un conejo (porque tiene orejas).

A pesar de esto, el entendimiento de cómo construir abstracciones adecuadas (en nuestro caso, identificar funciones) no surge por sí solo. Viene con la experiencia, siempre y cuando haya alguien más experimentado que tú que pueda señalar los errores que cometes, y tú mismo puedas detectar los problemas de tu abstracción durante el uso (reflexionar). Por otro lado, la abstracción excesiva es más perjudicial que beneficiosa. Al acumular nuevas entidades, se puede perder la esencia y se puede gastar más tiempo en comprender lo que está sucediendo. La construcción de abstracciones siempre es un compromiso. Un nivel de abstracción demasiado bajo conduce a la duplicación de código, mientras que uno demasiado alto puede ser muy difícil de entender (intenta comprender la Teoría de Categorías) y dificulta la resolución de problemas simples.

Gran pila de llamadas en Java

Las funciones de orden superior llevan la abstracción con funciones a un nuevo nivel. Al delegar el comportamiento en código externo (usando funciones anónimas), se amplía en gran medida la capacidad de reutilizar el código (algoritmo) en diferentes situaciones. En lugar de tener diez funciones para diez partes diferentes del código, se tiene una función que se especifica diez veces con diferentes comportamientos.

Pero no olvides que las abstracciones casi siempre tienen fugas.

Ejemplo de una abstracción con fugas

En el primer proyecto de Códica, nuestros estudiantes cometen un error (cometen muchos, pero ahora nos interesa uno) relacionado con una mala identificación de abstracciones. Si dejamos de lado los detalles (¡abstraigámonos!), la tarea se reduce a escribir una función que reciba un número y muestre en la pantalla si es par, y no en caso contrario.

La primera solución se ve más o menos así:

const check = (number) => {
  const result = number % 2 === 0 ? 'sí' : 'no';
  console.log(result);
};

Funciona, pero el concepto de paridad no se ha separado en su propia abstracción, lo que dificulta, por ejemplo, las pruebas y la comprensión del código. Aquí es simple, pero en casos más complejos, es difícil adivinar qué operación se está realizando. Sería correcto separar la paridad en una función (abstracción) aparte.

const isEven = (number) => (number % 2 === 0) ? 'sí' : 'no';

const check = (number) => {
  const result = isEven(number);
  console.log(result);
};

Mira atentamente el código anterior. ¿Está todo bien con él?

En realidad, este código es aún peor que la primera versión, porque se ha creado una abstracción incorrecta. El concepto de paridad de un número no está relacionado ni con la salida en pantalla ni con las cadenas o no. Existe en el vacío como un concepto matemático y no puede saber cómo se va a utilizar. Sin mencionar que el nombre isEven() comienza con is, lo que significa que la función es un predicado. Estas funciones solo pueden devolver un valor lógico y nada más (¡no hay excepciones!). La versión correcta se ve así:

const isEven = (number) => (number % 2 === 0);
const check = (number) => {
  const result = isEven(number) ? 'sí' : 'no';
  console.log(result);
};

Y este es el enfoque más básico para crear abstracciones. En el código real, por lo general, todo es mucho más complicado. La práctica de construir abstracciones adecuadas se lleva a cabo en los proyectos de Códica.

Completado

0 / 16