Command Palette

Search for a command to run...

ES·EN

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.

Puntos clave

  • Interface para contratos puros. Clase abstracta para implementación base compartida. Si dudás, preferí interface — podés extenderla.
  • Una abstracción opera en un nivel conceptual consistente. Mezclar alto y bajo nivel en el mismo método es una señal de alerta.
  • Todas las abstracciones no triviales tienen algún leak. El arte es minimizarlo y documentarlo cuando no podés evitarlo.

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);
}