Programación funcional en JavaScript: principios y uso | Nicolás Garzón
La programación funcional es un estilo de diseño que organiza la lógica como transformaciones de datos y utiliza las funciones como valores.
No significa escribir todo con arrow functions ni eliminar por completo el estado. Busca que los cálculos sean predecibles, que los cambios sean visibles y que las operaciones puedan combinarse.
JavaScript
Copiar const total = products
. filter ( isAvailable)
. map ( applyDiscount)
. reduce ( sumPrices, 0 ) ; Las funciones pueden almacenarse, recibirse y devolverse.
JavaScript
Copiar function applyOperation ( value, operation ) {
return operation ( value) ;
} Esto hace posibles callbacks, funciones de orden superior y composición.
Una función pura depende de entradas explícitas y no produce efectos observables.
JavaScript
Copiar function calculateSubtotal ( price, quantity ) {
return price * quantity;
} La nota Funciones puras y efectos secundarios profundiza este concepto.
En lugar de modificar datos compartidos, se crean valores nuevos.
JavaScript
Copiar function activateUser ( user ) {
return {
... user,
isActive : true ,
} ;
} Spread crea una copia superficial; no vuelve profundamente inmutable toda la estructura.
Funciones pequeñas pueden conectarse para construir una operación mayor.
JavaScript
Copiar const normalize = ( value ) => value. trim ( ) . toLowerCase ( ) ;
const toSlug = ( value ) => value. replaceAll ( " " , "-" ) ;
const createSlug = ( value ) => toSlug ( normalize ( value) ) ; Las aplicaciones necesitan red, almacenamiento, UI y tiempo. El objetivo es separar esos efectos de las transformaciones.
JavaScript
Copiar function createOrderPayload ( cart ) {
return {
items : cart. items,
total : calculateTotal ( cart. items) ,
} ;
}
async function submitOrder ( cart ) {
const payload = createOrderPayload ( cart) ;
return orderApi. create ( payload) ;
} Un enfoque imperativo describe los pasos.
JavaScript
Copiar const activeNames = [ ] ;
for ( const user of users) {
if ( user. isActive) {
activeNames. push ( user. name) ;
}
} Un enfoque declarativo expresa el resultado mediante operaciones conocidas.
JavaScript
Copiar const activeNames = users
. filter ( ( user ) => user. isActive)
. map ( ( user ) => user. name) ; Ninguno es automáticamente mejor. Elige el que comunique mejor la intención y permita controlar el flujo necesario.
JavaScript
Copiar const report = orders
. filter ( ( order ) => order. status === "completed" )
. map ( ( order ) => ( {
id : order. id,
total : calculateOrderTotal ( order) ,
} ) )
. sort ( ( first, second ) => second. total - first. total) ; Cuando una cadena crece demasiado, los pasos con nombre pueden ser más claros.
JavaScript
Copiar const completedOrders = orders. filter ( isCompletedOrder) ;
const summaries = completedOrders. map ( createOrderSummary) ;
const report = summaries. sort ( byHighestTotal) ; La programación funcional no niega el estado. Propone representar sus cambios de forma explícita.
JavaScript
Copiar function updateCart ( cart, action ) {
switch ( action. type) {
case "item-added" :
return {
... cart,
items : [ ... cart. items, action. item] ,
} ;
case "cleared" :
return {
... cart,
items : [ ] ,
} ;
default :
return cart;
}
} La entrada anterior no se modifica; se devuelve el siguiente estado.
Este estilo puede facilitar:
Razonar sobre transformaciones.
Probar lógica sin preparar servicios externos.
Reutilizar operaciones pequeñas.
Separar cálculos de efectos.
Reducir mutaciones compartidas.
Construir pipelines de datos.
Aplicarlo como dogma también puede empeorar el código:
Demasiadas funciones pequeñas fragmentan el flujo.
Cadenas extensas pueden ocultar pasos importantes.
Currying y composición excesivos pueden reducir legibilidad.
Copiar estructuras grandes tiene un costo.
Ocultar efectos no los elimina.
Un bucle directo puede comunicar mejor la intención.
React utiliza varias ideas funcionales:
Componentes que calculan UI desde props y estado.
Actualizaciones que producen nuevos valores.
Reducers que representan transiciones.
Datos derivados en lugar de duplicados.
Efectos separados mediante mecanismos explícitos.
Aun así, una aplicación real interactúa con red, DOM, almacenamiento y tiempo. La meta es reconocer qué parte calcula y cuál sincroniza con el exterior.
JavaScript
Copiar const isVisible = ( product ) =>
product. isActive && product. stock > 0 ;
const createCardViewModel = ( product ) => ( {
id : product. id,
title : product. name,
priceLabel : formatCurrency ( product. price) ,
} ) ;
function prepareProductCards ( products ) {
return products
. filter ( isVisible)
. map ( createCardViewModel) ;
} La función transforma datos del dominio sin modificar la colección ni renderizar la interfaz.
Creer que programación funcional significa usar arrow functions.
Pensar que map y filter vuelven funcional cualquier código.
Prohibir toda mutación, incluida la local no observable.
Ocultar efectos dentro de funciones que parecen cálculos.
Encadenar métodos sin cuidar la lectura.
Usar composición solo por apariencia.
Asumir inmutabilidad profunda después de usar spread.
Presentar programación funcional y orientación a objetos como enemigos.
Es un estilo basado en funciones, transformaciones y efectos controlados.
Las funciones como valores permiten callbacks y composición.
Pureza e inmutabilidad mejoran previsibilidad, pero no son dogmas.
El estado puede representarse mediante transiciones explícitas.
Los efectos son necesarios y deben mantenerse visibles.
El código declarativo no siempre es más claro que un bucle.
JavaScript permite combinar paradigmas según el problema.
¿Qué parte realiza un efecto?
JavaScript
Copiar function prepareOrder ( cart ) {
return {
items : cart. items,
total : calculateTotal ( cart. items) ,
} ;
}
async function completeOrder ( cart ) {
const order = prepareOrder ( cart) ;
return orderApi. create ( order) ;
} Respuesta prepareOrder transforma datos. orderApi.create(order) realiza el efecto externo de comunicación o persistencia.
El siguiente bloque estudia Objetos , donde veremos propiedades, métodos, destructuring, copias, mutabilidad, this, prototipos y clases.