SOLID y Clean CodeLección 3 de 5

Leer antes de cambiar

Nombres que cuentan lo que hacen

Convierte abreviaturas ambiguas en una intención clara y comprueba qué datos devuelve tu función.

20 min aprox.4 pasosPráctica + comprobación
Qué aprenderás
  • Nombrar datos según su significado y su unidad.
  • Usar convenciones coherentes con el lenguaje y el equipo.
  • Elegir entre transformar y seleccionar elementos.
Índice de esta lección

Paso 1

Nombra el concepto y su unidad

Un nombre debe reducir las preguntas que haces al leer. “elapsedDays” explica más que “d”; “discountRate” deja claro que el descuento es una proporción.

En estos ejercicios usamos inglés y lowerCamelCase en variables. Es una convención del proyecto, no una ley universal: otros lenguajes y equipos pueden tener convenciones distintas.

Nombres de variables
Paso 1 · typescript
const elapsedDays = 23;const discountRate = 0.1;const maxClassesPerStudent = 6;

Qué deberías observar

Puedes explicar cada dato sin buscar un comentario que traduzca su nombre.

Paso 2

Lee una selección de archivos

Antes y Después seleccionan los mismos archivos. El segundo ejemplo cuenta qué evaluamos, qué significa el booleano y qué contiene el resultado.

“id” es una abreviatura habitual y útil aquí. El problema no es que un nombre sea corto, sino que obligue a adivinar su significado.

src/clean-code/01-names.ts
Paso 2 · typescript
const filesToEvaluate = [  { id: 1, isMarkedForDeletion: false },  { id: 2, isMarkedForDeletion: true },  { id: 3, isMarkedForDeletion: true },];const filesToDelete = filesToEvaluate.filter(  (file) => file.isMarkedForDeletion,);

Qué deberías observar

filesToDelete contiene los objetos con id 2 y 3, sin modificar el arreglo original.

Paso 3

Seleccionar no es transformar

filter conserva los elementos que cumplen la condición. map crea un resultado por cada elemento de entrada.

Si haces map de isMarkedForDeletion obtienes booleanos, no archivos. Corregir esa operación es un cambio de comportamiento; no lo confundas con renombrar variables.

Comparación de resultados
Paso 3 · typescript
const filesToDelete = filesToEvaluate.filter(  (file) => file.isMarkedForDeletion,);// [{ id: 2, ... }, { id: 3, ... }]

Qué deberías observar

La prueba comprueba los ids de los objetos seleccionados. Un arreglo de booleanos no cumple ese contrato.

Paso 4

Deja un contrato que se pueda probar

Extrae la selección a una función con un nombre que explique su resultado. Recibe los archivos por parámetro para probarla con distintos casos.

Evita sufijos redundantes por costumbre: “UserInterface” no siempre añade información a “User”. Sí conserva un detalle técnico cuando distingue una responsabilidad real, como un adaptador HTTP.

src/clean-code/01-names.ts
Paso 4 · typescript
export type StudyFile = {  id: number;  isMarkedForDeletion: boolean;}; export const studyFiles: StudyFile[] = [  { id: 1, isMarkedForDeletion: false },  { id: 2, isMarkedForDeletion: true },  { id: 3, isMarkedForDeletion: true },]; export function getFilesToDelete(filesToEvaluate: StudyFile[]): StudyFile[] {  return filesToEvaluate.filter((file) => file.isMarkedForDeletion);}

Qué deberías observar

npm test verifica la selección, el caso vacío y que los datos de entrada no se modifiquen.

Ahora te toca

Prueba la idea por tu cuenta

Añade un cuarto archivo sin marcar y comprueba que no aparece en filesToDelete. Después marca todos los archivos y comprueba que aparecen los cuatro.

Necesito una pista

Cambia los datos de entrada, no la función. Usa los ids para comprobar qué objetos se seleccionaron.

Comparar con una solución

Con el archivo 4 sin marcar, el resultado sigue siendo [2, 3]. Al marcar los cuatro, el resultado contiene [1, 2, 3, 4]. La función sigue usando filter y conserva el arreglo original.

Antes de seguir

Comprueba lo que aprendiste

No es una nota. Es una pausa para comprobar que la idea quedó clara.

1. ¿Qué devuelve files.map(file => file.isMarkedForDeletion)?
2. ¿Cuál describe mejor una proporción de descuento de 0.1?

¿Terminaste la práctica?

Haz el ejercicio y comprueba tus respuestas antes de marcar la lección como completada.

Apuntes y código de esta lección