Sigla en azul →glosario(primera vez: expansión entre paréntesis).
M06 — Programación II (OO, tipos y errores)
Por qué existe
Cierras la etapa básica escribiendo código que otro ingeniero (o tú en 6 meses) pueda mantener.
En resumen: modelas un dominio con tipos serios, refactorizas con Código limpio y empaquetas algo reutilizable.
Objetivos de aprendizaje
Al terminar debes poder:
- Modelar un dominio con encapsulación, composición e interfaces (sin frameworks web).
- Aplicar principios de diseño legible (nombres, funciones pequeñas, responsabilidades claras).
- Usar tipos avanzados útiles en TS (uniones, narrowing, generics básicos) y errores como parte del diseño.
- Empaquetar, versionar y documentar una librería pequeña con tests.
Cómo estudiar esta materia (lecciones)
M06 sigue el formato de lecciones cortas y completas (como M01): marcas una a una cuando cumples “Hecho cuando”.
- Abre las lecciones en orden (L01 → L20).
- Cada lección trae objetivo, pasos, lectura y criterio “Hecho cuando”.
- Marca la lección en la UI solo si cumple ese criterio.
- Las prácticas / proyecto exigen evidencia en
projects/m06-programacion-ii/(o prefijom06-*acordado). - Prefiere composición antes que jerarquías profundas. Cada refactor: tests en verde antes y después.
- Método general: Cómo estudiar.
Semana tipo (20 h)
| Bloque | Horas | Qué haces |
|---|---|---|
| OO + tipos | 6–8 | L01–L08, dominio + interfaces |
| Refactor + TS avanzado | 6–8 | L09–L12, generics y narrowing |
| Errores + tests | 6–8 | L13–L16, Result y bordes |
| Lib + cierre | 4–6 | L17–L20, npm pack y README |
| Retro | 1 | Cuándo NO usar herencia |
Si un día solo tienes 2 h: una lección práctica (pasos + evidencia). No saltes la fila de lectura de esa lección.
Lecciones
Semana 1 — Objetos, responsabilidades y estilo (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L01 | Dominio inicial y entorno del proyecto | 5 |
| L02 | Objetos con comportamiento real | 5 |
| L03 | Encapsulación en TypeScript | 5 |
| L04 | Nombres y funciones pequeñas (CC 1–3) | 5 |
Semana 2 — Interfaces, composición y SOLID intro (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L05 | Interfaces y contratos de dominio | 5 |
| L06 | Composición frente a herencia | 5 |
| L07 | SOLID intro: S, O y D | 5 |
| L08 | Refactor documentado (P2) | 5 |
Semana 3 — Uniones, narrowing y generics (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L09 | Union types y modelado de estados | 5 |
| L10 | Narrowing y type guards | 5 |
| L11 | Generics: funciones y contenedores | 5 |
| L12 | Generics en APIs del dominio | 5 |
Semana 4 — Errores, Result y tests de borde (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L13 | Errores como diseño (CC cap. 7) | 5 |
| L14 | Patrón Result tipado | 5 |
| L15 | Tests de borde: null, vacío, duplicados (P3) | 5 |
| L16 | Logging, diagnóstico y contratos de error | 5 |
Semana 5 — Empaquetado y librería (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L17 | Estructura de paquete npm | 5 |
| L18 | Semver, scripts y build | 5 |
| L19 | README, API pública y ejemplos | 5 |
| L20 | Librería final y cierre de etapa básica | 5 |
Empieza por L01 hoy.
Lecturas (mapa rápido)
Canon: Código limpio (Martin, ed. ES) + El programador pragmático (Hunt & Thomas, ed. ES) + TypeScript Handbook. Catálogo: bibliografía.
| Semana | Lecciones | Capítulos / secciones |
|---|---|---|
| 1 | L01–L04 | CC caps. 1–3 + Pragmático DRY / ortogonalidad |
| 2 | L05–L08 | CC caps. 6 y 10 + SOLID S/O/D (resumen mentor) + Handbook Object Types |
| 3 | L09–L12 | Handbook Generics + Narrowing |
| 4 | L13–L16 | CC cap. 7 + patrón Result + docs de errores en Node |
| 5 | L17–L20 | CC cap. 9 + empaquetado npm + Vitest |
Regla: cada capítulo de CC aplicado → un commit de refactor con el principio en el mensaje.
Ejemplo — Result simple para errores
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
export type Result<T> = Ok<T> | Err;
export function prestar(libro: { prestado: boolean }): Result<void> {
if (libro.prestado) return { ok: false, error: "Ya prestado" };
libro.prestado = true;
return { ok: true, value: undefined };
}
Prácticas
- P1: Dominio “biblioteca” o “inventario” solo con TS (sin Express) — L01–L07.
- P2: Antes/después de refactor; guarda el diff — L08.
- P3: Tests que cubran null, vacío, duplicados — L15.
Proyecto útil
Librería pequeña (validación o utilidades del dominio). README, semver , tests, ejemplo de uso. Aunque sea npm pack local, debe sentirse profesional (L17–L20).
Errores comunes
- Herencia de 5 niveles “porque OOP”.
- Clases sin comportamiento (solo getters/setters vacíos).
- Tragar errores con
catch (e) {}. - Publicar sin README ni versión.
- Marcar lecciones sin cumplir “Hecho cuando”.
Evidencia de hecho
Marca la práctica en la UI solo si existe esto (o equivalente claro):
- P1 — Dominio:
projects/m06-*con modelo TS (sin Express). - P2 — Refactor: Commit/diff mostrando nombres y funciones pequeñas.
- P3 — Bordes: Tests de null, vacío, duplicados.
- Proyecto — Librería: README, semver, tests, ejemplo de uso.
Criterios de dominio (cierre Etapa Básica)
- Explicas cuándo NO usar herencia.
- Tu librería tiene API clara y tests.
- Revisas el código de M02 y señalas 5 mejoras concretas.