Code Smells en Programación Funcional
La programación funcional tiene un enfoque diferente, con énfasis en inmutabilidad, funciones puras y composición de funciones.
3.1. Smells en Programación Funcional
Efectos Secundarios Ocultos: Funciones que se presentan como puras pero modifican estado Funciones Impuras Mezcladas: No separar claramente las funciones con efectos secundarios Mutabilidad Innecesaria: Usar variables mutables cuando no es necesario Recursión Ineficiente: Recursión que podría causar desbordamiento de pila Operaciones Repetitivas sobre Colecciones: Múltiples pasadas sobre la misma colección
3.2. Ejemplo: Efectos Secundarios Ocultos
let globalCounter = 0;
function processItems(items) {
return items.map(item => {
globalCounter++; // Efecto secundario oculto
return item.value * 2;
});
}
Refactorización (separando efectos secundarios):
function processItems(items) {
return items.map(item => item.value * 2);
}
function countProcessedItems(items) {
return items.length;
}
// Uso
const items = [{value: 1}, {value: 2}, {value: 3}];
const processedItems = processItems(items);
const count = countProcessedItems(items);
globalCounter += count;
3.3. Ejemplo: Recursión Ineficiente vs Recursión de Cola
def factorial(n: Int): Int = {
if (n <= 1) 1
else n * factorial(n - 1) // Puede causar desbordamiento de pila
}
def factorial(n: Int): Int = {
@annotation.tailrec
def factorialAcc(acc: Int, n: Int): Int = {
if (n <= 1) acc
else factorialAcc(acc * n, n - 1) // Optimizable por el compilador
}
factorialAcc(1, n)
}