Crear documentación de reglas para proyectos en React
🛠 ️ Changes
Este MR introduce la nueva guía de desarrollo Frontend para establecer un conjunto de buenas prácticas, estándares y convenciones para TS y React. La guía ha sido estructurada de forma modular para facilitar su lectura, mantenimiento y futuras actualizaciones.
📝 Associated issues
resolves LIB-255
🤔 Considerations
Aunque hay normas para TS planito, queda pendiente ahondar en TS solo y la creación de normas para el CSS, que pos son otras tareas
-
Miguel Mejía @magomez
assigned to @esuarez
-
Miguel Mejía @magomez
assigned to @mgalvez
-
Miguel Mejía @magomez
removed assignee
removed assignee
removed assigneeToggle commit list -
Miguel Mejía @magomez
changed the description
changed the description
changed the descriptionToggle commit list -
Miguel Mejía @magomez
changed the description
changed the description
changed the descriptionToggle commit list -
Miguel Mejía @magomez
added 1 commit
- 7df66e8d - Fix two examples
added 1 commit * 7df66e8d - Fix two examples [Compare with previous version](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=314&start_sha=07f54d8fbd524ffabe831b63ccac3a214f65d794)Toggle commit list -
1 # 5. Buenas Prácticas en React 2 3 ## Componentes de Función: La preferencia del equipo 4 5 No hay razón para seguir escribiendo componentes de clase, son una tecnología vieja que se evitamos en nuestras aplicaciones. Los componentes de función, junto con los _Hooks_, ofrecen una forma más simple y directa de manejar el estado, la sincronización y los efectos secundarios, lo que resulta en un código más limpio y fácil de depurar. -
César Galvis @cgalvis commentedMaster
Porfa, cambiar
son una tecnología vieja que se evitamosporson una tecnología vieja que evitamosPorfa, cambiar `son una tecnología vieja que se evitamos` por `son una tecnología vieja que evitamos` -
Miguel Mejía @magomez
changed this line in version 3 of the diff
changed this line in version 3 of the diff
changed this line in [version 3 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=315&start_sha=7df66e8d2752b85ef9a23e5febff34dc814d80e9#c601f0869e8a397ffaaa06df334db2207906725c_5_5)Toggle commit list
Please register or sign in to reply -
-
1 # 5. Buenas Prácticas en React 2 3 ## Componentes de Función: La preferencia del equipo 4 5 No hay razón para seguir escribiendo componentes de clase, son una tecnología vieja que se evitamos en nuestras aplicaciones. Los componentes de función, junto con los _Hooks_, ofrecen una forma más simple y directa de manejar el estado, la sincronización y los efectos secundarios, lo que resulta en un código más limpio y fácil de depurar. 6 7 ## Estructura y Organización 8 9 Los componentes deben tener una única responsabilidad. Los que orquestan, renderizan y hacen malabares al mismo tiempo, fácilmente se convierten en un nido de _bugs_, que fácilmente crean condiciones de carrera o bucles de renderizado. 10 11 la estructura de los componentes en el archivodebe ser la siguiente: -
César Galvis @cgalvis commentedMaster
Porfa cambiar
la estructura de los componentes en el archivodebe ser la siguiente:porLa estructura de los componentes en el archivo debe ser la siguiente:Porfa cambiar `la estructura de los componentes en el archivodebe ser la siguiente:` por `La estructura de los componentes en el archivo debe ser la siguiente:` -
Miguel Mejía @magomez
changed this line in version 3 of the diff
changed this line in version 3 of the diff
changed this line in [version 3 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=315&start_sha=7df66e8d2752b85ef9a23e5febff34dc814d80e9#c601f0869e8a397ffaaa06df334db2207906725c_11_11)Toggle commit list
-
-
121 122 Para mantener el código claro, un handler debe tener una sola responsabilidad, como hacer una petición a la API o actualizar un estado. Siempre los nombramos con el prefijo handle (ej., handleClick, handleSubmit). Si un handler depende del estado o de las props, lo definimos dentro del componente; si no, lo movemos fuera del componente para que sea más fácil de reutilizar y probar, si solo es usado en este componente, puede dejarse en el mismo archivo, de lo contrario, debe moverse al lugar que la arquitectura de la función haya designado para los helpers y utils. 123 124 ## Seguridad y Buenas Prácticas 125 126 - **Sanitización de datos**: Asegúrate de que los datos externos se limpien antes de ser renderizados en JSX para prevenir ataques de _cross-site scripting_. 127 128 - **Manejo seguro de dependencias del package.json**: La gestión de dependencias es un proceso delicado. Las actualizaciones automáticas solo deben aplicarse para _hotfixes_ y parches menores. Las actualizaciones de versión y los cambios importantes deben hacerse bajo supervisión al menos una vez al año. 129 130 - **¡No uses `dangerouslySetInnerHTML`!**: Esta propiedad es peligrosa y debe evitarse. Si es absolutamente necesario, su uso debe estar justificado y el contenido debe ser sanitizado de antemano. 131 132 ## Manejo de errores 133 134 ### Manejo de Errores Asíncronos 135 136 Cada llamada a una API o operación async debe estar envuelta en un bloque try-catch o un chaininng `.then().catch()` apropiado, y los errores deben ser manejados de manera uniforme en toda la aplicación. -
César Galvis @cgalvis commentedMaster
Porfa cambiar
Cada llamada a una API o operaciónporCada llamada a una API u operaciónPorfa cambiar `Cada llamada a una API o operación` por `Cada llamada a una API u operación` -
Miguel Mejía @magomez
changed this line in version 3 of the diff
changed this line in version 3 of the diff
changed this line in [version 3 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=315&start_sha=7df66e8d2752b85ef9a23e5febff34dc814d80e9#c601f0869e8a397ffaaa06df334db2207906725c_136_136)Toggle commit list
-
-
Miguel Mejía @magomez
added 1 commit
- cbac600d - Fix typos
added 1 commit * cbac600d - Fix typos [Compare with previous version](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=315&start_sha=7df66e8d2752b85ef9a23e5febff34dc814d80e9)Toggle commit list -
Miguel Mejía @magomez
resolved all discussions
resolved all discussions
resolved all discussionsToggle commit list -
1 # Guía de estilo para desarrollo en React con TS 2 3 ## TL;DR 4 5 Instala ESLint y Prettier, utiliza las reglas de lint suministradas y el default de Prettier. 6 7 Escribe código para humanos. La legibilidad y sostenibilidad son más importantes que la concisión pues el objetivo es que cualquier persona pueda entender el código rápidamente. 8 9 Gestiona las dependencias de forma responsable y prioriza la accesibilidad partiendo de estructurar un HTML semántico. En TypeScript no des lugar a `any`; preferiere `unknown` y la validación de tipos. En React, escribe componentes de Función con una sola responsabilidad y escribe el JSX libre de lógica compleja... 10 11 Maneja los errores de forma explícita para ofrecer una buena experiencia de desarrollo tus compañeros y una de usuario más robusta. -
Erika Suarez @esuarez commentedMaster
te comiste un
a:desarrollo tus compañeroste comiste un `a`: `desarrollo tus compañeros` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#4216b9edde9f334c054c8e51db1de1f1d8924c3d_11_11)Toggle commit list
-
-
21 - [Una línea, una acción](./front/3-convenciones-generales.md#una-línea-una-acción) 22 - [Nomenclatura](./front/3-convenciones-generales.md#nomenclatura) 23 - [Bibliotecas Externas](./front/3-convenciones-generales.md#bibliotecas-externas) 24 - [Accesibilidad](./front/3-convenciones-generales.md#accesibilidad) 25 - [El texto de la interfaz de usuario](./front/3-convenciones-generales.md#el-texto-de-la-interfaz-de-usuario) 26 - [Comentarios solo cuando el código no lo explica todo](./front/3-convenciones-generales.md#comentarios-solo-cuando-el-código-no-lo-explica-todo) 27 - [Aduana: Importaciones y exportaciones](./front/3-convenciones-generales.md#aduana-importaciones-y-exportaciones) 28 4. [Buenas Prácticas en TypeScript](./front/4-buenas-practicas-en-typescript.md) 29 - [Explicar lo suficiente](./front/4-buenas-practicas-en-typescript.md#explicar-lo-suficiente) 30 - [Interfaces y Tipos: ¿Cuál y cuándo?](./front/4-buenas-practicas-en-typescript.md#interfaces-y-tipos-cuál-y-cuándo) 31 - [Arrays y Genéricos](./front/4-buenas-practicas-en-typescript.md#arrays-y-genéricos) 32 - [Archivos de definición de tipos](./front/4-buenas-practicas-en-typescript.md#archivos-de-definición-de-tipos) 33 - [Vamo' a calmarno'](./front/4-buenas-practicas-en-typescript.md#vamo-a-calmarno) 34 - [Constantes con enums y posibilidades con literales](./front/4-buenas-practicas-en-typescript.md#constantes-con-enums-y-posibilidades-con-literales) 35 - [`any`, `unknown` y `never`](./front/4-buenas-practicas-en-typescript.md#any-unknown-y-never) 36 - [Helpers y Tipos Utilitarios](./front/4-buenas-practicas-en-typescript.md#helpers-y-tipos-utilitarios) -
Erika Suarez @esuarez commentedMaster
utilitarios aquí no debería arrancar con mayúscula (ya que estamos de gramarnazis xD)
utilitarios aquí no debería arrancar con mayúscula (ya que estamos de gramarnazis xD) -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#4216b9edde9f334c054c8e51db1de1f1d8924c3d_36_36)Toggle commit list
-
-
23 - [Bibliotecas Externas](./front/3-convenciones-generales.md#bibliotecas-externas) 24 - [Accesibilidad](./front/3-convenciones-generales.md#accesibilidad) 25 - [El texto de la interfaz de usuario](./front/3-convenciones-generales.md#el-texto-de-la-interfaz-de-usuario) 26 - [Comentarios solo cuando el código no lo explica todo](./front/3-convenciones-generales.md#comentarios-solo-cuando-el-código-no-lo-explica-todo) 27 - [Aduana: Importaciones y exportaciones](./front/3-convenciones-generales.md#aduana-importaciones-y-exportaciones) 28 4. [Buenas Prácticas en TypeScript](./front/4-buenas-practicas-en-typescript.md) 29 - [Explicar lo suficiente](./front/4-buenas-practicas-en-typescript.md#explicar-lo-suficiente) 30 - [Interfaces y Tipos: ¿Cuál y cuándo?](./front/4-buenas-practicas-en-typescript.md#interfaces-y-tipos-cuál-y-cuándo) 31 - [Arrays y Genéricos](./front/4-buenas-practicas-en-typescript.md#arrays-y-genéricos) 32 - [Archivos de definición de tipos](./front/4-buenas-practicas-en-typescript.md#archivos-de-definición-de-tipos) 33 - [Vamo' a calmarno'](./front/4-buenas-practicas-en-typescript.md#vamo-a-calmarno) 34 - [Constantes con enums y posibilidades con literales](./front/4-buenas-practicas-en-typescript.md#constantes-con-enums-y-posibilidades-con-literales) 35 - [`any`, `unknown` y `never`](./front/4-buenas-practicas-en-typescript.md#any-unknown-y-never) 36 - [Helpers y Tipos Utilitarios](./front/4-buenas-practicas-en-typescript.md#helpers-y-tipos-utilitarios) 37 5. [Buenas Prácticas en React](./front/5-buenas-practicas-en-react.md) 38 - [Componentes de Función: La preferencia del equipo](./front/5-buenas-practicas-en-react.md#componentes-de-función-la-preferencia-del-equipo) -
Erika Suarez @esuarez commentedMaster
lo mismo para función
lo mismo para función -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#4216b9edde9f334c054c8e51db1de1f1d8924c3d_38_38)Toggle commit list
-
-
26 - [Comentarios solo cuando el código no lo explica todo](./front/3-convenciones-generales.md#comentarios-solo-cuando-el-código-no-lo-explica-todo) 27 - [Aduana: Importaciones y exportaciones](./front/3-convenciones-generales.md#aduana-importaciones-y-exportaciones) 28 4. [Buenas Prácticas en TypeScript](./front/4-buenas-practicas-en-typescript.md) 29 - [Explicar lo suficiente](./front/4-buenas-practicas-en-typescript.md#explicar-lo-suficiente) 30 - [Interfaces y Tipos: ¿Cuál y cuándo?](./front/4-buenas-practicas-en-typescript.md#interfaces-y-tipos-cuál-y-cuándo) 31 - [Arrays y Genéricos](./front/4-buenas-practicas-en-typescript.md#arrays-y-genéricos) 32 - [Archivos de definición de tipos](./front/4-buenas-practicas-en-typescript.md#archivos-de-definición-de-tipos) 33 - [Vamo' a calmarno'](./front/4-buenas-practicas-en-typescript.md#vamo-a-calmarno) 34 - [Constantes con enums y posibilidades con literales](./front/4-buenas-practicas-en-typescript.md#constantes-con-enums-y-posibilidades-con-literales) 35 - [`any`, `unknown` y `never`](./front/4-buenas-practicas-en-typescript.md#any-unknown-y-never) 36 - [Helpers y Tipos Utilitarios](./front/4-buenas-practicas-en-typescript.md#helpers-y-tipos-utilitarios) 37 5. [Buenas Prácticas en React](./front/5-buenas-practicas-en-react.md) 38 - [Componentes de Función: La preferencia del equipo](./front/5-buenas-practicas-en-react.md#componentes-de-función-la-preferencia-del-equipo) 39 - [Estructura y Organización](./front/5-buenas-practicas-en-react.md#estructura-y-organización) 40 - [Props: Cómo pasar y gestionar propiedades](./front/5-buenas-practicas-en-react.md#props-cómo-pasar-y-gestionar-propiedades) 41 - [Manejo de Estados: Estrategias claras](./front/5-buenas-practicas-en-react.md#manejo-de-estados-estrategias-claras) -
Erika Suarez @esuarez commentedMasterEdited
y lo mismo para estados
y lo mismo para estados -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#4216b9edde9f334c054c8e51db1de1f1d8924c3d_41_41)Toggle commit list
-
-
32 - [Archivos de definición de tipos](./front/4-buenas-practicas-en-typescript.md#archivos-de-definición-de-tipos) 33 - [Vamo' a calmarno'](./front/4-buenas-practicas-en-typescript.md#vamo-a-calmarno) 34 - [Constantes con enums y posibilidades con literales](./front/4-buenas-practicas-en-typescript.md#constantes-con-enums-y-posibilidades-con-literales) 35 - [`any`, `unknown` y `never`](./front/4-buenas-practicas-en-typescript.md#any-unknown-y-never) 36 - [Helpers y Tipos Utilitarios](./front/4-buenas-practicas-en-typescript.md#helpers-y-tipos-utilitarios) 37 5. [Buenas Prácticas en React](./front/5-buenas-practicas-en-react.md) 38 - [Componentes de Función: La preferencia del equipo](./front/5-buenas-practicas-en-react.md#componentes-de-función-la-preferencia-del-equipo) 39 - [Estructura y Organización](./front/5-buenas-practicas-en-react.md#estructura-y-organización) 40 - [Props: Cómo pasar y gestionar propiedades](./front/5-buenas-practicas-en-react.md#props-cómo-pasar-y-gestionar-propiedades) 41 - [Manejo de Estados: Estrategias claras](./front/5-buenas-practicas-en-react.md#manejo-de-estados-estrategias-claras) 42 - [Sincronización (`useEffect`)](./front/5-buenas-practicas-en-react.md#sincronización-useeffect) 43 - [useMemo y useCallback](./front/5-buenas-practicas-en-react.md#usememo-y-usecallback) 44 - [Código ordenado](./front/5-buenas-practicas-en-react.md#código-ordenado) 45 - [Fragmentos y Portales](./front/5-buenas-practicas-en-react.md#fragmentos-y-portales) 46 - [Handlers (Funciones para manejar eventos de usuario)](./front/5-buenas-practicas-en-react.md#handlers-funciones-para-manejar-eventos-de-usuario) 47 - [Seguridad y Buenas Prácticas](./front/5-buenas-practicas-en-react.md#seguridad-y-buenas-prácticas) -
Erika Suarez @esuarez commentedMasterEdited
y para prácticas :P
y para prácticas :P -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#4216b9edde9f334c054c8e51db1de1f1d8924c3d_47_47)Toggle commit list
-
-
9 Puedes integrarlo en tu editor con los plugins oficiales. Si no, de seguro habremos dispuesto de un script dentro del package.json para darle formato al código: usualmente `<npm/pnpm/yarn/administrador de paquetes> format` harán ese trabajo. 10 11 ### La seguridad antes que la policía 12 13 Prettier es nuestra brújula de estilo y ESLint es quien evita que la caguemos antes de tiempo con pendejadas. Su propósito es detectar problemas de calidad, consistencia y posibles errores antes de que lleguen al código. Nuestra configuración combina las recomendaciones estándar de Airbnb, las de react y la ultima palabra la da prettier para evitar conflictos en las reglas... 14 15 ```typescript 16 extends: [ 17 "airbnb", 18 "airbnb-typescript", 19 "plugin:react-hooks/recommended", 20 "plugin:prettier/recommended", 21 ], 22 ``` 23 24 Pero en esta área nuestro equipo si tiene opiniones y acuerdos que modifican las reglas base y responden a el cómo vemos el código y las experiencias que hemos tenido. -
Erika Suarez @esuarez commentedMasterEdited by Erika Suarez
cambiar "responden a el cómo" por "responden a cómo"
cambiar "responden a el cómo" por "responden a cómo" -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#3e63dc7c402278b198947a326d3ccdb41fd12cb3_24_24)Toggle commit list
-
-
1 # 3. Convenciones Generales 2 3 ## Orden del código 4 5 **Módulos**: Siempre trabajaremos con el sistema de Módulos de ECMAScript (ESM) en nuestro código. Aunque aún existen bibliotecas en CommonJS (CJS), podemos usarlas como módulos e importarlas sin usar la sintaxis de `require`. 6 7 **Evitar el entorno global**: Usemos las capacidades de los módulos para mantener nuestro entorno global limpio. No hay necesidad de declarar variables globales que ensucien todo y generar conflictos. -
Erika Suarez @esuarez commentedMasterEdited
Sugerencia de cambio de redacción:
variables globales que ensucian todo y crean potenciales conflictos.Sugerencia de cambio de redacción: `variables globales que ensucian todo y crean potenciales conflictos.` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c415d713a828f8048b28966818d462ef37db8b2a_7_7)Toggle commit list
-
-
8 9 **Clases con propósito**: No creemos clases solo para encapsular un conjunto de variables y funciones, eso lo puede hacer mejor un módulo. Las clases deben cumplir un propósito de arquitectura, como implementar un patrón de diseño (di tu un _singleton_) o manejar un estado interno complejo y persistente. 10 11 ## Una línea, una acción 12 13 Buscamos que cada línea de código tenga un propósito único y fácil de entender. Cuando una sola línea hace demasiadas cosas, se vuelve difícil de leer y peor de depurar. Por eso, preferimos la claridad sobre la concisión. 14 15 Esto explica porqué evitamos los ternarios anidados y usamos llaves en todos nuestros bloques de control (incluso en los `if` de una sola línea), lo que hace que el código sea predecible y reduce la posibilidad de errores a largo plazo. 16 17 ## Nomenclatura 18 19 Una de las cosas más difíciles en la programación es asignar buenos nombres de forma consistente. La razón es simple: un buen nombre reduce la necesidad de explicaciones. Buscamos nombres que le digan a cualquiera lo que están viendo sin necesidad de comentarios. 20 21 - **Idioma**: Dado que los lenguajes de programación que usamos están en inglés, hemos acordado usar este idioma en nuestro código. Respetamos y nos gusta el idioma en el que hablamos pero el código en "espanglish" puede ser muy molesto y aumentar la carga cognitiva. 22 23 - **Variables y funciones**: Usamos **`camelCase`**. Los nombres de variables deben ser sustantivos que describan su contenido (ej., `userId`, `userName`), y los de las funciones, verbos que indiquen lo que hacen (ej., `fetchUsers`, `calculateTotal`, `getSomeShit`)... tener cuidado con palabras genéricas como `info` o `data` y de cuando sea posible optar por algo más descriptivo de la información que contienen. -
Erika Suarez @esuarez commentedMasterEdited
quitar el
deal finaly de cuando sea posible...quitar el `de` al final `y de cuando sea posible...` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c415d713a828f8048b28966818d462ef37db8b2a_23_23)Toggle commit list
-
-
12 13 Buscamos que cada línea de código tenga un propósito único y fácil de entender. Cuando una sola línea hace demasiadas cosas, se vuelve difícil de leer y peor de depurar. Por eso, preferimos la claridad sobre la concisión. 14 15 Esto explica porqué evitamos los ternarios anidados y usamos llaves en todos nuestros bloques de control (incluso en los `if` de una sola línea), lo que hace que el código sea predecible y reduce la posibilidad de errores a largo plazo. 16 17 ## Nomenclatura 18 19 Una de las cosas más difíciles en la programación es asignar buenos nombres de forma consistente. La razón es simple: un buen nombre reduce la necesidad de explicaciones. Buscamos nombres que le digan a cualquiera lo que están viendo sin necesidad de comentarios. 20 21 - **Idioma**: Dado que los lenguajes de programación que usamos están en inglés, hemos acordado usar este idioma en nuestro código. Respetamos y nos gusta el idioma en el que hablamos pero el código en "espanglish" puede ser muy molesto y aumentar la carga cognitiva. 22 23 - **Variables y funciones**: Usamos **`camelCase`**. Los nombres de variables deben ser sustantivos que describan su contenido (ej., `userId`, `userName`), y los de las funciones, verbos que indiquen lo que hacen (ej., `fetchUsers`, `calculateTotal`, `getSomeShit`)... tener cuidado con palabras genéricas como `info` o `data` y de cuando sea posible optar por algo más descriptivo de la información que contienen. 24 25 - **Tipos, clases y componentes**: Usamos **`PascalCase`**. Esto ayuda a diferenciarlos del resto del código (ej., `UserType`, `ProductCard`). 26 27 - **Constantes de configuración**: Usamos **`SCREAMING_SNAKE_CASE`**. Son constantes que se usan para una configurar un comportamiento del código, su nombre en mayúsculas debe dejar muy claro la info que contienen (ej., `API_URL`, `MAX_RETRIES`, `I_AM_A_MAGIC_NUMBER`). -
Erika Suarez @esuarez commentedMasterEdited
typo:
para una configurartypo: `para una configurar` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c415d713a828f8048b28966818d462ef37db8b2a_27_27)Toggle commit list
-
-
18 19 Una de las cosas más difíciles en la programación es asignar buenos nombres de forma consistente. La razón es simple: un buen nombre reduce la necesidad de explicaciones. Buscamos nombres que le digan a cualquiera lo que están viendo sin necesidad de comentarios. 20 21 - **Idioma**: Dado que los lenguajes de programación que usamos están en inglés, hemos acordado usar este idioma en nuestro código. Respetamos y nos gusta el idioma en el que hablamos pero el código en "espanglish" puede ser muy molesto y aumentar la carga cognitiva. 22 23 - **Variables y funciones**: Usamos **`camelCase`**. Los nombres de variables deben ser sustantivos que describan su contenido (ej., `userId`, `userName`), y los de las funciones, verbos que indiquen lo que hacen (ej., `fetchUsers`, `calculateTotal`, `getSomeShit`)... tener cuidado con palabras genéricas como `info` o `data` y de cuando sea posible optar por algo más descriptivo de la información que contienen. 24 25 - **Tipos, clases y componentes**: Usamos **`PascalCase`**. Esto ayuda a diferenciarlos del resto del código (ej., `UserType`, `ProductCard`). 26 27 - **Constantes de configuración**: Usamos **`SCREAMING_SNAKE_CASE`**. Son constantes que se usan para una configurar un comportamiento del código, su nombre en mayúsculas debe dejar muy claro la info que contienen (ej., `API_URL`, `MAX_RETRIES`, `I_AM_A_MAGIC_NUMBER`). 28 29 ## Bibliotecas Externas 30 31 Importar debe suceder solo cuando algo es realmente necesario. Evitamos importar por importar y nos aseguramos de que las bibliotecas que usamos estén bien mantenidas y sean de alta calidad. 32 33 Un ejemplo de lo que puede salir mal es el caso de **`left-pad`**. Una biblioteca con una función simple (no más de cinco líneas de código y bastante innecesaria si se conocen los métodos para `String`), que, al ser eliminada de NPM(Luego de eso se reforzó la política de no borrado de NPM), causó que miles de proyectos dejaran de compilar. [El chisme completo](https://en.wikipedia.org/wiki/Npm_left-pad_incident). -
Erika Suarez @esuarez commentedMasterEdited
agregar espacio después de
NPMagregar espacio después de `NPM` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c415d713a828f8048b28966818d462ef37db8b2a_33_33)Toggle commit list
-
-
35 **Cada dependencia es una responsabilidad.** 36 37 Por lo tanto: 38 39 - Solo importamos cuando la lógica del proyecto no depende de la importación. 40 - Solo importamos si hemos confirmado que no hay una forma directa o clara de realizar lo que necesitamos con nuestro propio código dentro del tiempo que disponemos. 41 - Solo importamos bibliotecas que tengan soporte activo (al menos un año). 42 - Solo importamos bibliotecas con tipado en TypeScript nativo para integrarlas mejor. 43 44 ## Accesibilidad 45 46 Construir una interfaz de usuario no es solo cuestión de estética. La accesibilidad es fundamental para que nuestras aplicaciones puedan ser usadas por cualquier persona, considerando sus capacidades físicas, cognitivas, sociales, contextuales y tecnológicas. 47 48 **HTML Semántico**: Usa las etiquetas correctas (`<button>`, `<nav>`, `<article>`, ... ) en lugar de `<div>` como mantequilla en restaurante francés. El HTML semántico es clave para construir aplicaciones web accesibles desde el inicio, ayudando a los lectores de pantalla a entender la estructura de la página, facilitando la navegación con tecnologías asistivas y mejorando el SEO. [Aquí hay una pequeña guía](https://webdesign.solomon.ng/html-and-css/semantic-html/semantic-html.html). 49 50 **Atributos `aria-*`**: Una vez que nuestro documento está bien estructurado, los usuarios con tecnologías asistivas deben ser capaces de comprender los cambios que introducimos en el documento a través de las interacciones. Aquí es donde entra `aria-*`, que complementa lo que el HTML no cubre. Sin embargo, _no aria is better than wrong aria_(Es mejor no tener aria a tener uno mal escrito). Si no entiendes el atributo, investiga antes de usarlo. [Esta es una buena introducción a ARIA](https://accessibilityfordevelopers.com/guide-to-aria/) y [aquí está la guía de MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA), que es más amigable que las especificaciones de la W3C. -
Erika Suarez @esuarez commentedMasterEdited
agregar espacio luego de
wrong aria_agregar espacio luego de `wrong aria_` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c415d713a828f8048b28966818d462ef37db8b2a_50_50)Toggle commit list
-
-
37 Por lo tanto: 38 39 - Solo importamos cuando la lógica del proyecto no depende de la importación. 40 - Solo importamos si hemos confirmado que no hay una forma directa o clara de realizar lo que necesitamos con nuestro propio código dentro del tiempo que disponemos. 41 - Solo importamos bibliotecas que tengan soporte activo (al menos un año). 42 - Solo importamos bibliotecas con tipado en TypeScript nativo para integrarlas mejor. 43 44 ## Accesibilidad 45 46 Construir una interfaz de usuario no es solo cuestión de estética. La accesibilidad es fundamental para que nuestras aplicaciones puedan ser usadas por cualquier persona, considerando sus capacidades físicas, cognitivas, sociales, contextuales y tecnológicas. 47 48 **HTML Semántico**: Usa las etiquetas correctas (`<button>`, `<nav>`, `<article>`, ... ) en lugar de `<div>` como mantequilla en restaurante francés. El HTML semántico es clave para construir aplicaciones web accesibles desde el inicio, ayudando a los lectores de pantalla a entender la estructura de la página, facilitando la navegación con tecnologías asistivas y mejorando el SEO. [Aquí hay una pequeña guía](https://webdesign.solomon.ng/html-and-css/semantic-html/semantic-html.html). 49 50 **Atributos `aria-*`**: Una vez que nuestro documento está bien estructurado, los usuarios con tecnologías asistivas deben ser capaces de comprender los cambios que introducimos en el documento a través de las interacciones. Aquí es donde entra `aria-*`, que complementa lo que el HTML no cubre. Sin embargo, _no aria is better than wrong aria_(Es mejor no tener aria a tener uno mal escrito). Si no entiendes el atributo, investiga antes de usarlo. [Esta es una buena introducción a ARIA](https://accessibilityfordevelopers.com/guide-to-aria/) y [aquí está la guía de MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA), que es más amigable que las especificaciones de la W3C. 51 52 **Manejo de Foco**: Es clave que todo lo que se puede hacer con el _mouse_ también se posible hacerlo con el teclado. Asegúrate de que los elementos sean enfocables y que el orden del foco sea lógico. -
Erika Suarez @esuarez commentedMasterEdited
typo:
sea posibletypo: `sea posible` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c415d713a828f8048b28966818d462ef37db8b2a_52_52)Toggle commit list
-
-
62 enum Status { 63 Loading = 'LOADING', 64 Success = 'SUCCESS', 65 Error = 'ERROR', 66 } 67 68 const currentStatus = Status.Loading; 69 ``` 70 71 El uso de literales es recomendado para un conjunto de valores fijos y acotados. Por ejemplo: `type UserRole = 'admin' | 'guest'`. 72 73 ## `any`, `unknown` y `never` 74 75 **`any`**: **NO USARLO NUNCA**, salvo que estemos en proceso de migrar algo de JS a TS. Es la peor práctica y anula completamente el propósito de TypeScript. 76 77 **`unknown`**: Este es el tipo de dato que debes usar cuando no sabes qué tipo va a entrar. Después, usa _type narrowing_ para trabajar con el valor. -
Erika Suarez @esuarez commentedMasterEdited
sería bueno poner un enlace a una explicación a
type narrowing(creo que no debería ponerse una explicación explícita aquí en nuestra documentación (sí, valga la redundancia)sería bueno poner un enlace a una explicación a `type narrowing` (creo que no debería ponerse una explicación explícita aquí en nuestra documentación (sí, valga la redundancia) -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#dd7cd76219033ee17300717daf909051108cd73b_77_77)Toggle commit list
-
-
81 82 ## Props: Cómo pasar y gestionar propiedades 83 84 Una de las mayores ventajas de usar TypeScript es que podemos definir la "forma" de las _props_ explícitamente sin usar prop-types, lo que nos permite saber exactamente qué tipo de datos estamos recibiendo y enviando, y evitar errores en tiempo de compilación. Siempre tipamos los props. Esta práctica nos asegura que los datos que pasan entre componentes sean consistentes y predecibles. 85 86 Un punto importante es evitar el uso de `React.FC` y similares que sirven para tipar componentes. Aunque parece práctico, puede causar problemas con el tipado de la propiedad `children`, siempre la convierte en opcional, sin importar que la hayamos definido como obligatoria o que el componente no la necesite... lo que podría generar confusiones y _bugs_ difíciles de rastrear. 87 88 ## Manejo de Estados: Estrategias claras 89 90 Di no a los estados derivados; en lugar de almacenar una variable en el estado que se puede calcular a partir de otros, realizamos el cálculo directamente en el cuerpo del componente, antes del renderizado. 91 92 Para manejar el estado, usamos `useState` para estados simples, como booleanos, cadenas, números, objetos, etc. Sin embargo, para estados más complejos que involucran múltiples transiciones o modificaciones, preferimos usar `useReducer`, ya que centraliza la lógica de actualización del estado y la hace más predecible y testeable. 93 94 ## Sincronización (`useEffect`) 95 96 Dejemos de pensar en `useEffect` como una simple herramienta para efectos secundarios, tomémoslo como un mecanismo de para la sincronización del componente con sistemas externos (fetch, localstorage, etc). Como se sugiere [You might not need an effect](https://react.dev/learn/you-might-not-need-an-effect), a menudo no se necesita un efecto, por lo que es vital usarlo solo cuando es necesario y para lo que fie creado. -
Erika Suarez @esuarez commentedMasterEdited
borrar
deenun mecanismo de para la sincronizaciónborrar `de` en `un mecanismo de para la sincronización` -
Erika Suarez @esuarez commentedMasterEdited
typo en
fie creadotypo en `fie creado` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c601f0869e8a397ffaaa06df334db2207906725c_96_126)Toggle commit list
-
-
121 122 Para mantener el código claro, un handler debe tener una sola responsabilidad, como hacer una petición a la API o actualizar un estado. Siempre los nombramos con el prefijo handle (ej., handleClick, handleSubmit). Si un handler depende del estado o de las props, lo definimos dentro del componente; si no, lo movemos fuera del componente para que sea más fácil de reutilizar y probar, si solo es usado en este componente, puede dejarse en el mismo archivo, de lo contrario, debe moverse al lugar que la arquitectura de la función haya designado para los helpers y utils. 123 124 ## Seguridad y Buenas Prácticas 125 126 - **Sanitización de datos**: Asegúrate de que los datos externos se limpien antes de ser renderizados en JSX para prevenir ataques de _cross-site scripting_. 127 128 - **Manejo seguro de dependencias del package.json**: La gestión de dependencias es un proceso delicado. Las actualizaciones automáticas solo deben aplicarse para _hotfixes_ y parches menores. Las actualizaciones de versión y los cambios importantes deben hacerse bajo supervisión al menos una vez al año. 129 130 - **¡No uses `dangerouslySetInnerHTML`!**: Esta propiedad es peligrosa y debe evitarse. Si es absolutamente necesario, su uso debe estar justificado y el contenido debe ser sanitizado de antemano. 131 132 ## Manejo de errores 133 134 ### Manejo de Errores Asíncronos 135 136 Cada llamada a una API u operación async debe estar envuelta en un bloque try-catch o un chaininng `.then().catch()` apropiado, y los errores deben ser manejados de manera uniforme en toda la aplicación. -
Erika Suarez @esuarez commentedMasterEdited
aquí estoy con Cesar y creo que sería mejor decir "encadenado" en lugar de "un chaining"
aquí estoy con Cesar y creo que sería mejor decir "encadenado" en lugar de "un chaining" -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c601f0869e8a397ffaaa06df334db2207906725c_136_166)Toggle commit list
-
-
123 124 ## Seguridad y Buenas Prácticas 125 126 - **Sanitización de datos**: Asegúrate de que los datos externos se limpien antes de ser renderizados en JSX para prevenir ataques de _cross-site scripting_. 127 128 - **Manejo seguro de dependencias del package.json**: La gestión de dependencias es un proceso delicado. Las actualizaciones automáticas solo deben aplicarse para _hotfixes_ y parches menores. Las actualizaciones de versión y los cambios importantes deben hacerse bajo supervisión al menos una vez al año. 129 130 - **¡No uses `dangerouslySetInnerHTML`!**: Esta propiedad es peligrosa y debe evitarse. Si es absolutamente necesario, su uso debe estar justificado y el contenido debe ser sanitizado de antemano. 131 132 ## Manejo de errores 133 134 ### Manejo de Errores Asíncronos 135 136 Cada llamada a una API u operación async debe estar envuelta en un bloque try-catch o un chaininng `.then().catch()` apropiado, y los errores deben ser manejados de manera uniforme en toda la aplicación. 137 138 Una estrategia son los estados de error en hooks personalizados permiten centralizar la lógica de manejo de errores y reutilizarla en múltiples componentes. Lo que ayuda con la consistencia en cómo se manejan los errores en toda la aplicación y facilita el mantenimiento del código. -
Erika Suarez @esuarez commentedMasterEdited
yo le agregaría un "que" aquí
hooks personalizados <que> permitenyo le agregaría un "que" aquí `hooks personalizados <que> permiten` -
Miguel Mejía @magomez
changed this line in version 4 of the diff
changed this line in version 4 of the diff
changed this line in [version 4 of the diff](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d#c601f0869e8a397ffaaa06df334db2207906725c_138_168)Toggle commit list
-
-
Miguel Mejía @magomez
resolved all discussions
resolved all discussions
resolved all discussionsToggle commit list -
Miguel Mejía @magomez
added 1 commit
- 2c14cac8 - Fix some typos and adds some examples
added 1 commit * 2c14cac8 - Fix some typos and adds some examples [Compare with previous version](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=335&start_sha=cbac600d9bbf610ca59ed2854c941ae9fea7389d)Toggle commit list -
Miguel Mejía @magomez
added 1 commit
- c99cdc69 - Adds arrays & generics legacy observation
added 1 commit * c99cdc69 - Adds arrays & generics legacy observation [Compare with previous version](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=336&start_sha=2c14cac8f2dab57079a362b5d0d269204170d31e)Toggle commit list -
Miguel Mejía @magomez
added 1 commit
- 45094797 - Updates explanation of the eslitn config tules
added 1 commit
- 45094797 - Updates explanation of the eslitn config tules
added 1 commit * 45094797 - Updates explanation of the eslitn config tules [Compare with previous version](http://gitlab.example.com/pem/software-development-docs/merge_requests/7/diffs?diff_id=337&start_sha=c99cdc69feaf2bae2489501289801fb2356afb6b)Toggle commit list -
Miguel Mejía @magomez
merged
merged
mergedToggle commit list -
Miguel Mejía @magomez
mentioned in commit a3bfb3be
mentioned in commit a3bfb3be
mentioned in commit a3bfb3be8fd3948fb2bc5edf614dff4f0ce0b430Toggle commit list