Abstracción Fundamentos OOP – Interface, Clase Abstracta, Composición, Open Closed Principle
Este artículo es una explicación conceptual sobre la abstracción en OOP, incluyendo preguntas de examen y referencias.
En Pocas Palabras
La abstracción reduce sistemas complejos a sus propiedades y operaciones esenciales, define qué expone una interfaz mientras que el cómo permanece oculto y puede desarrollarse de forma independiente.
Descripción Técnica Concisa
La abstracción es la ocultación deliberada de detalles irrelevantes para obtener un modelo claro y estable. En OOP se implementa mediante interfaces, clases abstractas, modelos de rol y contratos que establecen el comportamiento observable. Las buenas abstracciones son mínimas, completas, consistentes, ortogonales, permiten intercambiabilidad y se prueban bien con procedimientos de caja negra. La abstracción trabaja en conjunto estrecho con la encapsulación y el polimorfismo: la abstracción define qué es visible, la encapsulación protege los detalles de implementación y el polimorfismo permite implementaciones intercambiables.
Puntos Clave Relevantes para Examen
- Enfoque en propiedades relevantes, reducción de la superficie visible
- Mecanismos: interface, clase abstracta, composición, genéricos
- Separación de contrato e implementación, fomenta bajo acoplamiento y alta cohesión
- Relevante para IHK, distinguir con precisión de encapsulación y herencia
- Práctica: interfaces pequeños basados en roles, Interface Segregation Principle
- Aspecto de seguridad: contratos claros limitan superficie de ataque y evitan manipulación de estado sin validar
- Rentabilidad: contratos estables reducen costos de mantenimiento y cambios
- Obligación de documentar: precondiciones, postcondiciones, excepciones, efectos secundarios de forma explícita
Componentes Clave
- Modelo de dominio, lenguaje ubicuo, términos y relaciones
- Interfaz de contrato, firmas, semántica, casos de error
- Bases abstractas, lógica compartida sin implementación completa
- Roles, múltiples interfaces pequeños en lugar de un God Interface
- Composición, relaciones de tiene-un para estructurar comportamiento
- Tipos genéricos, abstracción paramétrica sobre tipos
- Patrones de diseño: Strategy, Template Method, Adapter, Ports and Adapters
- Límites arquitectónicos: Ports, Adapters, Bounded Contexts
- Reglas de calidad: alta cohesión, bajo acoplamiento, conforme a LSP
- Procedimientos de prueba: Contract Tests, Substitution Tests, Property Based Tests
Ejemplo Práctico
// Objetivo: abstraer la exportación de archivos
interface Exporter {
byte[] export(Report r)
}
class PdfExporter implements Exporter {
public byte[] export(Report r) { /* PDF Rendering, Validierung, Byte Stream */ }
}
class CsvExporter implements Exporter {
public byte[] export(Report r) { /* CSV Serialisierung, Trennung, Encoding */ }
}
class ReportService {
private Exporter exporter
public ReportService(Exporter exporter) { this.exporter = exporter }
public byte[] exportReport(Report r) {
if (r == null) throw new IllegalArgumentException("Report erforderlich")
return exporter.export(r)
}
}
Explicación: La interfaz Exporter define la abstracción de la exportación, los formatos concretos son intercambiables y el ReportService permanece sin cambios.
Ventajas e Inconvenientes
Ventajas
- Menor acoplamiento, mayor cohesión
- Mejor capacidad de prueba, responsabilidades claras
- Fácil extensibilidad, APIs más estables
Inconvenientes
- Esfuerzo inicial de modelado
- Riesgo de sobre-abstracción
- Indirección adicional si el diseño no es adecuado
Preguntas Típicas de Examen (con Respuesta Breve)
-
¿Abstracción vs. Encapsulación? La abstracción define qué aspectos relevantes son visibles, la encapsulación oculta la implementación de esos aspectos detrás de la interfaz.
-
¿Interface vs. Clase Abstracta? Interface para contratos puros y roles múltiples, clase abstracta cuando se comparte lógica base común o estado.
-
¿Apoya el Open Closed Principle? Los contratos permanecen estables, nuevas variantes surgen como nuevas implementaciones, el código existente no necesita modificación.
-
¿Criterios de buena abstracción? Mínima pero completa, nombrada consistentemente, ortogonal, estable ante cambios internos, documentada de forma inequívoca.
-
¿Cómo comprobar la calidad de una abstracción? Métricas: número de métodos por interface, frecuencia de cambios, reutilización, cobertura de pruebas, número de implementaciones.
-
¿Ejemplo de mala abstracción? God Interface con muchos métodos sin relación, viola ISP, dificulta intercambiabilidad y pruebas.
-
¿Papel de los Generics en la abstracción? Abstracción paramétrica, un algoritmo para muchos tipos sin necesidad de casts, seguridad de tipos gracias al compilador.
-
¿Cómo trabajan juntos Polimorfismo y Abstracción? La abstracción define el contrato, el polimorfismo proporciona implementaciones intercambiables, el dispatch dinámico vincula en tiempo de ejecución.
Fuentes Más Importantes
- https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
- https://de.wikipedia.org/wiki/Abstraktion_(Informatik)
- https://martinfowler.com/bliki/RoleInterface.html



