<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Emanuel Barboza - Argis Lab on Medium]]></title>
        <description><![CDATA[Stories by Emanuel Barboza - Argis Lab on Medium]]></description>
        <link>https://medium.com/@emabarboza?source=rss-676b78ef6409------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*yzKigbXFm9QcqptAGsUkRw.png</url>
            <title>Stories by Emanuel Barboza - Argis Lab on Medium</title>
            <link>https://medium.com/@emabarboza?source=rss-676b78ef6409------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 04:28:06 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@emabarboza/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Principios y el Cuadrante de la Deuda Técnica]]></title>
            <link>https://medium.com/@emabarboza/principios-y-el-cuadrante-de-la-deuda-t%C3%A9cnica-5b353b6d7bec?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/5b353b6d7bec</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[debt]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[technical-debt]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Wed, 07 May 2025 20:28:11 GMT</pubDate>
            <atom:updated>2025-05-08T01:16:54.418Z</atom:updated>
            <content:encoded><![CDATA[<h4>Diseño de Software</h4><h4><strong>Principios para la Gestión de la Deuda Técnica</strong></h4><p>A continuación se presentan algunos principios:</p><ul><li><strong>La deuda técnica no es una noción abstracta, es algo bien concreto: </strong>se puede demostrar que la deuda técnica no es solo una metáfora elegante o un <em>“concepto al aire”</em> sino que tiene manifestaciones reales en el sistema ya sea en el código, arquitectura, o en los procesos. Para poder gestionarla, se necesita identificar donde está y rastrearla (o tracearla).</li><li><strong>La deuda técnica solo existe si incurre en <em>“intereses”</em>:</strong> si no se incurre en ninguna forma de interés, generando sobrecostos, impedimentos o riesgos adicionales con el tiempo como entonces probablemente no exista TD. O mejor dicho no está activa, esta situación es para preocuparse. El concepto de <em>“interés”</em> es clave donde lo que hoy no genera problemas, mañana puede empezar a hacerlo. Aquí se debe monitorear las decisiones que toma el equipo.</li><li><strong>Todos los sistemas tienen alguna forma de deuda técnica: </strong>es imposible eliminar toda la deuda técnica porque es inherente al desarrollo de software ya sea porque cambian los requisitos, tecnologías, contextos, etc. La clave no es eliminarla, sino gestionar su nivel y su impacto.</li><li><strong>La deuda técnica debe estar vinculada al sistema</strong>: esta frase se asocia al concepto de trazabilidad. Para poder actuar, necesito localizarla, saber su causa y su impacto. No sirve de nada decir <em>“hay deuda técnica”</em> si no sabemos dónde ni cómo afecta al sistema.</li><li><strong>La deuda técnica no es sinónimo de mala calidad:</strong> no todo lo que llamamos deuda técnica es <em>“mala calidad”</em>. Muchas veces, lo que es mala calidad es lo que está hecho mal desde el inicio, sin justificación y sin plan de corrección. Hay deuda técnica estratégica o aceptable como lanzar una funcionalidad rápido para validar el mercado.</li><li><strong>La deuda técnica en arquitectura es la más costosa de abordar: </strong>es la más costosa a nivel costo y esfuerzo. A nivel arquitectónico suele tener un impacto mucho mayor a diferencia de nivel de código, afectando escalabilidad, mantenibilidad, interoperabilidad. Es clave priorizar el pago de deuda antes que crezca e invertir en revisiones periódicas de la arquitectura.</li><li><strong>El código fuente es el principal artefacto, pero no el único: </strong>Aunque la mayor parte de la deuda técnica se manifiesta en el código fuente, también puede encontrarse en infraestructura, requerimientos, documentación, casos de pruebas, etc. Esto implica ampliar la visión de deuda técnica más allá del código.</li><li><strong>No existe una métrica absoluta para cuantificar la deuda técnica: </strong>no existe una fórmula única o estándar para medir el <em>“monto principal”</em> o los <em>“intereses”</em> de la deuda técnica. Cada sistema, equipo y contexto tienen sus propios criterios. Posiblemente, se deba combinar métricas cuantitativas (complejidad ciclomática, cobertura de tests, issues abiertos) y cualitativas (opinión del equipo, feedback de usuarios), como definir criterios internos de aceptación y tolerancia a deuda técnica.</li><li><strong>La deuda técnica depende de la evolución futura del sistema:</strong> Una decisión técnica solo se convierte en deuda técnica si el sistema evoluciona en una dirección que hace esa decisión limitante o problemática. Lo que hoy parece deuda, puede no serlo si el sistema no crece más; o lo que hoy no parece deuda, mañana puede ser un gran problema.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*80kJ5mKmLINZTik7ljsitg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o4djhMkk8vT5UjiYvZOmLQ.png" /></figure><h4><strong>Cuadrante de la Deuda Técnica</strong></h4><p>Se puede consultar este concepto en el siguiente <a href="https://martinfowler.com/bliki/TechnicalDebtQuadrant.html">link</a> de la página oficial de Martin Fowler. Él es un ingeniero de software británico, especializado en análisis y diseño orientado a objetos, UML, patrones de diseño, y metodologías de desarrollo ágil, incluyendo programación extrema (o tambien conocido como XP). También es conocido como uno de los firmantes del Manifiesto Ágil en 2001.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*llPhbzQKEyDHqM8XT9WgHw.png" /></figure><p>El cuadrante es una forma clara de entender qué tipo de deuda técnica se tiene y cómo se debería abordar. Permite entender ¿qué tan intencional es la deuda? y ¿cuánto riesgo se toma con la deuda? Se cuenta con 2 ejes (riesgo e intencionalidad) formando:</p><ul><li>Si es deliberada o inadvertida, es decir, si se sabía que se estaba generando o no.</li><li>Si es prudente o imprudente, es decir, si se hizo conscientemente, con justificación, o de forma negligente.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7AzLXFgvGTVSgkeLoGP9oA.png" /></figure><ul><li><strong>Deliberada + Prudente (ACEPTABLE) </strong>→ No se tiene tiempo para diseñar.<strong> </strong>El equipo es consciente de que está tomando deuda porque tiene razones válidas. Posiblemente se corre poco riesgo y se hará mejor o se arreglará más adelante. Son casos donde la deuda no es mala sino que se hace con cuidado. Por ejemplo, se necesita lanzar rápido una aplicación para validar el mercado. El lanzamiento de esta versión es sin tests automáticos porque se necesita feedback rápido.</li><li><strong>Deliberada + Imprudente</strong> <strong>(PROBLEMÁTICO) </strong>→ Se sabía que se estaba tomando deuda, pero al equipo no le importó, esta es una forma descuidada y poco profesional. Es la famosa deuda que se toma diciendo: <em>“no me importa”, “no lo se”, “lo haré igual a pesar de las consecuencias”</em>. A pesar de que el código es un desastre, no nos importa, le metemos igual.</li><li><strong>Inadvertida + Prudente (ACEPTABLE) </strong>→ Se debe embarcar ahora y afrontar las consecuencias. Suele pasar que a veces hay situaciones que no se saben que son deudas. Luego, se entienden y se analiza que es algo razonable que surgió. Por ejemplo, al principio se creía que la arquitectura era la adecuada, pero se aprendió algo nuevo que muestra que se necesita cambiar.</li><li><strong>Inadvertida + Imprudente (PROBLEMÁTICO)</strong> → Ahora el equipo sabe cómo debió haberlo hecho. El equipo no sabía que esto era deuda porque no se entendía bien lo que se estaba haciendo posiblemente por ignorancia o falta de experiencia. <em>“No teníamos idea de lo que hacíamos, y ahora nos damos cuenta de que hicimos las cosas mal”</em></li></ul><p>Cuando uno toma decisiones de diseño tiene que ser consciente del tipo de deuda, “marcando una cancha” observando que se toma y cual es el efecto. Este modelo ayuda a no tratar toda la deuda técnica de la misma manera. Como se puede observar, la deuda se prioriza dependiendo del tipo y así evaluar si vale la pena pagar. A veces, entender que no toda la deuda técnica es mala, es una decisión estratégica correcta. El equipo debe reconocer cuándo los problemas vienen por descuido o ignorancia, y reforzar esas capacidades como equipo de trabajo y no buscar culpables.</p><h4><strong>Conclusión</strong></h4><p>Se debe educar a todos los miembros de los diferentes equipos de trabajos de los proyectos. Este concepto no es solo conocimiento que deben saber los desarrolladores o líderes técnicos. Por ejemplo para empezar a gestionarla puedo tener una etiqueta <em>“tech debt”</em> en el issue tracker, incluir TD como parte de las hojas de ruta, selección de tecnologías, y otras actividades de planificación del desarrollo.</p><p>La deuda técnica es una metáfora poderosa y una realidad inevitable en el desarrollo de software reflejada por las decisiones que se toman, comprometiendo la calidad interna. La deuda técnica es gestionable si es visible, trazable y priorizable pero no todas las que aparecen son malas o urgentes. Su gestión es parte del proceso de evolución del sistema, no solo una tarea puntual que se debe resolver. La clave no es eliminar toda deuda, sino gestionar estratégicamente para que no comprometa la evolución, mantenibilidad y calidad a largo plazo.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5b353b6d7bec" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Una analogía para entender mejor la Deuda Técnica]]></title>
            <link>https://medium.com/@emabarboza/una-analog%C3%ADa-para-entender-mejor-la-deuda-t%C3%A9cnica-3aaace8b219a?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/3aaace8b219a</guid>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[software-design]]></category>
            <category><![CDATA[deuda-técnica]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Tue, 06 May 2025 22:12:49 GMT</pubDate>
            <atom:updated>2025-05-06T22:12:49.172Z</atom:updated>
            <content:encoded><![CDATA[<h4>Diseño de Software</h4><p>Para entender mejor el concepto de la deuda técnica (de ahora en más, DT) se puede citar una analogía con la <strong>deuda financiera</strong> usando conceptos de la toma de créditos, costos, intereses, pagos periódicos, etc. Por ejemplo, me encuentro en otro país de vacaciones y tengo una tarjeta de crédito. Usarla posiblemente es la forma más rápida de pagar algunas compras. Pero a cambio te comprometes a pagar esa deuda en cuotas con intereses, esto es lo que denominamos deuda financiera. Si no pagas a tiempo, la deuda crece y puede volverse difícil de manejar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hTA4HeaT2BzMkaBrDIEJ9w.png" /></figure><p>En el desarrollo de software, suele pasar algo similar cuando se toman decisiones rápidas como usar un atajo en el código, postergar la refactorización, no escribir pruebas, etc. ¿por qué haría esto? porque debo entregar más rápido y mostrar algo a los stakeholders. Pero se tiene que saber que en el futuro se tendrá que pagar ese <em>“interés”</em>, es decir más tiempo para corregir errores, menor calidad del producto, más dificultad para agregar nuevas funcionalidades, entre otras. El equipo tiene que ser consciente que a medida que va pasando el tiempo se debe ir mejorando el software y refactorizando porque ese interés tiene que ver con que a cualquiera le va a costar el doble.</p><p>¿Qué pasa si no pago mis deudas? Si no pagas la DT a tiempo, es decir, si no refactorizas, no mejoras el diseño, no limpias el código, con el tiempo el <em>“interés”</em> se acumula, o mejor dicho el software se vuelve más frágil, más caro de mantener, y cada cambio que se realice puede <em>“romper todo”</em>.</p><p>La adquisición de deuda puede ser buena para cumplir ciertos objetivos de negocio, salvo la deuda sumado a los intereses que no pueda luego pagarse. Se puede contar con 4 factores:</p><h4><strong>Principal o capital</strong></h4><ul><li>En deuda financiera, sería el dinero que se pidió prestado.</li><li>En deuda técnica, es el trabajo técnico que decidió postergar cómo refactorizar, escribir pruebas, o documentar.</li></ul><p>En definitiva, es la causa del problema. Por ejemplo se desarrolló un software que no está bien modularizado o no es difícil de testear.</p><p>Existe una diferencia entre una solución deseable y una solución basada en el compromiso que implica un trabajo necesario para “eliminar” la deuda donde en muchas ocasiones implica observar el route cost, es decir hacer un seguimiento desde cuando tomé la deuda.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RoikqhUI5R86MnRY-q8T1A.png" /></figure><h4><strong>Interés</strong></h4><ul><li>En deuda financiera es lo que pagas de más por usar ese dinero, se calcula sobre el principal.</li><li>En deuda técnica es el costo adicional que acumulas por no resolver esa deuda puede ser el tiempo adicional para entender el código, errores, retrabajo. Por ejemplo, cada vez que tengo que hacer un despliegue al ser un software problemático siempre tengo errores que aparecen.</li></ul><p>Existe un esfuerzo extra que se tiene en el sistema, debido a la solución basada en el compromiso y que se acumula a lo largo del tiempo ¿Donde veo este interés? lo más común es en el software. Todo lo que debo pagar en el tiempo por no haber hecho lo que debí haber hecho, es decir no haber elegido la solución buena sino haber elegido la más o menos. Las consecuencias son pérdida de productividad y calidad interna.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-ktTr4PZZ5YAJUww6F_K-A.png" /></figure><h4><strong>Tasa</strong></h4><ul><li>En deuda financiera, es el porcentaje anual que determina cuánto crece tu deuda.</li><li>En deuda técnica, es qué tan rápido crece el costo, esto depende de la complejidad del sistema, de cuánta gente toca ese código, de cuánto se expande el proyecto.</li></ul><p>Es como una <em>“bola de nieve”</em> cada cambio que se haga crece y se hace más lento porque hay un seguimiento de artefactos y procesos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tLf1kUXxg2zIEIn3zU0cew.png" /></figure><h4><strong>Tiempo</strong></h4><ul><li>En deuda financiera, es el período durante el cual debes pagar.</li><li>En deuda técnica, es cuánto tiempo pasa sin que se resuelva esa deuda.</li></ul><p>A medida que pasa el tiempo, es más difícil y caro. Se debe bajar la complejidad posiblemente re-escribiendo y re-testeando el software que implica tiempo.</p><p>Los pagos periódicos o el pago total pueden ser de interés y/o capital. Esto se traduce en reestructuración del sistema, baja de funcionalidad, etc. Es decir, puedo ir haciendo refactoring de a poco, es decir <em>“ir parando la pelota”</em> o hacer un refactoring entero para poder desplegar la solución.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VYT2kKgHSx8k3PSqdj7VrA.png" /></figure><h4>¿La DT es costo o valor?</h4><p>Mucha de la discusión de TD tiene que ver con su costo, es decir del esfuerzo de realizar desarrollo, mantenimiento, etc. Pero la TD o su pago también puede generar valor, si bien es más difícil de estimar que el costo. Se puede ver cómo son las features en el momento en que son entregados y del nivel de riesgo que se quiera tomar. Aquí es cuando entra la forma de comunicar cómo hacer refactoring.</p><ul><li>Costo — atributos de calidad de mantenibilidad, flexibilidad, evolvability, …</li><li>Valor — atributos como performance, escalabilidad, seguridad, confiabilidad, etc.</li></ul><p>¿Cuál es la forma de pagar DT? La DT se paga haciendo <strong>refactoring. </strong>Normalmente a la DT se la ve con <em>“ojos” </em>de costo, pero también la podría ver como valor. Para que alguien tome un refactoring, se tiene que mostrar que se ganó haciendo esto. Esta parte es la más difícil porque es algo interna, el PO en Scrum no lo ve como valor, no es algo que se ve externamente a través de pantallas. Sin embargo, a veces debo venderlo como valor o como algo que se gana. Y en este punto es clave darse cuenta de que si la DT que estoy evaluando es valor o no, porque si no gano nada, es mejor dejarlo como está.</p><p>La idea de la DT es que no se cambian features o no se agregan nuevas, sino que es un cambio organizacional interno. Las DT no son simplemente agarrar y tomarla sabiendo las consecuencias que pueden ocasionar a futuro.</p><h4>Conclusión</h4><p>Algunas consideraciones:</p><ul><li><strong>Los eventos pueden o no suceder dependiendo del contexto o de la evolución deseada para el sistema.</strong> Esto significa que no toda deuda técnica necesariamente se convierte en un problema. Por ejemplo: si se tiene un código mal escrito pero que ya no se usa termina siendo una funcionalidad obsoleta que nunca genere impacto. Si el sistema evoluciona en una dirección distinta, como decidir reemplazar un módulo por completo, esa deuda se vuelve irrelevante. Así, no todo lo que hoy parece deuda es problemático mañana, porque depende del contexto y las decisiones futuras que se tengan.</li><li><strong>El interés (o su tasa) no es proporcional, ni se aplica a todos los artefactos. </strong>A diferencia de la deuda financiera, donde la tasa es fija y conocida, en la deuda técnica, el interés no crece de forma lineal ni constante. Hay partes del sistema o módulos críticos donde una pequeña deuda puede generar enormes problemas, mientras que en otras partes, puede no generar casi ningún costo. El impacto depende del tipo de deuda, dónde está y cuánto afecta la evolución del producto.</li><li><strong>La deuda puede extinguirse, sin pagarse. </strong>En software, a veces la deuda técnica desaparece sola. Se recalca “a veces”, no “siempre”. Por ejemplo: se elimina un módulo viejo, y toda la deuda asociada a ella desaparece. O bien, se decide cambiar de tecnología, lo viejo posiblemente ya no importa; los objetivos del producto cambiaron, así ciertas mejoras ya no son necesarias; el sistema murió o quedo obsoleto, la DT muere con el sistema. A diferencia de la deuda financiera, donde siempre hay que pagar o negociar, dónde vienen <em>“2 señores con trajes”</em> a tocarte el timbre. En software puede haber situaciones donde la deuda simplemente deja de existir, porque el contexto cambia.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3aaace8b219a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[La importancia de la Deuda Técnica]]></title>
            <link>https://medium.com/@emabarboza/la-importancia-de-la-deuda-t%C3%A9cnica-031832fe591e?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/031832fe591e</guid>
            <category><![CDATA[requirements]]></category>
            <category><![CDATA[deuda-técnica]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Mon, 28 Apr 2025 13:44:12 GMT</pubDate>
            <atom:updated>2025-04-28T13:44:12.742Z</atom:updated>
            <content:encoded><![CDATA[<h4>Diseño de Software</h4><p>Es un término que se escucha mucho en la comunidad del desarrollo de software, se refiere al costo implícito de tomar decisiones rápidas en el desarrollo para acelerar la <strong>entrega </strong>, a costa de la <strong>calidad</strong> y la <strong>mantenibilidad</strong> a largo plazo del código. Esto quiere decir que uno toma un atajo sabiendo que tendrá consecuencias más adelante. Muchos dicen: “<em>Estas son las deudas que después pagaremos más adelante</em>”.</p><p>Se puede entenderlo como un balance entre <strong>velocidad y esfuerzo</strong> <strong>en el desarrollo</strong> cuando se quiere entregar cierta funcionalidad y al mismo tiempo se quiere <strong>calidad de software</strong>. O mejor dicho de otra manera es entregar algo rápido sin hacer mucho esfuerzo. En esta parte es cuando uno no piensa de forma óptima ni de forma genérica mirando al “todo”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/764/1*bX-0Sj67K2_243wYyrsfYw.png" /></figure><p>La Deuda Técnica (de ahora en más, DT) no necesariamente está relacionada con bugs en el software. Esto quiere decir que no todo lo que se hace mal o genera error es DT. Es más, muchas son realizadas de forma consciente y capaz no están hechas de la mejor manera. Hay muchos que se justifican diciendo que todos los sistemas tienen deuda técnica, <em>“¿Porque el nuestro no tendría?” </em>Este no es un buen argumento para justificar la DT.</p><p>Este concepto es atribuido por W. Cunningham en 1992 para comunicar el balance entre velocidad y re-trabajo en la entrega de software que funciona y con calidad. Este concepto está relacionado a otros como mantenimiento, evolución de software, obsolescencia, software aging, decay, re-ingeniería, etc.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/763/1*YoaPoZPlmEg4b162vxHV0w.png" /></figure><p>Existe una definicion de DT más amplia: “<em>In software-intensive systems, technical debt consists of design or implementation constructs that are expedient in the short term but that set up a technical context that can make a future change more costly or impossible. Technical debt is a contingent liability whose impact is limited to internal system qualities primarily, but not only, maintainability and evolvability.</em>” — Krutchen et al., 2019</p><p>Aquí te dejo el link del libro de Krutchen que habla de DT: <a href="https://ptgmedia.pearsoncmg.com/images/9780135645932/samplepages/9780135645932_Sample.pdf">https://ptgmedia.pearsoncmg.com/images/9780135645932/samplepages/9780135645932_Sample.pd</a>f</p><h4><strong>Decisiones de corto plazo VS largo plazo</strong></h4><p>Se tiene en cuenta visiones a corto, mediano y largo plazo donde ciertos “futuros” planificados pueden no ocurrir. Uno planifica capaz en sprints con objetivos posiblemente optimistas haciendo “futuros probables” sabiendo que los futuros más lejanos son los posiblemente no se cumplan. Por ejemplo, uno puede pensar en el <strong>largo plazo</strong>, como aplicar un patrón de diseño pensando que cambiará, un factory o un visitor, cubriendome en lo más posible, pero después no pasaron. Prácticamente, “El equipo trabajó por gusto”. También puede pasar al revés, me concentré en el <strong>corto plazo, </strong>sabiendo<strong> </strong>lo que puede pasar.</p><p>Puede ser que se tenga una 1° versión de un sistema que está evolucionando. Para la próxima versión, vienen requerimientos, y así se tiene otra versión. En cada evolución del sistema tengo que tomar decisiones, donde “<em>abro el paragua para cubrirme de la lluvia</em>”. Entonces, se puede tener:</p><ul><li>Dolor a corto plazo y placer a largo plazo</li><li>Placer a corto plazo y dolor a largo plazo</li></ul><p>Cuando uno acumula DT se genera cierta fricción entre el diseño y desarrollo de software porque al proyecto le cuesta generar más funcionalidades. Es como tener una mochila pesada llena de piedras, nos cuesta ir caminando de forma rápida.</p><p>Algunas características de la DT son:</p><ul><li>La DT es <strong>contingente</strong> ¿Que quiere decir esto? Esto significa que se puede manifestar o no, no es 100% seguro que se manifieste. Cuando uno<em> “patea”</em> algo a futuro no es algo que siempre pasa. Presenta una incertidumbre (o probabilidades) y horizonte de tiempo considerado donde tomar o tener deuda, en principio, no es <em>“ni bueno ni malo”</em>.</li><li>La DT son decisiones <strong>subóptimas, conscientes o inconscientes.</strong> Como se observa, las deudas pueden tomarse de forma inconsciente pero estas se trata de evitar.</li><li>La DT puede verse como un tipo de <strong>planificación estratégica</strong>.</li><li>La DT hace referencia a la <strong>calidad interna</strong> que tiene el software es decir aquellas que el usuario no ve a nivel interfaz del usuario (UI). El problema es que <em>“El sistema funciona igual, solo que adentro tiene algunos problemas”</em>. Si es externa es un bug, defecto funcional o algún requerimiento que no se contemple, no es deuda técnica.</li></ul><h4><strong>Tipos de deuda técnica</strong></h4><p>La DT se manifiesta en distintos artefactos como código, diseño, tests, documentación, despliegue, etc. Es así que existe una clasificación de DT dependiendo de donde puede presentarse.</p><p>En definitiva hay distintos tipos de DT o “distintos sabores”, todos son malos, o todos nos pueden llegar a perjudicar pero no es que son netamente de código o de diseño.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/785/1*g06xU-kxC5XO09omBcPcXA.png" /></figure><p>Entonces, el código es la principal fuente importante (como artefacto), pero no es el único.</p><h4><strong>Casos de DT</strong></h4><p>Existe un problema <em>“viejo”</em>, del cuál se ha tomado mayor conciencia en los últimos años que son las técnicas ingenieriles para su gestión que abarca distintos tipos de sistemas , incluso aquellos con AI/ML.</p><p>Hay un caso clásico y conocido de DT, relacionado con la <strong>Reglas If-then-else, </strong>en donde una compañía en Canadá desarrolló un software para sus clientes locales. El inglés fue usado como primer idioma, moneda, etc. Luego, se extendió al resto de Canadá y debió adaptar el software al Francés, es decir tambien el idioma, moneda, etc. La adaptación fue realizada en 1 semana con una variable global. Un mes después, el área comercial vendió el software como multi-lenguaje en Japón donde la adaptación al Japonés se hizo en 1 semana.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/762/1*In7BjTbl-WVL7YkDopaKLQ.png" /></figure><p>La configurabilidad del sistema se hizo un spaghetti por tener varios idiomas. Se debió pensar en alguna solución general para varios idiomas que tengan tantos if, then, else. El spaghetti está dentro del sistema, es algo que no se observa, no es un bug porque sería distinto el caso de que seleccione japonés y me aparezca el sistema en francés.</p><p>Los sistemas desarrollados como monolitos presentan este tipo de situaciones. Pero ¿Puedo cambiar a microservicios? y ¿Cuándo? Esa sería una buena pregunta para plantearse, va a depender mucho del contexto. Este tipo de situaciones pasa casi todo el tiempo, porque plantea un retrabajo. El cliente suele pensar que es algo fácil y urgente, diciendo: ¿Por qué no puedes pasar al japonés, si antes pudiste pasar a francés?</p><h4><strong>El diagnóstico de la DT</strong></h4><p>Cuando uno quiere hacer un diagnóstico de un sistema que ya existe, y tiene un cierto desarrollo con tems de DT, hacer esto me va a permitir definir causas, consecuencias y síntomas sirve para entender cómo se originó, qué impacto tiene y cómo se manifiesta la deuda.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/765/1*IuWMYb81zaQ8IHAYQ_z_Ow.png" /></figure><ul><li><strong>Causas</strong>: son los factores que originaron la deuda. Necesito las causas porque si tengo problemas tengo que atacar por aquí, si es que puedo atacar. Por ejemplo: apuro por una entrega, falta de conocimiento, cambios de requerimientos, malas prácticas, falta de revisiones de código.</li><li><strong>Consecuencias</strong>: son los efectos negativos que trae la deuda si no se aborda. En este punto es clave priorizar para ver si es grave. Por ejemplo: aumento de costos de mantenimiento, la UX se degrada, el timeout es muy alto, menor velocidad de entrega, frustración del equipo, riesgos de fallos en producción.</li><li><strong>Síntomas</strong>: son las señales que te muestran que la DT está ahí. Por ejemplo: código difícil de entender, muchas pruebas fallando, tiempos largos para hacer cambios, bugs recurrentes, concurrencias de módulos.</li></ul><p>Si se vuelve al ejemplo del sistema multi-lenguaje:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/545/1*t5gmIzZYWjRxR5-vvaGsBg.png" /></figure><ul><li><strong>Causa</strong>: Los desarrolladores completaron la 1° versión a tiempo para la<br>demo, pero bajo presión de calendario.</li><li><strong>TD</strong>. dispersión de lógica para gestión de idiomas en distintos módulos. No se consideró internacionalización.</li><li><strong>Consecuencias</strong>: el código es frágil y susceptible a errores (en idiomas anteriores) al querer agregar un nuevo idioma.</li><li><strong>Síntoma</strong>: demoras y complicaciones para agregar soporte para un tercer idioma</li></ul><p>Otro caso de DT es el famoso caso de la<strong> </strong>fusión de 2 compañías financieras donde fue necesario integrar sus respectivos sistemas de software. Dado que los sistemas tenían incompatibilidades, se decidió crear un “nuevo sistema” desde cero, con nuevas tecnologías. En poco tiempo, se construyeron 2 sistemas que remplazaron exactamente a los anteriores, a fin de proveer demos a los stakeholders. Las demos tuvieron buena performance</p><p>Varios meses después, ambos sistemas seguían en <em>“proceso de integración”</em> pero con problemas serios de interoperabilidad y escalabilidad. Las miles de líneas de código estaban desarrolladas sin una arquitectura planificada. Muchas cuestiones de DT suelen enmarcarse porque no tienen un diseño claro o planificado. Sin embargo, aun teniendo una buena arquitectura se puede tener DT.</p><h4>Conclusión</h4><p>En DT parece un problema conocido como <em>“Hitting the wall”</em> donde en un momento no vas ni para atrás ni para adelante. Existe una dificultad de cambiar cosas, de testear, de evolucionar, el famoso <em>“apretas un botón y se rompe todo”</em>. La idea es tratar de frenar antes y <em>“tomar al toro por las astas”</em> porque cuando uno tiene más <em>“cancha”</em> ya empieza a olfatear cuando tiene este tipo de problemas.</p><p><a href="https://verraes.net/2020/01/wall-of-technical-debt/">The Wall of Technical Debt</a></p><p>Algunas conclusiones de los casos de sistemas que se menciono:</p><ul><li>Demasiada fricción para seguir desarrollando nuevos features y atender atributos de calidad del sistema.</li><li>Es común que el diseño (original) se degrade</li><li>La arquitectura emerge sin una planificación adecuada</li><li>La DT suele existir en situación recurrente de ciertos proyectos o contextos de desarrollo ágil.</li></ul><p>Si uno puede olfatear estas cosas, esto implica que puedo identificarlas y existen métricas. Puedo decir ¿De cuánto es mi deuda? Muchas veces pagar esa deuda no depende del proyecto sino posiblemente de un manager donde los desarrolladores deben convencerlos para pagarla, es decir tiene que existir un tiempo para revisar, corregir, replantear, retrabajar y refactorizar porque sino es difícil pagarla.</p><p>La idea de tener métricas es observar si la DT va creciendo, disminuyendo o que sucede. En la práctica es difícil tratar de controlar o monitorearla.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/784/1*4EVNJEqZ054GmnyR33E3zw.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=031832fe591e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Una Guía para instalar React Native en Ubuntu 22.04.5 LTS]]></title>
            <link>https://medium.com/@emabarboza/una-gu%C3%ADa-para-instalar-react-native-en-ubuntu-22-04-5-lts-4d417eca1020?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/4d417eca1020</guid>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[react-native-development]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[react-programming]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Sun, 20 Apr 2025 16:15:37 GMT</pubDate>
            <atom:updated>2025-04-20T21:14:30.188Z</atom:updated>
            <content:encoded><![CDATA[<h4>React Native</h4><p>En el desarrollo de aplicaciones móviles ademas de React Native, pueden estar entre los reconocidos: Flutter y Cordova. Todos son frameworks para desarrollar aplicaciones móviles multiplataforma, pero tienen enfoques muy distintos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/913/1*cB1wbmvd7JNyfLEC_Z5JqA.png" /></figure><p>React Native es una herramienta poderosa que permite a los desarrolladores de software crear aplicaciones móviles multiplataforma, es decir que funcionen tanto en iOS como en Android, utilizando JavaScript. React native es una librería de React, siendo esta última también una librería de JavaScript.</p><p>¿Por qué elegir React Native?</p><ul><li><strong>Eficiencia de código</strong>: se escribe el código una vez y se ejecuta en dos plataformas, reduciendo los costos de desarrollo.</li><li><strong>Comunidad activa</strong>: cuenta con un extenso soporte gracias a una gran comunidad de desarrolladores que aporta soluciones y mejoras.</li><li><strong>Experiencia de usuario</strong>: ofrece un rendimiento similar a las aplicaciones nativas, mejorando la experiencia del usuario en iOS y Android.</li></ul><p>Para escribir código es necesario tener instalado Visual Studio Code.</p><p><a href="https://code.visualstudio.com/">Visual Studio Code - The open source AI code editor | Your home for multi-agent development</a></p><p>Esta herramienta es una de la más populares entre los desarrolladores debido a su versatilidad y soporte para extensiones. Tambien, antes de comenzar es clave revisar la documentación oficial de React Native: <a href="https://reactnative.dev/">https://reactnative.dev/</a></p><figure><img alt="Fuente: https://reactnative.dev/" src="https://cdn-images-1.medium.com/max/1024/1*EgW5krjLYS1qVr9thmF_9w.png" /><figcaption>Fuente: <a href="https://reactnative.dev/">https://reactnative.dev/</a></figcaption></figure><p>Un dato interesante es que Microsoft desarrollo una extensión de React Native para poder crear aplicaciones nativas para Windows y macOS.</p><p><a href="https://microsoft.github.io/react-native-windows/">React Native for Windows + macOS · Build native Windows &amp; macOS apps with Javascript and React</a></p><h4><strong>¿Qué necesitas antes de empezar a tener tu aplicación React Native?</strong></h4><p>Antes que nada, se actualiza el índice de paquetes:</p><pre>sudo apt update</pre><p>Ahora bien, se necesita Node.js que nos permite crear servidores, aplicaciones web, herramientas de línea de comandos y scripts. Es un entorno de ejecución de JavaScript gratuito, de código abierto y multiplataforma.</p><p><a href="https://nodejs.org/en">Node.js - Run JavaScript Everywhere</a></p><p>En mi caso, estoy usando Ubuntu 22.04.5 LTS de 64-bit que reconoce <a href="https://nodejs.org/en/download">https://nodejs.org/en/download</a>. Se muestra:</p><pre># Download and install nvm:<br>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash<br><br># in lieu of restarting the shell<br>\. &quot;$HOME/.nvm/nvm.sh&quot;<br><br># Download and install Node.js:<br>nvm install 22<br><br># Verify the Node.js version:<br>node -v # Should print &quot;v22.14.0&quot;.<br>nvm current # Should print &quot;v22.14.0&quot;.<br><br># Verify npm version:<br>npm -v # Should print &quot;10.9.2&quot;.</pre><p>Las pruebas en el desarrollo de aplicaciones es interesante e importante, para ello, realice pruebas con un emulador para aplicaciones Android y en el caso de aplicaciones iOS realice la prueba con dispositivo real ya que tengo un Iphone 13 Pro Max. Contar con estos recursos es crucial para aquellos que trabajan con aplicaciones móviles en diferentes sistemas operativos.</p><p>Primero, instale Android Studio del sitio oficial:</p><p><a href="https://developer.android.com/studio?hl=es-419">Cómo descargar Android Studio y App Tools - Android Developers</a></p><p>Expo es un framework de React Native que ofrece funciones como enrutamiento basado en archivos, bibliotecas universales y la capacidad de escribir complementos que modifican el código nativo sin tener que administrar archivos nativos. Ahora bien, la instalación de Expo CLI ha cambiado porque no es necesario instalarlo de forma global en nuestro sistema (antes era así) sino que recomiendan instalarlo por proyecto. De esta forma se evitan conflictos entre diferentes proyectos a la hora de actualizar.</p><p><a href="https://docs.expo.dev/get-started/set-up-your-environment/">Set up your environment</a></p><p>En mi instalación de Android Studio me faltaban las tools para ello debí ejecutar:</p><pre>sudo apt-get install android-tools-adb</pre><p>Además agregé las siguientes lineas al archivo bashrc para<strong> </strong>configurar la variable de entorno ANDROID_HOME<strong>:</strong></p><pre>nano ~/.bashrc</pre><p>Al final del archivo se agrega y guarde:</p><blockquote><em>export ANDROID_SDK_ROOT=$HOME/Android/Sdk</em></blockquote><blockquote><em>export ANDROID_HOME=$HOME/Android/Sdk</em></blockquote><blockquote><em>export PATH=$PATH:$ANDROID_HOME/emulator</em></blockquote><blockquote><em>export PATH=$PATH:$ANDROID_HOME/platform-tools</em></blockquote><p>Abrí mi proyecto en Android Studio:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D5MD6Y3-m3cHSZ8e_M8PiQ.png" /></figure><p>Se puede observar que en el lado derecho se puede ejecutar un emulador de dispositivo. Puedo elegir entre varios dispositivos android, la idea es buscar uno estándar:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/835/1*7vJUy_J_pBhX8UCr_iiXkg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/777/1*rXwMXHGJydmq3U0edK_SoQ.png" /></figure><p>Una vez realizada todas estas configuraciones de Node.js y del emulador.</p><p><strong>Primera opción:</strong> para crear un proyecto minimalista es decir con lo justo para arrancar se debe ejecutar el siguiente comando en la terminal:</p><pre>npx create-expo-app@latest --template blank</pre><p><strong>Segunda opción: </strong>sin embargo se puede crear una versión actualizada donde se generan más carpetas por default y además se instala TypeScript.</p><pre>npx create-expo-app@latest</pre><p>Una vez ejecutado este último comando, se solicita el nombre del proyecto:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/914/1*dzEJUPWY0O5BlRm7ShrSlw.png" /></figure><p>Escribo el nombre del proyecto y observamos que se ejecuta npm install para instalar todas las dependencias.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/580/1*FghpUZlDJLAXgcNygA4_5w.png" /></figure><p>En mi caso al final termino con <em>“found 0 vulnerabilities”</em></p><p><em>✅ </em><strong><em>Your project is ready!</em></strong></p><p><strong><em>To run your project, navigate to the directory and run one of the following npm commands.</em></strong></p><p><strong><em>- cd My_First_App_React_Native<br>- npm run android<br>- npm run ios # you need to use macOS to build the iOS project — use the Expo app if you need to do iOS development without a Mac<br>- npm run web</em></strong></p><p>La estructura de carpetas es bastante clara:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/407/1*zh2Ol5wQmSDZDeavhk8z1A.png" /></figure><ul><li><strong>app</strong>: suele contener las pantallas principales o vistas de la aplicación como Home.tsx, Login.tsx, Profile.tsx). A veces incluye subcarpetas como navigation/, screens/ o routes/.</li><li><strong>assets</strong>: contiene todos los archivos estáticos que la aplicación puede usar como imágenes, fuentes, íconos, videos, sonidos, etc.</li><li><strong>components: </strong>posee todos los componentes reutilizables de UI, es decir los que se usan en varios lados. Ej: Button.tsx , Card.tsx yHeader.tsx</li><li><strong>constants: </strong>contiene las variables que no cambian: colores, rutas, estilos globales, tamaños, etc.</li><li><strong>hooks</strong>: comunmente son los Hooks personalizados de React que ayudan a extraer lógica reutilizable de tus componentes.</li><li><strong>node_modules: </strong>son todas las dependencias que instalás con npm o yarn.</li><li><strong>scripts</strong>: son los scripts personalizados que podés correr con <strong>npm run. </strong>Por ejemplo: para generar assets, limpiar el cache, o deployar.</li><li><strong>app.json</strong>: es la configuración general de la app donde se describe nombre, ícono, tema, orientación, etc. Expo lo usa para compilar tu app para Android, iOS y Web.</li><li><strong>package-lock.json</strong>: este archivo es generado automáticamente por npm y asegura que todos los integrantes que trabajen en el proyecto tengan exactamente las mismas versiones de librerías.</li><li><strong>package.json: este a</strong>rchivo es clave porque aquí se definen dependencias, scripts, nombre del proyecto, etc. Cuando se ejecutanpm install, este archivo guía qué se debe instalar.</li></ul><p>Ahora bien, se ejecuta:</p><pre>npm run android</pre><p>Una vez ejecutado el comando, como no tenía instalado Expo Go en el emulador, automáticamente se instala y se abre la aplicación.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yF-BDWmBa1psOxqCljgUQg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/532/1*GLt-JHaoZJBQawl15V3WZw.png" /></figure><p>Para pruebas reales, primero se debe asegurar de estar conectado en la misma red einstalar Expo Go en el dispositivo (esto es si quieres hacer pruebas con tu celular, ya sea Android o iOS) y escanear con la cámara el QR que se genera:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/809/1*gCj56bDBTJxHK6Sx0Z6Egg.png" /></figure><p>Si modificamos el código de app.js</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/872/1*5yh8kUAfYMwelNw60HgUuQ.png" /></figure><p>Se puede observar el cambio reflejado:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*F5wbyeyFC2k-VEzekiow-Q.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4d417eca1020" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Efectos en React]]></title>
            <link>https://medium.com/@emabarboza/efectos-en-react-b6deca2f97d4?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/b6deca2f97d4</guid>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[react-hook]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[reactive-programming]]></category>
            <category><![CDATA[react-native]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Wed, 16 Apr 2025 14:09:08 GMT</pubDate>
            <atom:updated>2025-04-16T14:09:08.251Z</atom:updated>
            <content:encoded><![CDATA[<h4>React</h4><p>Existe un problema de lógica pesada, en donde los componentes son más complejos o pesados generando demora de algunos segundos como consultas a API, condicionales, etc. Al tener que renderizar nuestro componente, toda la logica, incluso la complicada tiene que volver a renderizarse y por tanto repetir esa logica pesada.</p><p>Podemos consultar:</p><p><a href="https://react.dev/reference/react/useEffect">useEffect - React</a></p><p>Una solución son los <strong>efectos </strong>que<strong> </strong>son una herramienta que nos permite encapsular una lógica pesada o demorada y protegerlos para que únicamente se ejecuten cuando lo necesitamos, sin retrasar procesos. Para utilizar los efectos en React, empleamos el hook <em>useEffect</em>.</p><p>Al iniciar la página por primera vez se ejecutan todas las funciones, pero al cambiar el estado no siempre se va a volver a correr el código dentro del <em>useEffect</em>, sino que este se volverá a correr únicamente cuando cambie un estado específico que se le indique. Asi se ejecuta únicamente cuando es estrictamente necesario, evitando que se repitan en cada renderización del componente. De esta manera, mejora la eficiencia y rendimiento de nuestras aplicaciones. Por ejemplo:</p><pre>import React, { useEffect, useState } from &#39;react&#39;;<br><br>function Contador() {<br>  const [contador, setContador] = useState(0);<br><br>  useEffect(() =&gt; {<br>    document.title = `Contador: ${contador}`;<br>  }, [contador]); // solo se ejecuta cuando cambia &quot;contador&quot;<br><br>  return (<br>    &lt;div&gt;<br>      &lt;p&gt;Has hecho clic {contador} veces&lt;/p&gt;<br>      &lt;button onClick={() =&gt; setContador(contador + 1)}&gt;<br>        Aumentar<br>      &lt;/button&gt;<br>    &lt;/div&gt;<br>  );<br>}</pre><p>Se cuenta con:</p><ul><li><strong>Primer argumento:</strong> Recibe una función que encapsula la lógica que queremos ejecutar o una función que es la lógica pesada.</li><li><strong>Segundo argumento:</strong> Es un array de dependencias que determina cuándo se debe ejecutar el efecto. Si es un array vacío y actualizamos cualquier estado, no va a volver a correr ese código al renderizar. Si por otro lado el Array contiene un estado o varios estados, entonces la lógica se volverá a correr únicamente cuando el render sea ocasionado por cambios en esos estados que se especifico dentro del array. Es importante recalcar que si no hay ninguna variable en la lista de dependencias, el efecto se ejecutará en cada renderización.</li></ul><p>Entonces lo uso cuando quiero realizar:</p><ul><li>Llamadas a APIs</li><li>Escuchar eventos del navegador</li><li>Temporizadores</li></ul><p>Al encapsular una parte de nuestra lógica dentro de useEffect, el orden de ejecución cambia. La lógica del efecto se ejecuta después del resto del código en el componente.</p><pre>console.log(&#39;log1&#39;);<br>useEffect(() =&gt; {<br>  console.log(&#39;log2&#39;);<br>}, []);<br>console.log(&#39;log3&#39;);</pre><p>Los logs se imprimen en este orden:</p><ol><li>log1</li><li>log3</li><li>log2</li></ol><p>Esto ocurre porque el efecto se ejecuta después del render inicial. Al final una vez que se ha cargado por primera vez nuestro componente y llame un re-renderizado para que cambie nuestro mensaje temporal de “<em>cargando</em>” por la información necesaria. El array de dependencias dentro de useEffect decide si el efecto debe ejecutarse después de cada render o sólo bajo ciertas condiciones. Si se proporciona un array vacío, el efecto se ejecuta únicamente una vez, al montar el componente:</p><pre>useEffect(() =&gt; {<br>  console.log(&quot;Efecto con array vacío, ejecutado una vez.&quot;);<br>}, []);</pre><p>Si incluimos dependencias, el efecto se ejecutará cada vez que las dependencias cambien:</p><pre>useEffect(() =&gt; {<br>  console.log(&quot;Efecto ejecutado cada vez que &#39;estado&#39; cambia.&quot;);<br>}, [estado]);</pre><p>Aquí, el efecto se desencadena siempre que el valor de estado se modifica.</p><p>Implementar useEffect no solo mejora la eficiencia de nuestra aplicación sino también la experiencia del usuario. Muchas veces, sabemos que se tardaran unos segundos en obtener los datos para luego montarlos en un componente para ser renderizados. La aplicación responde más ágilmente, evitando esperas innecesarias o sobrecarga de procesos. Introduce mejoras simples, pero significativas en el desempeño y usabilidad. Además, asegúrate de mantener una buena práctica en la gestión de estados para ofrecer a los usuarios interacciones fluidas y efectivas.</p><h4>Conclusión</h4><p>Los efectos son una herramienta o un react hook que permiten ejecutar cierta parte del código de nuestros componentes para que no se ejecuten cada vez que hacemos render de nuestro componente, sino, dependiendo de ciertas condiciones.</p><ul><li>Se puede enviar un array vacío para indicarle a nuestro efecto que se ejecuta solo una vez, cuando recién hacemos el primer render de nuestro componente.</li><li>Se puede enviar un array con distintos elementos para decirle a nuestro efecto que no solo ejecute el efecto en el primer render, sino también cuando haya cambios en esos elementos del array.</li><li>Si no se envia ningún array como segundo argumento de nuestro efecto, esta función se ejecutará cada vez que nuestro componente haga render (es decir, cada vez que haya cambios en cualquiera de nuestros estados).</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b6deca2f97d4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[El problema del prop drilling y React Context]]></title>
            <link>https://medium.com/@emabarboza/el-problema-del-prop-drilling-y-react-context-c0670c4c2cd1?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/c0670c4c2cd1</guid>
            <category><![CDATA[frontend-development]]></category>
            <category><![CDATA[css]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[reactjs]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Wed, 16 Apr 2025 01:01:43 GMT</pubDate>
            <atom:updated>2025-04-16T01:01:43.485Z</atom:updated>
            <content:encoded><![CDATA[<h4>React</h4><p>El desarrollo de aplicaciones React no termina con la interactividad básica. A medida que una aplicación o software crece, es necesario adaptarse a nuevas prácticas, herramientas y mecanismos de organización que faciliten el desarrollo sostenible y escalable.</p><p>En algunas ocasiones, los eventos se envían como props a los componentes, permitiendo que sean manejados de manera centralizada en el componente padre. Para mantener una comunicación fluida entre componentes y estados, se utilizan las props para enviar datos entre ellos.</p><p>Sin embargo, este enfoque puede volverse complicado si el número de props es elevado, generando un problema conocido como “<em>prop drilling</em>”. Entonces, <strong>prop drilling</strong> (o “<em>perforar props</em>”) ocurre cuando se quiere pasar datos a través de varios componentes intermedios que no los necesitan directamente, es decir solo para que lleguen a un componente más profundo que sí los usa. Entonces:</p><ul><li>Los componentes intermedios se ensucian con props que no les importan</li><li>El código es difícil de mantener y escalar</li><li>Aumenta la dependencia entre componentes</li></ul><p>Por ejemplo, tenemos este problema:</p><pre>function App() {<br>  const usuario = &quot;Emanuel&quot;;<br>  return &lt;Padre usuario={usuario} /&gt;;<br>}<br><br>function Padre({ usuario }) {<br>  return &lt;Hijo usuario={usuario} /&gt;;<br>}<br><br>function Hijo({ usuario }) {<br>  return &lt;Nieto usuario={usuario} /&gt;;<br>}<br><br>function Nieto({ usuario }) {<br>  return &lt;p&gt;Hola, {usuario}!&lt;/p&gt;;<br>}</pre><p>Aqui todos los componentes deben recibir usuario aunque solo Nieto lo necesita. Se tiene un paso del desarrollo que ocurre cuando necesitamos obtener datos que están en varias capas en el árbol de componentes React, como un “túnel” o “perforación” de props a través de múltiples niveles de componentes. Esto se ve siempre cuando pasamos props entre hijos, luego ese a otros hijos y así sucesivamente. Este fenómeno ocurre cuando se pasa una propiedad (prop) a través de múltiples niveles de componentes, aunque los componentes intermedios no necesiten esa propiedad en particular.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/604/0*A0ab6SNdW5xisIfS" /></figure><p>La idea es pasar información de manera más directa entre los componentes.</p><p>El prop drilling puede ser una desventaja, como hacer que el código sea más complejo y difícil de mantener, ya que las props deben pasar por varios componentes intermedios, dificultando los cambios en la estructura de los componentes. La idea es mejorar la eficiencia y la escalabilidad del código, ya que el mismo puede ser menos legible y más propenso a errores. Sin embargo, el prop drilling puede ser una solución adecuada en situaciones simples y pequeñas, y no siempre es problemático.</p><h4><strong>React Context</strong></h4><p><em>¿Cuál es la Solución?</em> <strong>React Context </strong>es una herramienta que permite crear estados globales para evitar el problema de prop driling en nuestras app. Podemos consultar:</p><p><a href="https://legacy.reactjs.org/docs/context.html">Context - React</a></p><p>Entonces, context es un elemento que podemos crear para establecer una comunicación directa entre un componente en un nivel muy alto y uno en un nivel mucho más bajo. De esta manera, podemos acceder a los valores de forma directa. Del ejemplo anterior:</p><pre>// 1. Crear el contexto<br>const UsuarioContext = React.createContext();<br><br>// 2. Envolver tu árbol de componentes<br>function App() {<br>  return (<br>    &lt;UsuarioContext.Provider value=&quot;Emanuel&quot;&gt;<br>      &lt;Padre /&gt;<br>    &lt;/UsuarioContext.Provider&gt;<br>  );<br>}<br><br>// 3. Usar el contexto donde se necesita<br>function Nieto() {<br>  const usuario = React.useContext(UsuarioContext);<br>  return &lt;p&gt;Hola, {usuario}!&lt;/p&gt;;<br>}</pre><p>Muy similar a una nube donde se puede almacenar funcionalidades, estados, datos, etc. que necesitan ser compartidos entre diferentes componentes de una aplicación. Una analogía, es como una biblioteca compartida, donde quiero compartir recursos como libros, revistas, etc. a compañeros del trabajo. En lugar de pasar los libros de mano en mano entre los compañeros de trabajo, se puede poner todo en una biblioteca compartida en el edificio del trabajo o en englobarlos en un Google Drive, lo que hace que sea más fácil para todos acceder a los recursos que necesitan.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/730/0*Xa1aS3NyAXr--7zN.jpg" /></figure><p>De manera similar, se guardan datos que necesitan ser compartidos entre diferentes componentes de tu aplicación en una “<em>biblioteca compartida</em>”, lo que facilita el acceso a estos datos desde cualquier lugar de tu aplicación sin tener que pasarlos manualmente a través de múltiples niveles de componentes.</p><h4><strong>useContext</strong></h4><p>Es altamente recomendable utilizar el hook <em>useContext() </em>al comenzar un proyecto desde cero, ya que es una forma cómoda e incluso estetica. Asi, me permite acceder a un contexto (Context) directamente dentro de un componente. Sin embargo otra forma es usar &lt;TodoContext.Consumer&gt; que es la forma más antigua de trabajar contextos en versiones anteriores de React.</p><p>En caso de que no se quiera cambiar los nombres de las propiedades, se puede redefinirlos en el objeto. Algo útil si tenemos que cambiar muchas propiedades en muchos sitios.</p><ol><li>Creamos el contexto</li></ol><pre>import React, { createContext, useContext } from &#39;react&#39;;<br><br>// Creamos el contexto<br>const UsuarioContext = createContext();</pre><p>2. Proveemos el contexto</p><pre>function App() {<br>  const usuario = &quot;Emanuel&quot;;<br><br>  return (<br>    &lt;UsuarioContext.Provider value={usuario}&gt;<br>      &lt;ComponentePadre /&gt;<br>    &lt;/UsuarioContext.Provider&gt;<br>  );<br>}</pre><p>Provider es lo que &quot;envuelve&quot; los componentes que necesitan acceso al dato.</p><p>3. Usamos el contexto</p><pre>function ComponentePadre() {<br>  return &lt;ComponenteHijo /&gt;;<br>}<br><br>function ComponenteHijo() {<br>  return &lt;ComponenteNieto /&gt;;<br>}<br><br>function ComponenteNieto() {<br>  const usuario = useContext(UsuarioContext);<br><br>  return &lt;p&gt;Hola, {usuario}!&lt;/p&gt;;<br>}</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c0670c4c2cd1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Custom Hooks]]></title>
            <link>https://medium.com/@emabarboza/custom-hooks-5cd36517ed88?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/5cd36517ed88</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[hooks-in-react]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Wed, 16 Apr 2025 01:00:59 GMT</pubDate>
            <atom:updated>2025-04-16T01:00:59.897Z</atom:updated>
            <content:encoded><![CDATA[<h4>React</h4><p>Los Custom Hooks son una forma de reutilizar lógica de componentes en React usando funciones. Como la lógica de la aplicación es compleja, la idea es abstraer esa parte para que quede mucho más limpia y asi poder reutilizar.</p><p>Los Hooks son funciones que puedes llamar dentro de componentes funcionales para agregar y manipular características de React, como el estado, el ciclo de vida y los efectos secundarios. Algunos links utiles:</p><p><a href="https://legacy.reactjs.org/docs/hooks-intro.html">Introducing Hooks - React</a></p><p>Los Hooks más comunes son<strong> useState, useEffect y useContext</strong>, pero también puedes crear tus propios hooks personalizados, por ejemplo para obtener datos, para mantener un seguimiento de si un usuario está conectado, para conectarse a una sala de chat, para manejar tareas específicas, para una autenticación, para manejar el estado de carga y respuesta, para el manejo de formularios, la gestión de datos, etc. Hay que tener en cuenta:</p><ul><li>Empieza con la palabra <em>use</em> por convención.</li><li>Hay otros hooks como useState, useEffect, useContext, etc.</li><li>Con la abstracción del Hooks nos facilita la lectura del código.</li><li>El código es más modular, legible y reutilizable.</li><li>Permite extraer y reutilizar lógica entre componentes de forma limpia y organizada. Se comparte la lógica y se tiene el código del componente mucho más limpio.</li><li>¿Cuándo vale la pena implementarlo? cuando sea necesario abstraer una lógica.</li></ul><p>Los Hooks son más restrictivos que las funciones regulares. Solo puedes llamar a los Hooks <em>en el primer nivel</em> de tus componentes (u otros Hooks). Esta herramienta te permiten agregar y manejar el estado en componentes funcionales, lo cual antes solo era posible en componentes de clase utilizando el estado del constructor y los métodos del ciclo de vida. Con los Hooks, puedes usar el estado en componentes funcionales sin necesidad de convertirlos en componentes de clase.</p><ul><li><strong>useState</strong>: permite agregar y actualizar el estado en componentes funcionales. Recibe un valor inicial y devuelve un array con dos elementos: el estado actual y una función para actualizarlo.</li><li><strong>useEffect</strong>: permite ejecutar efectos secundarios en componentes funcionales. Puedes usarlo para realizar tareas como hacer llamadas a API, suscribirte a eventos o limpiar recursos. Se ejecuta después de que el componente se haya renderizado.</li><li><strong>useContext</strong>: permite acceder al contexto de React en componentes funcionales. Te da acceso al valor actual del contexto definido en un componente superior utilizando el componente<em> Context.Provider</em>.</li><li><strong>useRef</strong>: permite mantener una referencia mutable en componentes funcionales. Puede ser útil para acceder directamente a un elemento del DOM o para almacenar valores que persisten a través de re-renderizados.</li></ul><p>Los Hooks solo pueden ser llamados en el nivel superior de un componente de función y no dentro de bucles, condiciones o funciones anidadas. Por ejemplo:</p><pre>import { useState } from &quot;react&quot;;<br><br>function useContador(valorInicial = 0) {<br>  const [contador, setContador] = useState(valorInicial);<br><br>  const incrementar = () =&gt; setContador(contador + 1);<br>  const decrementar = () =&gt; setContador(contador - 1);<br>  const resetear = () =&gt; setContador(valorInicial);<br><br>  return { contador, incrementar, decrementar, resetear };<br>}</pre><p>Se puede usar en un componente:</p><pre>function Contador() {<br>  const { contador, incrementar, decrementar, resetear } = useContador(5);<br><br>  return (<br>    &lt;div&gt;<br>      &lt;h2&gt;Contador: {contador}&lt;/h2&gt;<br>      &lt;button onClick={incrementar}&gt;+&lt;/button&gt;<br>      &lt;button onClick={decrementar}&gt;-&lt;/button&gt;<br>      &lt;button onClick={resetear}&gt;Reset&lt;/button&gt;<br>    &lt;/div&gt;<br>  );<br>}</pre><h4>Conclusión</h4><p>Algunas consideraciones sobre el uso de Custom Hooks:</p><ul><li>Decidir cuándo implementar Custom Hooks depende del criterio y la experiencia del desarrollador. No hay una regla estricta, pero en general se recomienda crear un custom hook cuando: se tiene lógica de estado o efectos que se repite en varios componentes, separar la lógica de negocio del componente de UI, la lógica empieza a crecer y hace que el componente principal se vuelva difícil de leer</li><li>La abstracción de lógica compleja en Custom Hooks puede facilitar el mantenimiento y la legibilidad del código. Con custom hooks se permite ocultar los detalles y mostrar solo lo que importa en el componente.</li><li>La práctica y la experimentación son esenciales para desarrollar un buen criterio sobre cuándo y cómo usar Custom Hooks. Algunos errores comunes al principio pueden ser crear hooks demasiado genéricos (que no aportan valor real), abstraer cosas que solo se usan una vez y crear hooks que hacen demasiadas cosas distintas<strong>.</strong></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5cd36517ed88" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Estados en React]]></title>
            <link>https://medium.com/@emabarboza/estados-en-react-e6a32b9ee6fb?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/e6a32b9ee6fb</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[frontend-development]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Mon, 14 Apr 2025 20:40:50 GMT</pubDate>
            <atom:updated>2025-05-16T19:52:49.922Z</atom:updated>
            <content:encoded><![CDATA[<h4>React</h4><h3>Introducción</h3><p>React JS trabaja con <strong>estados</strong> que son esenciales para controlar y almacenar información que cambia conforme a las interacciones de los usuarios. Es importante en aplicaciones interactivas donde el estado debe actualizarse para reflejar cambios en la Interfaz del Usuario (UI), como entradas de búsqueda o clics en botones. Se puede tener:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/660/1*QCInFv91pCAXQNpk6XYAHQ.png" /></figure><ul><li><strong>Estado local</strong>: es la información almacenada a nivel de componente, accesible solo dentro del componente donde se define.</li><li><strong>Estado global</strong>: es la información compartida entre múltiples componentes de la aplicación.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/660/1*2Ba59jUCwU1cG5HRp3sitA.png" /></figure><p>Utilizar estados no solo optimiza la forma en que se gestionan los datos dinámicos, sino que también garantiza que los componentes se rendericen correctamente cada vez que los datos cambian. Se puede consultar:</p><ul><li><a href="https://es.legacy.reactjs.org/docs/faq-state.html">Estado del componente - React</a></li><li><a href="https://www.reactjs.wiki/que-es-el-estado-en-react">¿Qué es el estado en React?</a></li></ul><p>Entonces, un estado es una herramienta que permite manejar y almacenar <strong>información susceptible</strong> a cambios por las interacciones de los usuarios.</p><h3><strong>useState</strong></h3><p>El hook useState es una herramienta para manejar estados locales. Con <strong>useState</strong> se puede crear y actualizar estados de nuestra aplicación.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/661/1*uQTYw-2Z01a2vR_bXp7m3Q.png" /></figure><p>Donde:</p><ul><li>state es la variable que contiene el estado actual. Es una <strong>buena práctica</strong> utilizar el prefijo “is” para variables de estado booleanas, ya que hace que el código sea más legible y autodocumentado. En este caso puede serisState que indica claramente que se trabaja con un estado que puede ser verdadero o falso.</li><li>setState es la función que nos permite actualizar ese estado</li><li>false es el valor con el que comienza nuestro estado</li></ul><p>Algunas características:</p><ul><li>El estado es inmutable, es decir que no se puede actualizar directamente. Se necesita una función actualizadora que garantice el manejo correcto de su actualización <em>(setSearchValue)</em>.</li><li>Al crear un estado, la representación es un array, donde el primer elemento es el valor del estado y el segundo es el actualizador del estado <em>([searchValue, setSearchValue])</em>.</li><li>Se puede tener un valor inicial como un string vacío, null, o cualquier tipo de dato con el cual se espera trabajar inicialmente (<em>useState(‘ ’)</em>).</li></ul><pre>import React, { useState } from &#39;react&#39;;<br><br>// Creación de un estado para un input de búsqueda<br>const [searchValue, setSearchValue] = useState(&#39;&#39;);<br><br>// Conexión del estado con el valor de un input<br>&lt;input value={searchValue} onChange={(event) =&gt; setSearchValue(event.target.value)} /&gt;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/661/1*jpFZSAPsKoQzyjnpCWK22g.png" /></figure><p>Cada vez que un estado cambia, React automáticamente vuelve a renderizar el componente que lo contiene. De esta forma, la interfaz de usuario está siempre actualizada con la información más reciente. Esto es posible gracias a que cada tiempo que se actualiza el estado, React dispara un re-render, actualizando solamente las partes del DOM que lo requieren. React mejora la eficiencia mediante el uso de un virtual DOM que actúa como una representación en memoria del DOM real:</p><ul><li><strong>La forma de actualización:</strong> es decir la optimización de los cambios que se aplican primero al virtual DOM. Solo cuando se detectan diferencias relevantes en este, se actualizan las partes específicas del DOM real. Nunca se debe modificar directamente la variable de estado (por ejemplo <em>count</em>), sino utilizar la función <em>“setter”</em> (por ejemplo <em>setCount</em>) proporcionada por el hook useState.</li><li><strong>El forma de renderización</strong>: es decir el renderizado eficiente, mejorando el desempeño y la velocidad de respuesta de la interfaz. Cada vez que el estado cambia, React vuelve a renderizar el componente automáticamente.</li></ul><p>La reacción a cambios de estado mediante el virtual DOM es clave para aplicaciones modernas y responsives, asegurando recursos computacionales optimizados y una experiencia de usuario fluida. Cada estado y cada render optimizado mediante esta técnica contribuyen al objetivo de React que es construir UI rápidas y eficientes.</p><h4>Comunicación de estados entre componentes</h4><p>La comunicación de estados entre componentes es crucial para interactuar los componentes padres con sus componentes hijos para crear aplicaciones dinámicas y robustas. Por ejemplo, se puede usar el método filter en los arrays para seleccionar solo los <em>to-dos</em> que contengan el valor del estado <em>searchValue</em>. Así se elabora el nuevo estado derivado:</p><pre>const searchedTodos = todos.filter(todo =&gt; <br>  todo.text.toLowerCase().includes(searchValue.toLowerCase())<br>);</pre><p>La diferencia entre los métodos <em>toLowerCase</em>() y <em>toLocaleLowerCase</em>() en JavaScript está relacionada con la forma en que se procesan los caracteres en mayúsculas y acentuados en diferentes idiomas. <em>toLowerCase</em>() convierte una cadena de texto en minúsculas, utilizando las reglas de conversión que se aplican a los caracteres ASCII (caracteres en inglés y otros idiomas europeos que no tienen acentos)</p><p>De esta manera, convierte una cadena de texto en minúsculas utilizando las reglas de conversión específicas del idioma y la ubicación (localización) en la que se está ejecutando el código. Esto significa que, en función de la localización, algunos caracteres con acentos o diacríticos (como la letra “á<em>”</em> en español) pueden ser convertidos a su equivalente en minúsculas, mientras que otros caracteres pueden permanecer sin cambios. Asi, nos aseguramos de que el filtrado no sea sensible a mayúsculas y minúsculas. En lugar de renderizar directamente el array de todos por defecto, ahora debemos asegurar que la lista muestre solo los resultados filtrados que coincidan con el valor de búsqueda del usuario:</p><pre>return (<br>  &lt;TodoList todos={searchedTodos} /&gt;<br>);</pre><p>Por ejemplo si tengo una aplicacion de completar tareas (<em>to-dos</em>), para permitir que las tareas se completen, es esencial saber en qué momento actualizar el estado de nuestra lista de tareas. Aquí vamos a necesitar un poco de ayuda de nuestro buen amigo <strong><em>setTodos</em></strong>, la función del estado que mantiene viva la lista.</p><ol><li><strong>Identificar el Evento</strong>: Debemos establecer la actualización del estado (<em>setTodos</em>) cuando el usuario interactúa con el elemento específico que indicará que la tarea está completa.</li><li><strong>Implementar onClick en el ítem</strong>: En cada todoItem, dentro del archivo todoItem.js, podemos añadir la interacción onClick para que al hacer clic en el icono de completar (una “V” temporal), se dispare la función de actualización.</li><li><strong>Definir una nueva función</strong>: En vez de pasar directamente <em>setTodos</em>, podemos encapsular la lógica de completado dentro de una función especial que se puede llamar <em>completeTodo</em>.</li></ol><pre>const completeTodo = (text) =&gt; {<br>  const newTodos = [...todos];<br>  const todoIndex = newTodos.findIndex(todo =&gt; todo.text === text);<br>  newTodos[todoIndex].completed = true;<br>  setTodos(newTodos);<br>};</pre><p>Una vez definida la constante como parámetro enviamos <em>text</em> por ser nuestra clave en el caso de los t<em>o-dos</em>, luego se usa la expresión extendida de JS con <em>…</em> es decir traeremos todo el array <em>to-dos</em> para crear un nuevo array. En la siguiente linea tenemos un filtro por el Index que se define para obtener el todo que se busca.</p><p>En el nuevo elemento encontrado lo definimos con el estado completed como true y definimos el array original con el nuevo, para finalmente enviamos un console.log para verificar que el estado se modifico de acuerdo a nuestra logica.</p><p>4. <strong>Asignar la función al evento</strong>: Dentro de los props del todoItem, encierra completeTodo dentro de una arrow function para retrasar su ejecución hasta que ocurra el evento:</p><pre>&lt;TodoList&gt;<br>  {searchedTodos.map(todo =&gt; (<br>    &lt;TodoItem<br>      key={todo.text}<br>      text={todo.text}<br>      completed={todo.completed}<br>      onComplete={() =&gt; completeTodo(todo.text)}<br>      onDelete={() =&gt; deleteTodo(todo.text)}<br>    /&gt;<br>  ))}<br>&lt;/TodoList&gt;</pre><pre>const deleteTodo = (text) =&gt; {<br>  const newTodos = [...todos];<br>  const todoIndex = newTodos.findIndex(<br>    (todo) =&gt; todo.text === text<br>  );<br>  newTodos.splice(todoIndex, 1)<br>  setTodos(newTodos);<br>  console.log(&#39;Hola llego aquí&#39;);<br>}</pre><p>Tambien, podemos agregar <em>delete</em> <em>todo</em> porque eliminar una tarea es tan esencial como completarla. De esta manera este enfoque asegura que la función se ejecute sólo en respuesta a eventos reales, evitando errores excesivos en React.</p><h3>Conclusión</h3><p>Los desarrolladores deben dominar el manejo de estados, ya que es esencial para crear aplicaciones React de tipo robustas y reactivas. Se debe entender que es un mecanismo para almacenar información que puede cambiar <strong>durante el ciclo de vida de un componente</strong>. Comprender cómo funciona la actualización del estado y cómo afecta al renderizado de componentes es esencial para desarrollar aplicaciones reactivas.</p><p>Los estados locales son extremadamente versátiles y pueden utilizarse en numerosos escenarios:</p><ul><li><strong>Formularios</strong>: permiten almacenar valores de los campos mientras un determinado usuario lo completa.</li><li><strong>Toggles</strong>: para manejar estados activado e desactivado (como menús desplegables)</li><li><strong>Filtros</strong>: para almacenar filtrado en listas o colecciones</li><li><strong>Paginación</strong>: para mantener el número de página actual</li><li><strong>Cargas de datos</strong>: para indicar si los datos están cargando, se han cargado correctamente o ha ocurrido un determinado error</li></ul><p>El manejo de estados es una habilidad fundamental en React que te permitirá crear interfaces dinámicas y reactivas. Dominar el uso de useState es solo el primer paso para aprovechar todo el potencial que React ofrece para el manejo de datos en tus aplicaciones.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e6a32b9ee6fb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Eventos en React]]></title>
            <link>https://medium.com/@emabarboza/eventos-en-react-05f8c13abc84?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/05f8c13abc84</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[react-native]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Sun, 13 Apr 2025 23:04:19 GMT</pubDate>
            <atom:updated>2025-05-28T16:19:19.143Z</atom:updated>
            <content:encoded><![CDATA[<h4>React</h4><p>Podemos encontrar la documentación oficial: <a href="https://react.dev/learn/responding-to-events">https://react.dev/learn/responding-to-events</a></p><p>El desarrollo de aplicaciones web con React.js va más allá de estilizar componentes y estructuras siguiendo un esquema de diseño. Aquí es crucial la reacción dinámica de las interacciones de los usuarios. <strong>Los eventos nos sirven para detectar acciones del usuario en interacción con nuestra aplicación.</strong></p><p>Es importante que una aplicación escuche eventos por algunas razones:</p><ul><li><strong>Dinamismo</strong>: permitiendo que tu aplicación reaccione a las interacciones de los usuarios.</li><li><strong>Interactividad</strong>: mejora la experiencia del usuario brindando respuestas inmediatas a sus acciones.</li><li><strong>Control del flujo de datos</strong>: facilita la gestión de cómo y cuándo se debe ejecutar un código específico ante un evento determinado.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/660/1*rOUGAPA25WShKZsbkmox-A.png" /></figure><p>React.js convierte los atributos prefijados con ‘on’ (como <strong>onClick</strong> y <strong>onChange)</strong> en “<em>event listeners</em>” con JavaScript. Es decir será transformado a un AddEventListener (escuchador de eventos). React implementa un sistema de <strong>eventos sintéticos</strong> que actúan como una capa de abstracción usando Camel Case. Es decir, la primera letra de cada palabra en mayúscula, excepto la primera, que se escribe en minúscula. Por ejemplo: se pueden tener:</p><ul><li><strong>Eventos de ratón</strong>: onClick, onMouseOver, onMouseOut</li><li><strong>Eventos de formulario</strong>: onChange, onSubmit, onFocus, onBlur</li><li><strong>Eventos de teclado</strong>: onKeyDown, onKeyPress, onKeyUp</li><li><strong>Eventos de clipboard</strong>: onCopy, onCut, onPaste</li></ul><p>Para poder ejecutar los eventos en React, se deben usar arrow functions con la estructura () =&gt; {} de esta manera React entiende y no ejecuta de manera inmediata las funciones.</p><p>Por ejemplo:</p><pre>const handleClick = () =&gt; {<br>  console.log(&#39;Le diste click&#39;);<br>};</pre><pre>// Al renderizar el botón en JSX<br>&lt;button onClick={handleClick}&gt;Haz clic aquí&lt;/button&gt;</pre><p>Otro ejemplo:</p><pre>&lt;input type=&quot;search&quot; placeholder=&quot;Search...&quot;<br>        onChange={(event) =&gt; {<br>          console.log(&#39;Escribiste en el Todo Search&#39;)<br>          console.log(event)<br>          console.log(event.target);<br>          console.log(event.target.value);<br>        }} /&gt;</pre><p>Dentro del fragmento de código se puede mostrar por consola el evento con las diferentes propiedades que se necesita. El evento como tal nos muestra la propiedad <strong>SyntheticBaseEvent</strong> que es contenedor de todas las propiedades del evento, siendo mas sepecifico target que nos muestra el elemento con el cual se esta interactuando y finalmente value que especificamente y en tiempo real nos muestra el valor enviado por el evento.</p><p>Entonces, cuando se trabaja con eventos en React.js, se gestiona un tipo especial de objeto llamado SyntheticBaseEvent que permite asegurar la compatibilidad con todos los navegadores.</p><p>En ocasiones, para inputs se utiliza <strong>onChange</strong> para capturar cambios en tiempo real y manipular datos como texto escrito por el usuario.</p><pre>const handleInputChange = (event) =&gt; {<br>  console.log(&#39;Escribiste:&#39;, event.target.value);<br>};</pre><pre>&lt;input type=&quot;text&quot; onChange={handleInputChange} /&gt;</pre><p>target hace referencia desde donde se disparo el elemento HTML. Así permite seguir cada letra escrita o borrada en tiempo real, esencial para funciones como buscadores o filtros de datos.</p><p>Después de capturar un evento y obtener los datos necesarios, se debe continuar esos datos a otros componentes y actualizar la UI. Esa comunicación y actualización está facilitada por una herramienta fundacional en React que son los estados.</p><h4>Conclusión</h4><p>La gestión de eventos en React es una habilidad fundamental para crear aplicaciones interactivas y dinámicas. A través de los eventos, podemos capturar las acciones del usuario como clics, entradas de texto o movimientos del ratón, y responder a ellas de manera eficiente. React simplifica este proceso con su sistema de eventos sintéticos, permitiéndonos crear interfaces de usuario altamente responsivas con un código limpio y mantenible.</p><p>Los eventos en React nos permiten crear aplicaciones verdaderamente interactivas, respondiendo a las acciones del usuario de manera más eficiente. La combinación de eventos sintéticos y estados de React proporciona una forma poderosa de construir interfaces de usuario dinámicas con un código limpio y mantenible.</p><p>Como conclusión se puede tener:</p><ul><li><strong>JavaScript nativo mejorado</strong>: React asegura que el código solo se ejecute cuando el evento sea disparado por el usuario.</li><li><strong>Eventos como funciones</strong>: Siempre encapsula el código en una función para diferir su ejecución hasta que el usuario realice la acción deseada, como un clic.</li></ul><p>Tambien se puede consultar:</p><p><a href="https://es.legacy.reactjs.org/docs/events.html">SyntheticEvent - React</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=05f8c13abc84" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Componentes, React Fragment y props]]></title>
            <link>https://medium.com/@emabarboza/componentes-react-fragment-y-props-e72c9d4c1a86?source=rss-676b78ef6409------2</link>
            <guid isPermaLink="false">https://medium.com/p/e72c9d4c1a86</guid>
            <category><![CDATA[programmer]]></category>
            <category><![CDATA[reactnative-app]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[frontend]]></category>
            <dc:creator><![CDATA[Emanuel Barboza - Argis Lab]]></dc:creator>
            <pubDate>Sun, 13 Apr 2025 21:09:20 GMT</pubDate>
            <atom:updated>2025-05-14T22:32:59.010Z</atom:updated>
            <content:encoded><![CDATA[<h4>React</h4><h3>¿Qué son los componentes?</h3><p>Se cuenta con la documentación oficial en <a href="https://react.dev/reference/react/Component">https://react.dev/reference/react/Component</a></p><p>Un componente es una pieza reutilizable de código o una unidad básica de construcción en el desarrollo de aplicaciones web modernas que define cómo se ve una parte de la interfaz (UI, por sus siglas en inglés, Interfaz de Usuario) y cómo se comporta. Se puede pensar como una función o clase que devuelve JSX (una mezcla de JavaScript y HTML). La idea es que cuente con dos características:</p><ul><li>Se basa en la reusabilidad, es decir no repetir código.</li><li>Más fácil de mantener.</li><li>Interactiva.</li><li>Pueden recibir <strong>props</strong>, es decir datos externos.</li><li>Pueden tener su propio <strong>estado interno</strong>, es decir states.</li></ul><p>Funcionan como piezas de Lego que, al unirse, forman estructuras más complejas y funcionales.</p><ul><li>Identificar partes individuales de la interfaz (cards, headers, footers, etc.).</li><li>Construir cada parte de forma aislada.</li><li>Combinar estas partes para crear la aplicación completa.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/657/1*XHoMfYSvKU0B8GDP_1S3Ug.png" /></figure><p>Desarrollar en React se basa en un paradigma llamado Desarrollo Basado en Componentes. La <strong>reusabilidad</strong> o <strong>reutilización</strong> es clave para el dearrollo web eficiente y mantenible. Los componentes reutilizables son estructuras de código que pueden utilizarse múltiples veces en una aplicación, cambiando únicamente ciertos elementos internos como textos, imágenes o estilos. Esto nos permite mantener la consistencia en nuestra interfaz y ahorrar tiempo de desarrollo.</p><p>Por ejemplo, si necesitamos crear varias tarjetas (cards) en nuestra aplicación, en lugar de escribir el código HTML para cada una de ellas, podemos crear un componente base y simplemente modificar su contenido según sea necesario.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/642/1*tQaUSanAYJtv9o0laTTvhw.png" /></figure><p>Hay una diferencia con los elementos que tiene React trabajando con JS convirtiendo esos elementos en etiquetas HTML. Un componente puede ser tan pequeño como un botón o tan grande como toda una página web. Por ejemplo:</p><pre>function Saludo(props) {<br>  return &lt;h1&gt;Hola, {props.nombre}!&lt;/h1&gt;;<br>}</pre><p>Luego podés usar este componente así, podemos pasar propiedades al componente como si fueran atributos de HTML:</p><pre>&lt;Saludo nombre=&quot;María&quot; /&gt;</pre><p>Entonces podemos terminar renderizando:</p><pre>&lt;h1&gt;Hola, María!&lt;/h1&gt;</pre><p>¿Cómo terminó llamando a un componente? Escribiendo su nombre con la siguiente sintaxis &lt; Componente1 /&gt;. Lo mas comun es tener un index.js en /src donde se tiene App con mayúscula y creamos una variable root.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/723/0*N7t9bLvJNmp36z4J" /></figure><p>La función App es un componente de React ¿Cómo se esto? porque App está con letra mayúscula y la convención es que si comienza se comienza con mayúscula es un componente. Entonces, por conveción siempre los creamos utlizando PascalCase, es decir, “La Primera Letra De Cada Palabra En Mayúscula y Juntas”. Ejemplo: TodoList</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/982/0*mEJt7x_svviXa3Av" /></figure><p>De esta manera se puede ver localmente:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*TrMAtkyfjTQIBdd2" /></figure><p>Hay que tener en cuenta que puedo tener header, img, div, etc. pero no es un archivo HTML sino JS. Lo que sucede es que JSX me permite combinar JS con XML, por eso hay mucha nomenclatura que cambia como por ejemplo en vez de “<strong><em>class”</em></strong> es “<strong><em>className”</em></strong>. El archivo JSX en un navegador se convierte todo en HTML.</p><p><a href="https://es.legacy.reactjs.org/docs/introducing-jsx.html">Presentando JSX - React</a></p><p>Entonces, JSX es una extensión de la sintaxis de JS creada por Facebook o Meta. Su principal función es escribir código HTML dentro de archivos JavaScript facilitando la creación de componentes. JSX funciona como un Pre-Procesador ya que transforma el <strong>código .jsx </strong>a <strong>código JavaScript </strong>que pueda interpretar el browser, esto sucede gracias a un compilador, es decir Babel.</p><p>Los componentes son creados utilizando el metodo “react.createElement” , a través de Clases o por funciones.</p><p>De forma declarativa:</p><pre>function Component() {<br>  return ( ... JSX ) <br>}</pre><p>Utilizando Arrow Functions:</p><pre>const Component = () =&gt; {<br>  return ( ... JSX ) <br>}</pre><p>Tambien, podemos llamar un componente de react con otro componente de react.</p><pre>import logo from &#39;./argisl.png&#39;;<br>import &#39;./App.css&#39;;<br><br>function App() {<br> return (<br>   &lt;div className=&quot;App&quot;&gt;<br>     &lt;TodoItem /&gt; // AQUI ES DONDE TENEMOS EL OTRO COMPONENTE<br>     &lt;header className=&quot;App-header&quot;&gt;<br>       &lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;<br>       &lt;p&gt;<br>         Bienvenidos a ArgisLab<br>       &lt;/p&gt;<br>       &lt;a<br>         className=&quot;App-link&quot;<br>         href=&quot;https://platzi.com/reactjs&quot;<br>         target=&quot;_blank&quot;<br>         rel=&quot;noopener noreferrer&quot;<br>       &gt;<br>         Learn React<br>       &lt;/a&gt;<br>     &lt;/header&gt;<br>   &lt;/div&gt;<br> );<br>}<br>function TodoItem(){<br> return (<br>   &lt;li&gt;<br>       &lt;span&gt;V&lt;/span&gt;<br>       &lt;p&gt;Llorar con la llorona &lt;/p&gt;<br>       &lt;span&gt;X&lt;/span&gt;<br>   &lt;/li&gt;<br> );<br><br><br>}<br>export default App;</pre><h3>Props</h3><p>En React, “<em>props</em>” es una abreviatura de <em>“properties” o “propiedades”</em>, se utiliza para pasar datos de un componente padre a un componente hijo. Las props son un mecanismo fundamental para lograr la reutilización y la composición de componentes. Cuando se crea un componente en React, se necesiten comunicarse y compartir información. De esta manera, se construyen interfaces de usuario (UI) dinámicas y escalables sin repetir código innecesariamente. Esta capacidad de crear estructuras base puede adaptarse a diferentes contextos.</p><p>Es decir, se puede pasar datos y funciones como props, que son de cualquier tipo de valor, como números, cadenas de texto, booleanos, objetos o incluso funciones. El valor puede cambiar de forma dinámica, en lugar de contenido estático o “<em>hardcoded</em>”.</p><p>Las props (propiedades) son similares a los parámetros en funciones, pero aplicadas a componentes:</p><pre>&lt;TodoCounter completed={16} total={25} /&gt;</pre><p>Aquí, TodoCounter recibe dos props: completed y total. Estas se accesan en el componente mediante la destructuración:</p><pre>const TodoCounter = ({ completed, total }) =&gt; (<br>  &lt;h1&gt;Has completado {completed} de {total} todos&lt;/h1&gt;<br>);</pre><p>Como podemos observar, se puede utilizar el mismo componente dos veces, pero teniendo diferentes valores para sus props. Esto nos permite mantener la misma estructura pero con contenido personalizado para cada instancia.</p><p>La prop children es una propiedad especial que automáticamente encapsula todo lo que está entre las etiquetas de apertura y cierre de un componente:</p><pre>&lt;TodoList&gt;<br>  &lt;TodoItem ... /&gt;<br>  &lt;TodoItem ... /&gt;<br>&lt;/TodoList&gt;</pre><p>React convierte automáticamente el contenido en la prop children, que podemos utilizar dentro de nuestro componente. Asi, React transforma automáticamente a todo lo que se encuentre dentro del componente padre en un elemento “<em>children</em>” , es decir todo lo que se encuentre dentro de una etiqueta de apertura &lt;Component&gt; y una etiqueta de cierre &lt;/Component&gt; para React será “c<em>hildren</em>”:</p><pre>// 1 forma <br>const TodoList = ({ children }) =&gt; (<br>  &lt;ul&gt;{children}&lt;/ul&gt;<br>);<br><br>// 2forma<br>function TodoList({children}){<br> return (<br>   &lt;ul&gt;<br>     {children}<br>   &lt;/ul&gt;<br> );<br>  }<br>  export { TodoList };<br><br>// 3forma<br>function TodoList(props){<br>  return (<br>    &lt;ul&gt;<br>      {props.children}<br>    &lt;/ul&gt;<br>  );<br>  <br>  }<br>  <br>  export { TodoList };</pre><h3>React Fragments</h3><p>Podemos mirar el siguiente link: <a href="https://react.dev/reference/react/Fragment">https://react.dev/reference/react/Fragment</a></p><p>React Fragments (&lt;React.Fragment&gt;) permite retornar múltiples elementos sin producir nodos extra en el DOM. Es útil para no llenar nuestro HTML de div innecesarios y puede verse así:</p><pre>return (<br>  &lt;React.Fragment&gt;<br>    &lt;Header /&gt;<br>    &lt;MainContent /&gt;<br>    &lt;Footer /&gt;<br>  &lt;/React.Fragment&gt;<br>);</pre><p>De este modo, se mantiene una estructura limpia y clara en el DOM. Recibe en el <strong>return</strong> y encapsula todos los componentes para mostrar. En el HTML, el React.Fragment está oculto. Se puede envolver todos los componentes JSX dentro de un contenedor padre, esto es debido a que React necesita envolver esos componentes para renderizarlos, y asi no crear nodos innecesarios en el DOM.</p><h4>Renderización de arrays y property key</h4><p>Cuando se trabajan con listas, es esencial proporcionar una prop key única para cada elemento. Esto facilita la eficiencia y orden del sistema de renderizado de React:</p><pre>const todos = defaultTodos.map((todo, index) =&gt; (<br>  &lt;TodoItem key={index} text={todo.text} completed={todo.completed} /&gt;<br>));</pre><p>Aquí, nos aseguramos de que cada TodoItem tenga una key única, usando un índice o algún identificador único relevante. Es necesario una key porque ayuda a React a identificar qué elementos han cambiado, añadido o eliminado. Esto optimiza la actualización de listas y es una práctica recomendada para evitar advertencias en la consola y mejorar el rendimiento de la aplicación.</p><p>Las props transforman componentes con datos estáticos en entidades dinámicas y personalizables. Con React Fragments y la renderización mediante arrays, podemos tener un marco flexible y poderoso para el desarrollo de aplicaciones.</p><h3>Conclusión</h3><p>La modularidad y reusabilidad de los componentes permite:</p><ul><li>Identificar partes individuales de la interfaz como cards, headers, footers, etc.</li><li>Abordar problemas más pequeños y manejables a diferencia de abordar todo de una vez</li><li>Construir piezas de software de forma aislada</li><li>Mayor facilidad para mantener y actualizar</li><li>Combinar estas partes para crear la aplicación compleja y completa</li><li>Mantener un código más limpio y organizado</li><li>Reducir la duplicación de código</li><li>Crear interfaces consistentes</li><li>Ahorrar tiempo de desarrollo</li></ul><p>Los componentes representan un cambio de paradigma respecto a la programación web tradicional. Al adoptar este enfoque modular, no solo escribimos menos código cómo algo monólitico, sino que se desarrollan aplicaciones más mantenibles, escalables y fáciles de entender.</p><p><strong>HTML (Hypertext Markup Language)</strong></p><p>Es el lenguaje de marcado estándar para crear páginas web. Define la estructura y presentación del contenido en una página web. HTML utiliza una sintaxis basada en etiquetas, donde los elementos se encierran entre etiquetas de apertura y cierre. Se utiliza de forma general en el desarrollo web para definir la estructura y presentación de una página.</p><p><strong>JSX (JavaScript XML)</strong></p><p>Es una extensión de JavaScript que te permite escribir código similar a HTML dentro de JavaScript. JSX proporciona un enfoque más <strong>declarativo</strong> y <strong>basado en componentes</strong> para la creación de componentes de interfaz de usuario. JSX permite la incrustación de expresiones y lógica de JavaScript dentro de la estructura de la interfaz de usuario, ya que HTML no ofrece esta funcionalidad directamente. HTML utiliza una nomenclatura de atributos en minúsculas y con guiones, mientras que JSX utiliza Camel Case para los nombres de atributos.</p><p>Esta sintaxis híbrida lo que hace que React sea tan poderoso y a la vez accesible para desarrolladores que ya conocen estas tecnologías.</p><p>La creación de componentes en React representa un cambio de paradigma respecto a la programación web tradicional. Al adoptar este enfoque modular, no solo escribimos menos código, sino que creamos aplicaciones más mantenibles, escalables y fáciles de entender. La sintaxis JSX parece extraña al principio, pero rápidamente se convierte en una herramienta intuitiva que acelera el desarrollo de interfaces de usuario complejas. Tanto HTML como JSX se utilizan para construir interfaces de usuario en el desarrollo web. Tanto en HTML como en JSX, se pueden aplicar estilos y asignar clases a los elementos para definir su apariencia. Ambos son interpretados y renderizados por los navegadores web.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e72c9d4c1a86" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>