Conquistando la Complejidad: Refactorización de Proyectos JavaScript

This ad is not shown to multipass and full ticket holders
React Summit US
React Summit US 2025
November 17 - 21, 2025
New York, US & Online
The biggest React conference in the US
Learn More
In partnership with Focus Reactive
Upcoming event
React Summit US 2025
React Summit US 2025
November 17 - 21, 2025. New York, US & Online
Learn more
Bookmark
Rate this content

Uno de los problemas más comunes en las bases de código de JavaScript es que nuestro código es demasiado complejo. A medida que los proyectos y sus requisitos evolucionan, la complejidad se infiltra. La complejidad excesiva ralentiza el progreso, frustrándonos mientras intentamos mantener grandes porciones de un programa en nuestra mente solo para entender lo que está sucediendo.


¡Para conquistar la complejidad, debemos refactorizar! En esta charla, investigaremos cómo identificar la complejidad innecesaria en nuestra base de código utilizando la complejidad cognitiva como medida, cómo abordar la refactorización de código complejo y qué herramientas están disponibles para ayudarnos a refactorizar. Lo pondremos todo en práctica a través de un ejemplo en vivo. Al final de la charla, estarás emocionado de abordar esa monstruosidad de función de 1000 líneas en tu propia base de código (sabes cuál).

This talk has been presented at JSNation 2024, check out the latest edition of this JavaScript Conference.

FAQ

AstroDB es una base de datos vectorial sin servidor desarrollada por Datastacks, diseñada para ser utilizada en la construcción de aplicaciones generativas de AI.

Phil Nash es un ingeniero de relaciones con desarrolladores en Datastacks, la empresa detrás de AstroDB.

Puedes encontrar a Phil Nash en redes sociales como Twitter y Mastodon, así como en LinkedIn.

La complejidad ciclomática es una métrica de software que mide el número de caminos a través de una función. Se asigna una puntuación basada en la cantidad de bucles y condicionales dentro de la función.

La complejidad cognitiva mide cómo los humanos perciben la complejidad del código. Se calcula aumentando la puntuación cada vez que hay una interrupción en el flujo de una función, añadiendo puntos extra por anidamiento.

La complejidad ciclomática mide el número de caminos a través de una función, útil para determinar el número de pruebas necesarias. La complejidad cognitiva, por otro lado, se enfoca en cómo los humanos entienden el código, considerando la anidación y la interrupción del flujo.

Para manejar la complejidad, se recomienda entender dónde se localiza la complejidad, aplicar métricas como la complejidad cognitiva, y si es necesario modificar el código, realizar una refactorización que simplifique la estructura antes de hacer cambios sustanciales.

Las pruebas son cruciales en la refactorización, ya que permiten verificar que el comportamiento del código no cambie a pesar de las modificaciones en su estructura interna. Las pruebas deben cubrir el comportamiento existente del código para asegurar la integridad del mismo.

Phil Nash
Phil Nash
21 min
17 Jun, 2024

Comments

Sign in or register to post your comment.
  • Enoch Fagbenja
    Enoch Fagbenja
    Async Techs
    Very Insightful, Thank you Phil!
Video Summary and Transcription
La charla de hoy explora la complejidad en el código y su impacto. Discute diferentes métodos de medir la complejidad, como la complejidad ciclomática y la complejidad cognitiva. Se enfatiza la importancia de entender y conquistar la complejidad, con una demostración que muestra la complejidad en una base de código. La charla también profundiza en la necesidad de cambio y el papel de la refactorización en el manejo de la complejidad. Se comparten consejos y técnicas para refactorizar, incluyendo el uso de características del lenguaje y herramientas para simplificar el código. En general, la charla proporciona ideas sobre cómo gestionar y reducir la complejidad en el desarrollo de software.

1. Introduction to Complexity

Short description:

Hoy, quiero hablar sobre la complejidad en nuestro código. Nuestros trabajos son complejos ya que tenemos que modelar cosas de la vida real en lenguajes de programación. Vamos a explorar qué significa la complejidad y cómo afecta a nuestro código.

