SOLID y Clean CodeLección 4 de 5

Leer antes de cambiar

Nombra según el dato

Distingue colecciones, preguntas booleanas, cantidades y acciones sin esconder su significado.

15 min aprox.4 pasosPráctica + comprobación
Qué aprenderás
  • Distinguir una colección de una cantidad por su nombre.
  • Leer booleanos sin dobles negaciones.
  • Nombrar funciones sin ocultar su contrato.
Índice de esta lección

Paso 1

Di qué contiene la colección

“fruitNames” comunica que tienes varios nombres. “fruits” encaja mejor cuando trabajas con objetos que representan frutas.

El nombre y el tipo se complementan. No añadas “List” por costumbre si un plural ya explica bien el dato.

src/clean-code/03-types.ts
Paso 1 · typescript
const fruitNames = ['manzana', 'pera'];const fruits = [{ name: 'manzana', price: 2 }];

Qué deberías observar

Puedes anticipar si cada elemento es un texto o un objeto.

Paso 2

Haz una pregunta que se pueda responder

Prefijos como is, has y can ayudan a leer condiciones: isEmpty pregunta si está vacío; canWrite pregunta si se puede escribir.

Atención al cambiar un nombre negativo: noValues y hasValues significan lo contrario. Hay que invertir el valor y revisar sus usos, no solo renombrar la variable.

src/clean-code/03-types.ts
Paso 2 · typescript
const hasValues = values.length > 0;const isEmpty = values.length === 0;// Si values = []: hasValues es false e isEmpty es true.

Qué deberías observar

Con un arreglo vacío, isEmpty es true. No confundas el nombre de la pregunta con su respuesta.

Paso 3

Incluye la cantidad y la unidad

“fruitCount” representa una cantidad; “maxFruits” representa un límite. Ambos son números, pero responden a preguntas distintas.

Para tiempo y dinero, una unidad explícita evita conversiones equivocadas. No es lo mismo delayMs que delaySeconds.

src/clean-code/03-types.ts
Paso 3 · typescript
const fruitCount = fruitNames.length;const maxFruits = 6;const delayMs = 500;

Qué deberías observar

Sabes qué se cuenta, cuál es el límite y en qué unidad se mide el tiempo.

Paso 4

Nombra una acción y respeta el contrato

Un verbo y un concepto suelen ser suficientes: countFruits, updateUser o sendEmail. El nombre no necesita describir cada línea de implementación.

Tampoco escondas una diferencia importante. createUser y findOrCreateUser prometen cosas distintas. Elige según el comportamiento real, no por hacer el nombre más corto.

src/clean-code/03-types.ts
Paso 4 · typescript
export function countFruits(fruitNames: string[]): number {  return fruitNames.length;} export function hasValues(values: unknown[]): boolean {  return values.length > 0;}

Qué deberías observar

La función countFruits devuelve una cantidad. hasValues devuelve una respuesta booleana.

Ahora te toca

Prueba la idea por tu cuenta

Elige nombres para una lista de correos, su cantidad y el permiso para enviar mensajes. Después escribe qué valor tendría cada uno si la lista está vacía y no tienes permiso.

Necesito una pista

Separa colección, cantidad y capacidad. Un nombre plural no debería contener únicamente un número.

Comparar con una solución

Una opción: emailAddresses = [], emailCount = 0 y canSendMessages = false. También puedes calcular isEmpty = emailAddresses.length === 0, que en este caso es true.

Antes de seguir

Comprueba lo que aprendiste

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

1. Si values es [], ¿cuánto vale isEmpty = values.length === 0?
2. ¿Qué nombre expresa mejor un permiso booleano?

¿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