Usá la IA para aprender arquitectura, no para evitarla.
Estas guías te enseñan a formularle preguntas a la IA de manera que construyas comprensión real sobre diseño de software por capas, en lugar de solo obtener código que no podés explicar.
¿Cómo funciona cada sesión?
Todas las actividades con IA siguen este protocolo de tres momentos. No podés saltarte el PRE-IA.
Intentalo vos primero
Antes de abrir cualquier herramienta de IA, resolvé el problema con lo que sabés. Escribí tu propuesta en papel o en el sistema.
⏱ 15 minDialogá con la IA
Usá el prompt de la guía correspondiente. Solo podés pedirle razonamiento y explicaciones, nunca el código completo directamente.
⏱ 30–40 minReflexioná y apropiáte
Comparé tu propuesta inicial con lo que aprendiste. Respondé: ¿qué entendí mejor? ¿qué cambié en mi diseño y por qué?
⏱ 15 min¿Qué nivel cognitivo desarrolla cada guía?
Guía 1
Guía 2
Guías 3 y 4
Guía 5
Referencia rápida: Las tres capas
| Capa | Nombre alternativo | ¿Qué hace? | Ejemplo de clase |
|---|---|---|---|
| UI Presentación | Frontend / Vista | Interactúa con el usuario. Captura datos y muestra resultados. No valida ni accede a datos. | FormularioEstudiante, PanelPrincipal |
| BLL Lógica de Negocio | Servicio / Service | Aplica las reglas del sistema. Valida datos. Coordina entre UI y DAL. No muestra nada al usuario. | ServicioEstudiante, ServicioFactura |
| DAL Acceso a Datos | DAO / Repository | Ejecuta operaciones CRUD sobre la base de datos. No valida reglas de negocio. | EstudianteDAO, ClienteRepository |
Guía 1 — Prompt Explicativo
¿Cuándo usar esta guía?
Cuando no entendés la diferencia entre dos capas, no sabés qué responsabilidad tiene una clase, o querés que te expliquen un concepto arquitectónico de varias formas antes de intentar implementarlo.
Prompt base (copiá y adaptá)
Explícame con un ejemplo concreto en [Java / C# / Python] qué diferencia hay entre la capa de [capa A] y la capa de [capa B] en una arquitectura de software por capas. No me des el código completo de un sistema. Solo usá una clase de ejemplo pequeña por capa para que pueda ver el contraste. Explica después por qué esa responsabilidad pertenece a esa capa y no a la otra.
Ejemplos de preguntas que podés formular
¿Qué diferencia hay entre la capa DAO y la capa de Lógica de Negocio? ¿Por qué no puedo poner la validación directamente en el DAO?
Explícame qué significa que una capa tenga "responsabilidad única". Dame un ejemplo con una clase de inventario mal diseñada y otra bien diseñada.
¿Por qué la clase que muestra datos en pantalla no debería tener código SQL? Explicámelo con un ejemplo simple en Java.
Qué evaluar en la respuesta de la IA
- Con tus propias palabras, ¿cuál es la diferencia principal entre las dos capas que preguntaste?
- ¿Podés identificar en el código de tu proyecto actual alguna clase que esté mezclando responsabilidades de dos capas diferentes?
- ¿Qué cambiarías en esa clase para que respete la separación de responsabilidades?
Guía 2 — Prompt de Depuración Guiada
¿Cuándo usar esta guía?
Cuando tu código compila y corre, pero sospechás que tiene problemas de diseño arquitectónico. O cuando tenés un error y no sabés si es de sintaxis, de lógica o de arquitectura.
Prompt base — Versión arquitectónica
Tengo este fragmento de código en [lenguaje]. Sin corregirlo directamente, dime:
1. ¿Qué principio de separación de capas está violando y por qué?
2. ¿A qué capa debería pertenecer el código que está en el lugar equivocado?
3. Dame una pista de por dónde empezar a corregirlo, pero no me escribas el código corregido.
Código de práctica — Identificá las violaciones
El siguiente fragmento tiene al menos 2 violaciones arquitectónicas. Usá el Prompt Depuración Guiada para identificarlas.
// FormularioVenta.java — supuestamente capa UI public class FormularioVenta { public void procesarVenta(String prod, int cant, double precio) { // ← ¿Qué está mal aquí? if (cant <= 0 || precio <= 0) { System.out.println("Datos inválidos"); return; } double total = cant * precio * 1.13; // ← ¿Y aquí? // ← ¿Y esto? try { Connection c = DriverManager.getConnection( "jdbc:mysql://localhost/tienda", "root", "admin"); PreparedStatement ps = c.prepareStatement( "INSERT INTO ventas VALUES(?,?,?)"); ps.setString(1, prod); ps.setInt(2, cant); ps.setDouble(3, total); ps.executeUpdate(); } catch(Exception e){ e.printStackTrace(); } } }
Prompt base — Versión error de compilación
Mi código tiene este error: [pegá el stack trace]. Sin darme el código corregido:
1. ¿En qué archivo y línea ocurre el problema según el mensaje?
2. ¿Qué tipo de error es (sintaxis, lógica, null, tipo de datos)?
3. ¿Qué debería revisar primero para encontrar la causa?
- ¿Cuáles fueron las violaciones que encontraste en el código de práctica? ¿Coincidió con lo que te dijo la IA?
- ¿A qué capa pertenece cada fragmento mal ubicado? Completá: «El código de la línea ___ debería estar en la clase ___ de la capa ___».
- ¿Podés dibujar un diagrama simple que muestre cómo debería fluir la llamada entre las tres capas para esta funcionalidad?
Guía 3 — Prompt de Comparación Arquitectónica
¿Cuándo usar esta guía?
Cuando tenés dos formas de implementar algo y querés saber cuál es arquitectónicamente superior, o cuando querés evaluar si tu diseño respeta los principios de separación de responsabilidades.
Prompt base
Tengo estas dos implementaciones de [nombre de la funcionalidad] en [lenguaje]:
Implementación A: [pegá el código A]
Implementación B: [pegá el código B]
Sin decirme directamente cuál es la correcta:
1. ¿Cuál de las dos respeta mejor el principio de responsabilidad única de cada capa?
2. ¿Cuál tendría más problemas si tuviéramos que cambiar la base de datos por otra?
3. ¿Qué criterio arquitectónico diferencia a una de la otra?
Comparación de práctica — ¿Cuál es mejor?
Implementación A:
// Versión A — ¿Qué opinas? public class RegistroEstudiante { public void guardar(Estudiante e) { if (e.getCedula() == null) { throw new IllegalArgumentException("Cédula vacía"); } Connection c = DriverManager.getConnection("..."); PreparedStatement ps = c.prepareStatement("INSERT INTO..."); ps.executeUpdate(); } }
Implementación B:
// Versión B — ¿Qué opinas? public class ServicioEstudiante { // BLL private EstudianteDAO dao = new EstudianteDAO(); public void guardar(Estudiante e) { if (e.getCedula() == null) throw new IllegalArgumentException("Cédula vacía"); dao.insertar(e); } } public class EstudianteDAO { // DAL public void insertar(Estudiante e) { Connection c = DriverManager.getConnection("..."); PreparedStatement ps = c.prepareStatement("INSERT INTO..."); ps.executeUpdate(); } }
- ¿Cuál implementación elegiste como mejor y por qué criterio arquitectónico?
- ¿Qué pasaría en la Implementación A si en el futuro la empresa cambia de MySQL a PostgreSQL? ¿Y en la B?
- Revisá tu propio proyecto: ¿cuál de las dos versiones se parece más a lo que tenés?
Guía 4 — Prompt de Refactorización Justificada
¿Cuándo usar esta guía?
Cuando tenés código funcional pero mal estructurado arquitectónicamente, y querés mejorarlo de forma que entiendas cada cambio que hacés, no solo que el programa siga corriendo.
Prompt base
Tengo este código en [lenguaje] que funciona pero tiene problemas de arquitectura:
[pegá el código]
Sin reescribir el código completo todavía:
1. ¿Cuántas clases debería tener un sistema bien estructurado para esta funcionalidad?
2. ¿Qué responsabilidad debería tener cada clase?
3. ¿Qué líneas de mi código actual deberían moverse a otra clase y por qué?
Luego, acompañame en la refactorización: yo voy a proponer la nueva estructura y vos me decís si respeta la separación de capas.
Ejercicio de refactorización paso a paso
Partís de este código monolítico y lo refactorizás en tres capas:
// Código inicial — todo en una clase, ¡a refactorizar! public class AppPrestamo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Libro: "); String libro = sc.nextLine(); System.out.print("Estudiante: "); String est = sc.nextLine(); // Validación mezclada con UI if (libro.isEmpty() || est.isEmpty()) { System.out.println("Datos incompletos"); return; } // Acceso a datos mezclado con todo Connection c = DriverManager.getConnection("jdbc:mysql://..."); PreparedStatement ps = c.prepareStatement( "INSERT INTO prestamos VALUES(?,?,NOW())"); ps.setString(1, libro); ps.setString(2, est); ps.executeUpdate(); System.out.println("Préstamo registrado."); } }
Usá el Prompt de Refactorización para que la IA te diga cuántas clases necesitás y qué responsabilidad tiene cada una.
Proponé vos la lista de clases con su capa. Compartísela a la IA y pedile que evalúe si la separación es correcta.
Implementá las clases vos. Luego usá el Prompt de Comparación para comparar tu versión refactorizada con el original.
- ¿Cuántas clases creaste en la refactorización? Nombralas y asignales su capa.
- ¿Qué línea específica del código original fue la más difícil de reubicar? ¿Por qué?
- Si tuvieras que agregar una nueva funcionalidad (marcar préstamo como devuelto), ¿en qué clase la pondrías ahora con la nueva arquitectura? ¿Y en la versión original?
Guía 5 — Prompt de Consultor de Diseño
¿Cuándo usar esta guía?
Cuando tenés que diseñar un sistema nuevo desde cero. La IA no diseña por vos — vos proponés la arquitectura y la IA la revisa críticamente.
Prompt base
Voy a diseñar un sistema de [descripción del sistema] en [lenguaje] con arquitectura por capas.
Estas son las clases que propongo y sus capas:
[tu lista de clases con su capa y responsabilidad]
Actuá como mi consultor de arquitectura:
1. ¿Mi distribución de responsabilidades respeta la separación de capas?
2. Si encontrás problemas, explicame cuáles son pero no me los corrijas directamente. Dejá que yo proponga la solución primero.
3. ¿Hay alguna responsabilidad que olvidé asignar a alguna capa?
Sistema de práctica para diseñar
Sistema de Gestión de Notas Estudiantiles
Funcionalidades: registrar una nota (estudiante, materia, calificación), calcular el promedio de un estudiante, listar estudiantes con nota mayor a 70, actualizar una nota existente.
PRE-IA: Diseñá vos primero la lista de clases con su capa y responsabilidad. Escribila sin consultar nada.
CON-IA: Compartí tu diseño a la IA usando el Prompt Consultor. No le mostrés que querés que te lo corrija — pedile que lo evalúe.
Iteración: Si la IA encontró problemas, proponé vos la corrección antes de pedirle que la valide.
Implementación: Implementá al menos 2 de las clases diseñadas. Usá la Guía 4 si necesitás ayuda durante la implementación.
Plantilla para proponer tu diseño
Clase: NombreClase — Capa: UI / BLL / DAL
Responsabilidad: qué hace esta clase
Métodos principales: lista de métodos
Clase: NombreClase — Capa: UI / BLL / DAL
Responsabilidad: qué hace esta clase
Métodos principales: lista de métodos
[repetí para todas las clases que propones]
- ¿Tu diseño inicial tenía problemas arquitectónicos? ¿Cuáles encontró la IA?
- ¿Cuántas iteraciones necesitaste antes de tener una arquitectura que la IA validara como correcta?
- Completá: «Antes de esta actividad yo pensaba que la arquitectura por capas era... Ahora pienso que...».
- ¿Qué diferencia notás entre cómo le hiciste preguntas a la IA hoy versus cómo lo hacías antes de conocer estas guías?