Aikido

¿Por qué se debería hacer que el propósito de una función sea autoevidente para un código más claro?

Legibilidad

Regla
Hacer una función propósito sea evidente.
Nombre de deben comunicar comunicar lo función función
hace sin requiere los lectores que examinar la implementación.

Idiomas admitidos: 45+

Introducción

Los nombres de funciones que no revelan su propósito obligan a los desarrolladores a leer toda la implementación para entender su comportamiento. Una función llamada process() o handle() podría hacer cualquier cosa, requiriendo un esfuerzo mental para deducir su propósito real. Nombres claros y descriptivos como validateUserEmail() o calcularTotalPedido() comunicar la intención de inmediato, haciendo que el código se autodocumente.

Por qué es importante

Mantenibilidad del código: Los nombres de funciones poco claros ralentizan la comprensión. Los desarrolladores pierden tiempo leyendo implementaciones para entender qué hacen las funciones en lugar de centrarse en la lógica de negocio. Esto se agrava al volver al código meses después o cuando se incorporan nuevos miembros al equipo.

Uso incorrecto: Los nombres de funciones ambiguos aumentan la probabilidad de uso indebido. Una función llamada update() podría validar, transformar, persistir o notificar, lo que lleva a los desarrolladores a usarlo incorrectamente porque el nombre no especifica el comportamiento. Los nombres claros previenen el uso indebido al documentar las restricciones y los efectos secundarios.

Ejemplos de código

❌ No conforme:

function process(data) {
    const result = data.map(item => ({
        ...item,
        processed: true,
        timestamp: Date.now()
    }));
    db.save(result);
    notifyService.send(result);
    return result;
}

Por qué es incorrecto: El nombre process() no revela nada sobre lo que sucede con los datos. Los lectores deben examinar la implementación para saber que transforma elementos, guarda en la base de datos y envía notificaciones. Los efectos secundarios y las responsabilidades de la función están ocultos.

✅ Conforme:

function markItemsAsProcessedAndSave(data) {
    const processedItems = data.map(item => ({
        ...item,
        processed: true,
        timestamp: Date.now()
    }));
    db.save(processedItems);
    notifyService.send(processedItems);
    return processedItems;
}

Por qué es importante: El nombre indica explícitamente que la función marca los elementos como procesados y los guarda. Los lectores comprenden inmediatamente el propósito principal de la función sin necesidad de leer la implementación. El nombre sugiere efectos secundarios (guardar en la base de datos), estableciendo expectativas adecuadas.

Conclusión

Los nombres de las funciones deberían responder a "¿qué hace esto?" sin requerir una inspección del código. Incluya verbos que describan acciones y sustantivos que describan objetivos. Si un nombre se vuelve demasiado largo, es probable que la función haga demasiado y deba dividirse.

Preguntas frecuentes

¿Tiene preguntas?

¿Qué longitud pueden tener los nombres de función?

Tan largo como sea necesario para ser claro. calculateTotalPriceWithTaxAndShipping() es mejor que calc(). Los IDE modernos tienen autocompletado, lo que facilita la escritura de nombres más largos. Priorice la claridad sobre la brevedad. Si un nombre excede las 5-6 palabras, la función podría tener demasiadas responsabilidades.

¿Los nombres de las funciones deben incluir detalles de implementación?

No, describe el comportamiento y la intención, no la implementación. Nombra las funciones por lo que logran, no por cómo lo hacen. sortUsersByName() es mejor que quickSortUsers(). Los detalles de implementación pueden cambiar, pero el propósito permanece estable. Esto mantiene los nombres relevantes durante la refactorización.

¿Qué hay de las funciones auxiliares o de utilidad?

Todavía necesitan nombres claros. En lugar de helper() o util(), use nombres específicos como formatCurrency() o validateEmail(). Si no puede pensar en un nombre específico, el propósito de la función podría no estar claro y necesita una mejor definición.

¿Cómo nombro funciones que realizan múltiples tareas?

Divídelas. Las funciones que requieren nombres como validateAndTransformAndSave() violan el principio de responsabilidad única. Crea funciones separadas: validate(), transform(), save(). Si las operaciones deben ocurrir juntas, utiliza una función orquestadora con un nombre que describa el flujo de trabajo: processUserRegistration().

Asegúrate ahora.

Proteja su código, la nube y el entorno de ejecución en un único sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.