Test cuestionario sobre programación orientada a objetos - the question form
Preguntas: 16 · 10 minutos
1. Necesitas agregar registro de eventos o almacenamiento en caché en torno a un servicio durante el tiempo de ejecución, sin crear muchas subclases ni cambiar la implementación del servicio. ¿Qué patrón es el más adecuado?
Singleton
Método fábrica
Método plantilla
Decorador
2. Un BankAccount nunca debe tener un saldo negativo. ¿Qué diseño protege más directamente este invariante de clase?
Permitir actualizaciones directas del saldo y comprobar el valor solo al mostrarlo
Almacenar el saldo en varios campos públicos para compararlo
Restringir las modificaciones no controladas y garantizar que todas las operaciones públicas preserven la regla
Dejar que el código que realiza la llamada decida si cada retiro es válido
3. Dos objetos Customer son instancias separadas, pero contienen el mismo número de cuenta y los mismos datos del cliente. ¿Qué afirmación distingue correctamente la identidad de la igualdad por valor?
Deben tener la misma identidad porque sus datos coinciden
Pueden ser iguales por valor y aun así tener identidades de objeto diferentes
Deben ser diferentes por valor porque se construyeron por separado
La identidad y la igualdad por valor siempre son intercambiables en la POO
4. ¿Qué descripción representa mejor la encapsulación en la programación orientada a objetos?
Definir varias clases con los mismos nombres de métodos
Conservar en un modelo solo las características esenciales de un concepto
Crear una clase nueva extendiendo una clase existente
Agrupar el estado con el comportamiento relacionado y, al mismo tiempo, controlar el acceso directo a ese estado
5. ¿Cuál es la responsabilidad principal de un constructor en una clase bien diseñada?
Establecer el estado inicial del objeto y sus dependencias requeridas
Elegir en tiempo de compilación qué método sobrescrito se ejecutará
Conceder a todas las demás clases acceso directo a los campos internos
Destruir el objeto cuando ya no tenga referencias
6. Un OrderService crea y utiliza directamente un SqlOrderRepository. ¿Qué cambio se ajusta mejor al principio de inversión de dependencias?
Hacer que OrderService dependa de una abstracción de repositorio inyectada
Trasladar todos los métodos de OrderService a SqlOrderRepository
Crear el repositorio en una variable global estática
Hacer que SqlOrderRepository herede de OrderService
7. Un programa envía la misma llamada draw() a objetos Circle, Rectangle y Triangle, y cada objeto responde de manera diferente. ¿Qué concepto ilustra esto?
Encapsulación
Polimorfismo
Composición de objetos
Encadenamiento de constructores
8. ¿Qué relación respalda con mayor solidez el uso adecuado de la herencia?
La clase nueva contiene una instancia de la clase existente
La clase nueva llama temporalmente a métodos de la clase existente
Las dos clases simplemente almacenan campos similares
La clase nueva es un tipo especializado que puede sustituir al tipo existente
9. Una clase base Bird exige que cada subtipo implemente fly(). Un subtipo Penguin solo puede implementarlo lanzando un error de operación no compatible. ¿Cuál es el mejor rediseño?
Trasladar el comportamiento de vuelo a una capacidad independiente implementada solo por las aves que vuelan
Hacer que Penguin sobrescriba todos los métodos de Bird
Agregar una comprobación de tipo antes de cada llamada a fly()
Mantener fly() en Bird y devolver false para los pingüinos
10. ¿Cuál es el propósito principal de la abstracción en el diseño orientado a objetos?
Garantizar que todas las clases hereden de otra clase
Exponer todos los campos que necesitan los objetos colaboradores
Modelar el comportamiento esencial y ocultar los detalles innecesarios de implementación
Convertir todos los métodos de instancia en métodos estáticos
11. Un OrderService llama a un proveedor de pagos externo. ¿Cómo puedes realizar pruebas unitarias del servicio de la manera más eficaz sin efectuar solicitudes de pago reales?
Copiar el código de producción del proveedor de pagos en la prueba
Realizar la solicitud de pago real y revertir inmediatamente la transacción
Inyectar una abstracción de pasarela de pagos y sustituirla por un doble de prueba controlado
Eliminar la llamada de pago de OrderService durante las pruebas
12. Un objeto Money debe ser inmutable. ¿Qué decisión de implementación respalda mejor ese objetivo?
Exponer su campo de cantidad para que el código que lo utiliza pueda actualizarlo directamente
Proporcionar métodos de asignación que rechacen silenciosamente algunos cambios
Mantener su estado como de solo lectura después de la construcción y devolver objetos nuevos para los valores modificados
Almacenar una única cantidad mutable compartida por todas las instancias de Money
13. Una interfaz MultiFunctionDevice exige print(), scan() y fax(), pero una impresora básica solo puede imprimir. ¿Qué rediseño se ajusta mejor al principio de segregación de interfaces?
Convertir los métodos de la impresora en campos públicos
Dividir la interfaz en capacidades más pequeñas de impresión, escaneo y envío de fax
Trasladar los tres métodos a una superclase abstracta común
Hacer que la impresora básica lance errores para scan() y fax()
14. Un Car necesita un Engine, pero se pueden instalar o reemplazar distintas implementaciones de motor. ¿Qué diseño representa mejor esta relación?
Hacer que Engine herede de Car
Almacenar todas las operaciones del motor como funciones globales
Duplicar el comportamiento del motor dentro de cada clase Car
Proporcionar a Car una referencia a Engine mediante composición
15. Una aplicación debe admitir nuevos formatos de exportación sin modificar repetidamente las clases de exportación que ya se probaron. ¿Qué diseño respalda mejor el principio abierto/cerrado?
Definir una abstracción de exportador y agregar una implementación nueva para cada formato
Colocar el algoritmo de cada formato en una única clase de exportador de gran tamaño
Agregar una sentencia condicional cada vez mayor para todos los formatos
Copiar el exportador existente y cambiar el nombre de sus métodos públicos
16. Una variable declarada como PaymentMethod hace referencia, en tiempo de ejecución, a un objeto CreditCardPayment. Cuando se llama a un método process() sobrescrito, se ejecuta la implementación para tarjetas de crédito. ¿Qué mecanismo seleccionó ese método?
Sobrecarga de métodos en tiempo de compilación
Despacho dinámico
Delegación de constructores
Ocultamiento de campos