¿Qué tal a todos? Mi nombre es Phil Nash, y soy un ingeniero de relaciones con desarrolladores en Datastacks. Datastacks es una empresa detrás de AstroDB, que es una base de datos vectorial sin servidor que puedes usar para construir tus aplicaciones de IA generativa. De nuevo, mi nombre es Phil Nash. Si necesitas encontrarme en cualquier lugar de internet, seré Phil Nash, y Twitter, Mastodon, cualquier red social que estés usando en este momento, incluso LinkedIn, por Dios. De todos modos, de lo que quiero hablarles hoy es de la complejidad, la complejidad en nuestro código. Así que comencemos hablando de lo que quiero decir con complejidad. Verán, nuestros trabajos son complejos. A menudo tenemos que modelar cosas de la vida real, del mundo real en el medio de JavaScript o TypeScript o cualquier otro tipo de lenguaje. Y el mundo en sí mismo es inherentemente complejo, y luego simplemente añadimos a eso al intentar convertirlo en código. Y el código, por lo tanto, en sí mismo es inherentemente complejo.

2. Measuring Complexity and Cyclomatic Complexity

Short description:

Nuestro trabajo es gestionar la complejidad, y necesitamos un método para medirla en nuestro código. Examinemos la complejidad de las funciones a través de ejemplos. La complejidad ciclomática, inventada en 1976, otorga una puntuación a una función basada en sus interrupciones de flujo, como bucles y condicionales.

Lo que queremos evitar es simplemente añadir más complejidad a nuestras aplicaciones de la que el problema que estamos tratando de resolver exige por sí mismo. Y, en última instancia, esto significa que nuestro trabajo se convierte en gestionar la complejidad. Mientras podamos mantenernos al tanto de esta complejidad, entonces nuestras bases de código se mantienen cuerdas, fáciles de entender y fáciles de trabajar con el tiempo y con los cambios de equipo y todo tipo de cosas así.

Así que nuestro trabajo es gestionar la complejidad. Sin embargo, el año pasado en algunas otras conferencias, di una charla en la que analicé los cinco principales problemas en proyectos de JavaScript que podrían ser descubiertos por análisis estático, y en el número dos estaba el hecho de que la complejidad de las funciones en nuestros proyectos era simplemente demasiado alta. Y eso es un problema. Por eso quería dar esta charla para superar eso. Y entonces realmente la pregunta es, ¿qué es demasiado alto? Necesitamos un método para medir nuestra complejidad en nuestro código. ¿Y cómo podríamos hacer eso? ¿Cómo medimos la complejidad?

Bueno, primero que nada, déjame, si te mostrara un fragmento de código, si te mostrara una función como esta, una suma de números primos, y te preguntara cuán compleja es, solo piensa en lo que podrías responder y cuán útil sería eso. Obviamente hay algo de complejidad aquí. Tenemos algunos bucles. Tenemos algunos condicionales. Estamos tratando con números primos. Eso va a ser complejo. Y luego tenemos esta otra función. Esta es una función de obtener palabras. Pasamos un número y devuelve palabras como uno, un par, unos pocos, muchos o un montón. Es una gran declaración switch. ¿Cuán compleja es esta? Bueno, ha habido formas de medir la complejidad que han surgido, han sido inventadas a lo largo de los años. En 1976, se inventó la complejidad ciclomática. La complejidad ciclomática otorga una puntuación a una función basada en un par de cosas. Principalmente añade puntuaciones por cuando una función tiene una interrupción en el flujo. Es decir, cuando hay un bucle o un condicional en su mayoría. Y así, si miramos nuestra función de suma de números primos, la complejidad ciclomática realmente puntúa uno por ser una función. Todo comienza como uno. Así que comienza ahí arriba. Y luego puntuamos uno por este primer bucle for. Hay un segundo bucle for que puntúa uno. Hay un condicional. Y luego hay otro condicional en la parte inferior.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

