Explicación del concepto
Arquitectura suena a palabra grande, pero en scripts pequeños de Python significa algo simple: pon cada responsabilidad en el lugar correcto. Los datos deben tomar forma en un lugar, el formateo debe ocurrir en otro, y la impresión debe permanecer cerca del borde del programa. En esta lección, construirás un pequeño formateador de perfiles. El objetivo real no son los perfiles en sí. El objetivo es aprender a separar los datos de la presentación para que tu script se mantenga legible a medida que crece. Mucho código de principiante se vuelve desordenado porque todo sucede en `main()`. Eso funciona para cinco líneas, luego rápidamente se convierte en una pila de lógica mezclada. Aquí, practicarás un diseño más limpio: una función prepara los datos, otra función los formatea, y `main()` solo conecta las piezas. Al final de esta lección, deberías poder: • explicar por qué la impresión pertenece al borde del programa, • separar las decisiones de estructura de datos del formateo de salida, • describir cómo este script podría más tarde intercambiar datos falsos por filas de base de datos o resultados de API. Por qué esto importa: la buena arquitectura no se trata de hacer que el código parezca avanzado. Se trata de hacer que el código sea más fácil de cambiar sin romper partes no relacionadas.
Dónde poner el código
- Define variables de color y posición al principio.
- Crea la lógica de dibujo o posicionamiento de formas en el medio.
- Renderiza la salida (impresión, canvas, SVG o bloque estilizado) al final.
Referencia de comandos
- Mantén `main()` pequeño; debe conectar piezas, no ocultar toda la lógica de negocio.
- Usa una función para cargar datos y otra para formatear datos para que cada parte sea fácil de cambiar.
- Devuelve cadenas desde las funciones de renderizado en lugar de imprimir dentro de ellas siempre que sea posible.
- Elige nombres que describan el rol de cada función, no solo el tipo de valor que devuelve.
Guía paso a paso
- Ejecuta el script una vez y observa que `load_learners()` prepara los datos mientras `render_profile_card()` controla la presentación.
- Añade un aprendiz más a la lista y confirma que ninguna otra función necesita cambiar.
- Cambia solo la cadena de formato en `render_profile_card()` y verifica que el cargador de datos permanezca intacto.
- Añade un nuevo campo como `level` o `country` al `TypedDict` y actualiza el renderizador con cuidado.
- Escribe una nota corta explicando por qué imprimir dentro de `main()` es más limpio que imprimir dentro de la función de carga de datos.
Ejercicios prácticos
- Reescribe el ejemplo con un `dataclass` en lugar de `TypedDict` y decide qué versión te parece más clara.
- Explica por qué almacenar cadenas preformateadas dentro de los datos crudos dificultaría futuros cambios.
- Imagina que los datos provienen más tarde de `SQLite` o una API. ¿Qué función debería cambiar primero y cuál debería permanecer igual?
Retos de código
- Añade un segundo renderizador que imprima una línea de resumen más corta, reutilizando la misma fuente de datos.
- Crea un pequeño paso de filtro que solo imprima aprendices con puntuaciones superiores a 900 sin mezclar la lógica de filtro en el renderizador.
Mini tareas de práctica
- Dibuja tres cajas en tus notas: datos, formateo, salida.
- Di el flujo en voz alta una vez: carga datos, formatea un elemento, imprime el resultado.
- Guarda una regla de esta lección: los cargadores cargan, los renderizadores renderizan, main conecta.
Error común
Mixing x and y axes or using wrong coordinate origin causes shapes to appear in unexpected places.
Mini reto de la vida real
Draw one square, one triangle, and one circle, then move X marker 2 steps right and 1 step down.