Translate

domingo, 16 de agosto de 2026

¿Y si la abstracción fuera el verdadero hilo conductor de la Orientación a Objetos?


Cuando aprendemos Orientación a Objetos, normalmente aparecen los famosos cuatro pilares:

  • Encapsulamiento
  • Abstracción
  • Herencia
  • Polimorfismo

Pero hay una pregunta interesante: ¿Qué entendemos realmente por abstracción?

Si entendemos la abstracción como un proceso de generalización, aparece una relación mucho más profunda entre varios de estos conceptos.


Imaginemos un conjunto de objetos:


🐕 Dog

🐕 Dog

🐈 Cat

🐈 Cat

🐎 Horse


Observamos características y comportamientos comunes y realizamos una generalización:

Dog ─┐

Dog ─┤

Cat ─┼──► Animal

Cat ─┤

Horse┘


Estamos clasificando y abstrayendo.

Identificamos qué tienen en común distintos objetos y construimos una representación general.

En un modelo basado en clases, esa abstracción puede representarse mediante una clase:


abstract class Animal {

    abstract void makeSound();

}


Esto puede verse como un proceso de clasificación:

> objetos concretos → categoría común → clase.


Pero podemos volver a generalizar.

Tenemos:

Dog

Cat

Horse

   ↓

Animal


y podemos observar que Animal comparte propiedades con otras entidades:


Animal

Plant

   ↓

LivingBeing


Otra vez estamos abstrayendo.

Por lo tanto, la abstracción no necesariamente ocurre una sola vez. Podemos construir niveles sucesivos de generalización:


objetos

   ↓

clases

   ↓

superclases

   ↓

abstracciones más generales


La herencia puede verse como el mecanismo que representa una relación de generalización/especialización:


          Animal

         /      \

       Dog      Cat


Animal representa una abstracción más general.

Dog y Cat son especializaciones de esa abstracción.


Por eso podemos pensar: La abstracción permite identificar lo general; la herencia permite expresar estructuralmente esa generalización en el modelo.


No son lo mismo, pero están profundamente relacionadas.

El polimorfismo aparece cuando podemos utilizar esas especializaciones a través de la abstracción común:


List<Animal> animals = ...;


for (Animal animal : animals) {

    animal.makeSound();

}


No necesitamos saber si estamos tratando con un Dog, un Cat o un Horse.

Trabajamos contra la abstracción Animal.

Entonces podemos visualizarlo así:


                                 ABSTRACCIÓN

                                             │

              ┌──────────┴──────────┐

              │                                                            │

        CLASIFICACIÓN                      GENERALIZACIÓN

              │                                                          │

        objetos → clases                        clase → superclase

                                              │

                                       HERENCIA

                                              │

                                  POLIMORFISMO


Entonces, ¿son realmente cuatro pilares independientes?

Quizás no.


Si entendemos abstracción como generalización, entonces la abstracción participa en dos procesos fundamentales del modelado orientado a objetos:

Clasificación: objetos → clase


y generalización


clase → superclase


La herencia es una forma de representar esta última relación, mientras que el polimorfismo permite utilizar diferentes especializaciones mediante una abstracción común.


Esto también nos obliga a revisar una definición muy común: “Abstracción es ocultar los detalles de implementación.”


Eso describe una consecuencia o una técnica de abstracción, pero quizás no su esencia.


Una definición más profunda podría ser: Abstraer es identificar aquello que permanece común entre diferentes casos y construir una representación general que nos permita razonar sobre ellos.

Y desde esa perspectiva, la abstracción no es simplemente uno de los cuatro pilares de OOP: es uno de los procesos fundamentales mediante los cuales construimos el modelo orientado a objetos.

Es decir, la abstracción se utiliza para generalizar un conjunto de objetos en una clase (tomando el comportamiento y atributos comunes) y utilizamos la misma técnica para generalizar un conjunto de clases en clases más generales que nos permitan reutilizar código.  

Y si tomamos esta filosofía, lenguajes como Go o Rust son orientados a objetos, por más que no tengan herencia de forma común (como Java o C#) tienen un mecanismo de abstracción con interfaces. 

Qué opinan?



No hay comentarios.:

Publicar un comentario