El Futuro de las Herramientas de Rendimiento
JSNation 2022JSNation 2022
21 min
El Futuro de las Herramientas de Rendimiento
Top Content
Today's Talk discusses the future of performance tooling, focusing on user-centric, actionable, and contextual approaches. The introduction highlights Adi Osmani's expertise in performance tools and his passion for DevTools features. The Talk explores the integration of user flows into DevTools and Lighthouse, enabling performance measurement and optimization. It also showcases the import/export feature for user flows and the collaboration potential with Lighthouse. The Talk further delves into the use of flows with other tools like web page test and Cypress, offering cross-browser testing capabilities. The actionable aspect emphasizes the importance of metrics like Interaction to Next Paint and Total Blocking Time, as well as the improvements in Lighthouse and performance debugging tools. Lastly, the Talk emphasizes the iterative nature of performance improvement and the user-centric, actionable, and contextual future of performance tooling.
Rome, ¡una cadena de herramientas moderna!
JSNation 2023JSNation 2023
31 min
Rome, ¡una cadena de herramientas moderna!
Top Content
Rome is a toolchain built in Rust that aims to replace multiple tools and provide high-quality diagnostics for code maintenance. It simplifies tool interactions by performing all operations once, generating a shared structure for all tools. Rome offers a customizable format experience with a stable formatter and a linter with over 150 rules. It integrates with VCS and VLSP, supports error-resilient parsing, and has exciting plans for the future, including the ability to create JavaScript plugins. Rome aims to be a top-notch toolchain and welcomes community input to improve its work.
Mejorando la Felicidad del Desarrollador con IA
React Summit 2023React Summit 2023
29 min
Mejorando la Felicidad del Desarrollador con IA
GitHub Copilot is an auto-completion tool that provides suggestions based on context. Research has shown that developers using Copilot feel less frustrated, spend less time searching externally, and experience less mental effort on repetitive tasks. Copilot can generate code for various tasks, including adding modals, testing, and refactoring. It is a useful tool for improving productivity and saving time, especially for junior developers and those working in unfamiliar domains. Security concerns have been addressed with optional data sharing and different versions for individuals and businesses.
Automatiza el Navegador con la API de Renderizado del Navegador de Workers
JSNation 2024JSNation 2024
20 min
Automatiza el Navegador con la API de Renderizado del Navegador de Workers
The Talk discusses browser automation using the Worker's Browser Rendering API, which allows tasks like navigating websites, taking screenshots, and creating PDFs. Cloudflare integrated Puppeteer with their workers to automate browser tasks, and their browser rendering API combines remote browser isolation with Puppeteer. Use cases for the API include taking screenshots, generating PDFs, automating web applications, and gathering performance metrics. The Talk also covers extending sessions and performance metrics using Durable Objects. Thank you for attending!
Análisis estático en JavaScript: Lo fácil y lo difícil
JSNation 2023JSNation 2023
23 min
Análisis estático en JavaScript: Lo fácil y lo difícil
Static analysis in JavaScript involves analyzing source code without executing it, producing metrics, problems, or warnings. Data flow analysis aims to determine the values of data in a program. Rule implementation in JavaScript can be straightforward or require extensive consideration of various cases and parameters. JavaScript's dynamic nature and uncertainty make static analysis challenging, but it can greatly improve code quality.
Cómo automatizar cambios de código para 100 repositorios: Introducción a los Codemods
React Day Berlin 2022React Day Berlin 2022
28 min
Cómo automatizar cambios de código para 100 repositorios: Introducción a los Codemods
This Talk discusses automating code changes for Android repositories, utilizing tools like JSCodeShift and Abstract Syntax Tree. The speaker shares a real use case example of maintaining a design system library and making changes to a component. The talk emphasizes the importance of automating repetitive tasks and using the power of abstract syntax tree for code changes. The Q&A session covers topics like source code formatting, TypeScript support, and cultural embedding of code mods. The talk concludes with insights on when automation is worth it and the limitations of code mods for monorepo changes.

Workshops on related topic

Soluciona el 100% de tus errores: Cómo encontrar problemas más rápido con la Reproducción de Sesiones
JSNation 2023JSNation 2023
44 min
Soluciona el 100% de tus errores: Cómo encontrar problemas más rápido con la Reproducción de Sesiones
WorkshopFree
Ryan Albrecht
Ryan Albrecht
¿Conoces ese molesto error? ¿El que no aparece localmente? Y no importa cuántas veces intentes recrear el entorno, no puedes reproducirlo. Has revisado las migas de pan, leído la traza de pila y ahora estás jugando al detective para unir los tickets de soporte y asegurarte de que sea real.
Únete al desarrollador de Sentry, Ryan Albrecht, en esta charla para aprender cómo los desarrolladores pueden utilizar la Reproducción de Sesiones, una herramienta que proporciona reproducciones de video de las interacciones de los usuarios, para identificar, reproducir y resolver errores y problemas de rendimiento más rápido (sin golpear tu cabeza contra el teclado).