Diseño OO y Patrones — Entrevista
Fuente: Generado con prompts/generar-mazo.md
oopsolidpatronesdiseño
Tarjetas
¿Qué elimina el polimorfismo?
El `switch`/`if` sobre el tipo. Llamás el mismo método y cada clase hace lo suyo — el caller no conoce ni le importa la clase concreta.
¿Qué es una clase anémica?
Objetos que solo tienen propiedades públicas y getters/setters, sin comportamiento — la lógica vive afuera en services que manipulan esos datos.
¿Qué es una "razón para cambiar" en SRP?
Un actor/grupo de interés que pide cambios: el mismo motivo de negocio. Una clase debe tener uno solo.
¿Qué habilita la inyección de dependencias?
Que la clase reciba sus dependencias desde afuera (constructor) en vez de crearlas adentro (`new`).
¿Composición vs herencia?
Composición: un objeto TIENE otro y delega. Herencia: un objeto ES otro y hereda todo. Regla práctica: composición por defecto, herencia solo para jerarquías "es-un" genuinas y estables.
¿Qué significa "programar contra una abstracción"?
Depender de interfaces/contratos, no de clases concretas. El high-level define qué necesita; el low-level lo implementa.
¿Qué desacopla el patrón Observer?
Emisor y receptores: el emisor notifica un evento sin saber quiénes ni cuántos escuchan.
¿Cuándo usar Strategy?
Cuando un algoritmo/comportamiento varía por caso y crece con if/else encadenados sobre el mismo dato. Cada variante se vuelve una clase con la misma interface.
¿Qué viola el Principio de Sustitución de Liskov?
Un hijo que no puede usarse donde se espera el padre. Clásico: `Cuadrado extends Rectangulo` cuyo `setAlto` también cambia el ancho.
¿Decorator vs herencia para agregar comportamiento?
Decorator envuelve al objeto con la misma interface y le suma algo antes/después de delegar. La herencia suma comportamiento compilando una nueva clase fija.
¿Cuándo aporta Factory Method?
Cuando crear el objeto requiere decidir (qué subclase, configuración, lookup) y esa decisión no le corresponde al caller.
¿Cuándo un patrón deja de sumar?
Cuando resuelve una variación que no existe todavía. Patrón = indirection pagada con complejidad: la mayoría solo se justifica cuando la segunda variante ya llegó.
¿Qué pide la Ley de Deméter ("talk only to friends")?
Hablar solo con tus colaboradores directos: `a.b().c().d()` es una cadena que conoce la estructura interna de otros.
¿Qué te obliga a hacer una interface "gorda"?
A implementar métodos que no necesitás: clientes que terminan dependiendo de cosas que jamás usan.
¿Qué significa "cerrado a modificación" en la práctica?
Agregar una variante nueva sin editar el código que ya existe: entra una clase o entrada de configuración nueva, y el `switch` del código viejo no se reabre.
¿Qué es un invariante de clase?
Una condición sobre su estado que se cumple desde que nace y antes y después de cada método público.
¿Static binding o dynamic dispatch — cuándo cada uno?
Static (overload): el método se elige por el tipo declarado, en compile time. Dynamic (override): se elige por el tipo real del receptor, en runtime.
¿Adapter o Facade — en qué se distinguen?
Adapter cambia la interfaz de algo que ya existe (1 a 1). Facade expone una interfaz nueva y más simple sobre un subsistema entero (N a 1).
¿Cuándo un Adapter es la respuesta?
Cuando tenés una clase que hace lo que necesitás pero habla otro contrato, y no podés —o no conviene— tocar ninguna de las dos.
¿Cómo permite el patrón Command implementar "deshacer"?
La acción es un objeto que sabe ejecutarse y revertirse (guarda lo necesario); undo = una pila de comandos ejecutados con su `deshacer()`.
¿Qué pasa si validás el objeto al usarlo y no al construirlo?
Que conviven instancias válidas e inválidas: cada consumidor tiene que re-chequear, y al que se le olvida le explota lejos del origen.
¿Builder vs constructor telescópico — cuándo cambia la cuenta?
Con muchos parámetros opcionales o con reglas entre ellos: el telescópico multiplica constructores o fuerza `null, null, 0`; el builder arma paso a paso y valida al final.
¿Null Object vs null-checks esparcidos — qué cambia?
Null Object centraliza el caso vacío: una implementación de la interface que no hace nada (o devuelve el vacío razonable), y el caller deja de preguntar.
¿Cuándo conviene clonar (Prototype) en vez de construir de cero?
Cuando el objeto nuevo parte de una configuración compleja ya resuelta —o crear es caro— y solo cambian unos detalles.
¿Por qué el Singleton es el patrón más criticado?
Porque es estado global con sintaxis elegante: dependencia oculta que nadie puede sustituir sin tocar a todos sus usuarios.
¿State vs Strategy — cuál es la diferencia de fondo?
En Strategy el cliente elige el algoritmo y se lo inyecta; en State el propio objeto cambia de comportamiento al transicionar su estado interno.
¿Qué controla el patrón Template Method?
El esqueleto del algoritmo, fijo en la clase padre; las subclases solo rellenan los pasos variables (hooks).
¿Qué desacopla el patrón Iterator?
El "cómo recorrer" del "qué se recorre": el cliente pide siguiente/haySiguiente sin conocer la estructura interna.
¿Qué problema de estado resuelve una defensive copy?
Que el caller mute tu interior por referencia: te pasa una lista, la guardás, y después la modifica desde afuera sin que te enteres.
¿Qué es acoplamiento y qué es cohesión?
Acoplamiento: cuánto sabe un módulo de otros — querés poco. Cohesión: cuánto se pertenecen las cosas que viven juntas — querés mucha.
¿Qué abstrae el patrón Repository?
El acceso a datos como si fuera una colección en memoria: `guardar`, `porId`, `buscarPorCriterio` — el dominio no sabe que hay SQL debajo.
¿Template Method o Strategy — cómo decidís?
Template: variar pasos de un algoritmo cuyo esqueleto es fijo, vía herencia. Strategy: reemplazar el algoritmo entero, inyectándolo vía composición.
¿Qué señales delatan acoplamiento excesivo?
Cambios en cascada: tocar una clase te obliga a editar tres más, y nadie te puede decir de antemano cuáles.
¿Qué problema resuelve el encapsulamiento?
Ocultar el estado interno y exponer solo comportamiento. El objeto protege sus invariantes: nadie puede dejarlo en un estado inválido desde afuera.