Nivel 2 · 20 min
Abstracción
La abstracción es el principio de exponer solo los aspectos esenciales de un concepto y ocultar los detalles irrelevantes. En OOP se implementa mediante interfaces y clases abstractas. Permite diseñar por contrato — el cliente depende de qué hace algo, no de cómo lo hace.
Interface vs clase abstracta
Una interface define un contrato puro — qué operaciones tiene un tipo sin ninguna implementación (salvo default methods en Java 8+). Una clase abstracta puede tener implementación parcial, campos de estado y constructores. Regla de selección: si solo definís un contrato (sin estado compartido), usá interface. Si querés compartir implementación común entre subclases relacionadas, usá clase abstracta. En Java moderno, interfaces con default methods a veces reemplazan clases abstractas.
Contratos y Design by Contract
Design by Contract (DbC) — concepto de Bertrand Meyer — establece que un método tiene precondiciones (qué el llamador debe garantizar), postcondiciones (qué el método garantiza al retornar) e invariantes de clase (qué siempre es cierto). En Java se expresan con assert, documentación, o librerías como Google Guava Preconditions. Los contratos hacen explícito el protocolo de uso — quién es responsable de qué.
Niveles de abstracción y leaky abstractions
Una buena abstracción opera en un solo nivel conceptual. Si un método de alto nivel (procesarPedido) contiene detalles de bajo nivel (formatear SQL), la abstracción es inadecuada. Las Leaky Abstractions (ley de Spolsky) son abstracciones que filtran detalles de implementación que deberían estar ocultos — TCP que expone síntomas de pérdida de paquetes, ORMs que requieren conocer el SQL que generan, etc.
Code example
// Contrato claro: interface de repositorio
interface PaymentGateway {
// precondicion: amount > 0
// postcondicion: si retorna, transaccion fue aprobada
// throws: PaymentDeclinedException si rechazada
PaymentConfirmation charge(Money amount, PaymentMethod method);
}