Conquistando la Complejidad: Refactorizando Proyectos JavaScript

Rate this content
Bookmark

Uno de los problemas más comunes en los proyectos de código JavaScript es que nuestro código es demasiado complejo. A medida que los proyectos y sus requisitos evolucionan, la complejidad se va introduciendo. El exceso de complejidad ralentiza el progreso, frustrándonos mientras intentamos mantener grandes fragmentos de un programa en nuestra cabeza solo para entender qué 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 por abordar esa monstruosidad de una función de 1000 líneas en tu propia base de código (ya 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.

Video Summary and Transcription

La charla de hoy explora la complejidad en el código y su impacto. Se discuten diferentes métodos para medir la complejidad, como la complejidad ciclomática y la complejidad cognitiva. Se enfatiza la importancia de comprender 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 la refactorización, incluido el uso de características y herramientas del lenguaje para simplificar el código. En general, la charla brinda información sobre cómo gestionar y reducir la complejidad en el desarrollo de software.

1. Introducción a la Complejidad

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, todos? Mi nombre es Phil Nash y soy un ingeniero de relaciones con desarrolladores en Datastacks. Datastacks es la empresa detrás de AstroDB, que es una base de datos vectorial sin servidor que puedes usar para construir tus aplicaciones generativas de AI. Nuevamente, mi nombre es Phil Nash. Si necesitas encontrarme en cualquier lugar de internet, estaré como Phil Nash, en Twitter, Mastodon, cualquier red social que estés usando en este momento, incluso LinkedIn, ¡Dios mío! De todos modos, lo que quiero hablarles hoy es la complejidad, la complejidad en nuestro código. Así que empecemos hablando de lo que quiero decir con complejidad. Verás, nuestros trabajos son complejos. A menudo tenemos que modelar cosas de la vida real en el medio de JavaScript o TypeScript u otro tipo de lenguaje. Y el mundo en sí mismo es inherentemente complejo, y luego nosotros simplemente agregamos a eso al intentar convertirlo en código. Y el código, por lo tanto, es inherentemente complejo.

2. Medición de la Complejidad y Complejidad Ciclomática

Short description:

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

Lo que queremos evitar es agregar más complejidad a nuestras aplicaciones de la que el problema que estamos tratando de resolver demanda en sí mismo. Y en última instancia, esto significa que nuestro trabajo se convierte en gestionar la complejidad. Si podemos mantenernos al tanto de esta complejidad, entonces nuestras bases de código se mantienen sanas, fáciles de entender y fáciles de trabajar a lo largo del tiempo y de los cambios de equipo y cosas así. Así que nuestro trabajo es gestionar la complejidad. Sin embargo, el año pasado en otras conferencias, di una charla en la que investigué los cinco principales problemas en proyectos de JavaScript que podrían descubrirse mediante análisis estático, y en el número dos estaba el hecho de que la complejidad de las funciones en nuestros proyectos era 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, en primer lugar, permítanme, si les mostrara un fragmento de código, si les mostrara una función como esta, una suma de números primos, y les preguntara qué tan compleja es, piensen en qué responderían y qué tan útil sería eso. Obviamente hay cierta complejidad aquí. Tenemos algunos bucles. Tenemos algunas condicionales. Estamos tratando con números primos. Eso será complejo. Y luego tenemos esta otra función. Esta es una función get words. Pasamos un número y devuelve palabras como uno, un par, unos pocos, muchos o muchos. Es una gran declaración switch. ¿Qué tan compleja es esta? Bueno, ha habido formas de medir la complejidad que se han inventado a lo largo de los años. En 1976 se inventó la complejidad ciclomática. La complejidad ciclomática asigna una puntuación a una función basada en un par de cosas. Principalmente suma puntuaciones 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 observamos nuestra función de suma de números primos, la complejidad ciclomática realmente asigna una puntuación de uno por ser una función. Todo comienza como uno. Así que comienza allí arriba. Y luego asignamos uno por este primer bucle for. Hay un segundo bucle for que suma uno. Hay un condicional.

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.
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.
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!
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).