Diseño de software

Abstracción y encapsulación en OOP: si siempre las confundes, este artículo lo aclara

Al estudiar programación orientada a objetos (OOP), hay un obstáculo inevitable.

4 min de lectura
Imagen de portada de Abstracción y encapsulación en OOP: si siempre las confundes, este artículo lo aclara

¿Sigues confundiendo abstracción y encapsulación? Este artículo te lo deja claro

Al estudiar programación orientada a objetos (OOP), hay un obstáculo inevitable.

Son la abstracción y la encapsulación.

Ambos conceptos pueden parecer casi sinónimos. En una entrevista, si te preguntan «¿Cuál es la diferencia entre abstracción y encapsulación?», es fácil responder de forma vaga.

Empecemos por la conclusión.

La abstracción es una perspectiva de diseño que decide «qué mostrar», mientras que la encapsulación es una perspectiva de implementación que decide «cómo ocultarlo».

Con esta frase ya tienes la mitad resuelta. Fijemos el resto con ejemplos.

¿Qué es la abstracción?

La abstracción oculta la complejidad interna y muestra solo lo esencial.

Piensa en un coche. Al conducir, no necesitamos saber cómo el motor hace explotar el combustible.

Volante, pedales y marchas. Conocer esta interfaz basta para conducir.

En otras palabras, decidir qué exponer al conductor es abstracción.

En código, puede expresarse así.

protocol Coffee {
    func brew()
}

struct Americano: Coffee {
    func brew() {
        print("Preparar un americano")
    }
}

let menu: Coffee = Americano()
menu.brew()
// Salida: Preparar un americano

El código cliente solo conoce la esencia, brew(). Cómo se muelen los granos o a qué temperatura se ajusta el agua queda fuera de su interés.

Eso es la abstracción.


¿Qué es la encapsulación?

La encapsulación agrupa los datos y las funciones que los manejan, e impide el acceso directo desde el exterior.

La clave está en ocultar y proteger.

Piensa en una cuenta bancaria. Sería grave que el exterior pudiera cambiar el saldo libremente.

Por eso el saldo se oculta y solo puede modificarse mediante canales definidos, como depósitos y retiros.

class Account {
    private var balance = 0

    func deposit(_ amount: Int) {
        guard amount > 0 else { return }
        balance += amount
    }

    func getBalance() -> Int {
        return balance
    }
}

let acc = Account()
acc.deposit(1000)
print(acc.getBalance())
// Salida: 1000

Bloqueamos balance mediante private. Desde fuera, el valor solo puede cambiarse a través de la entrada definida, deposit.

Ocultar los detalles internos y controlar el acceso de esta forma es encapsulación.


Entonces, ¿cuál es la diferencia decisiva?

En resumen:

Categoría Abstracción Encapsulación
Objetivo Ocultar la complejidad y exponer solo lo esencial Ocultar y proteger los datos
Perspectiva Perspectiva de diseño (qué) Perspectiva de implementación (cómo)
Pregunta «¿Qué debo mostrar?» «¿Cómo debo ocultarlo?»
Medios Interfaces, clases abstractas Modificadores de acceso (como private)

Señalemos el punto que más confunde.

La confusión surge porque ambos conceptos hablan de ocultar algo.

Pero ocultan cosas distintas.

La abstracción oculta procesos complejos (lógica) para simplificar el uso. La encapsulación, en cambio, oculta los datos (estado) para protegerlos.

Protocolo de café y clase de cuenta: al dibujar su relación, todo queda claro
Protocolo de café y clase de cuenta: al dibujar su relación, todo queda claro

¿Cuándo debes preocuparte por cada una?

En la práctica, se usan juntas; lo que cambia es el foco.

  • Al diseñar la interfaz de una función nueva → céntrate en la abstracción
  • Al proteger la integridad del estado interno de una clase → céntrate en la encapsulación
  • Al decidir qué API exponer a los colaboradores → abstracción
  • Al gestionar valores de forma segura y sin errores → encapsulación
Con solo dejar esta frase junto al código, tu perspectiva cambia
Con solo dejar esta frase junto al código, tu perspectiva cambia

Así lo preguntan en una entrevista

P. Explica la diferencia entre abstracción y encapsulación.

La clave es la diferencia de perspectiva. La abstracción es un concepto de diseño que oculta los detalles innecesarios y muestra solo lo esencial; la encapsulación es un concepto de implementación que oculta los datos y restringe el acceso. También conviene añadir que la abstracción se realiza mediante interfaces y la encapsulación mediante modificadores de acceso.

P. ¿Por qué es necesaria la encapsulación?

Si el exterior cambia directamente el estado de un objeto, la integridad de los datos puede romperse con facilidad. Permitir cambios de estado solo mediante métodos definidos centraliza la lógica de validación y facilita el mantenimiento y la depuración.


Estos conceptos no son opuestos, sino complementarios. Si los ejemplos de hoy te han ayudado, la próxima vez que escribas código pregúntate una vez: «¿Qué estoy mostrando y qué estoy ocultando?». OOP será mucho más claro.

Seguir leyendo