Ir al contenido principal
Bethemesh
HistoriaHistoria de la informáticaPrincipiante

Programación orientada a objetos: objetos, mensajes y abstracciones reutilizables

De Simula y Smalltalk a las clases y prototipos modernos, comprende objetos, mensajes, encapsulación, polimorfismo y límites de la herencia.

Publicado el 10 de agosto de 2026Actualizado el 15 de septiembre de 2026Lectura : 7 minPor Yann Bastien
Programación orientada a objetos representada mediante objetos, mensajes y abstracciones reutilizables
Mostrar el índice
  1. Antes de los objetos
  2. Simula: representar actores
  3. Clase, objeto y otra visión
  4. Smalltalk: todo se convierte en objeto
  5. Estado, identidad y comportamiento
  6. Encapsulación y abstracción
  7. Herencia y polimorfismo
  8. C++ y Objective-C
  9. Los años noventa: la POO se vuelve dominante
  10. Java, C# y la difusión industrial
  11. Python y JavaScript
  12. Composición antes que herencia
  13. Interfaces, SOLID y principios de diseño
  14. Patterns, UML y herramientas
  15. Tests y límites de las abstracciones
  16. Críticas y otros paradigmas
  17. Interfaces gráficas, juegos y sistemas distribuidos
  18. ¿Qué queda realmente de la POO?
  19. ¿Por qué seguir aprendiendo POO?
  20. A recordar
  21. Preguntas frecuentes
  22. ¿Qué es la programación orientada a objetos?
  23. ¿Quién inventó la POO?
  24. ¿Cuál es la diferencia entre clase y objeto?
  25. ¿Cuáles son los principales principios?
  26. ¿Es obligatoria la herencia?
  27. ¿JavaScript es orientado a objetos?
  28. ¿Python es orientado a objetos?
  29. ¿La POO está obsoleta?
  30. ¿Conviene preferir composición a herencia?
  31. ¿Por qué sigue siendo importante?

La programación orientada a objetos (POO) es hoy tan familiar que resulta fácil olvidar su evolución histórica. Clases, objetos, métodos, herencia, interfaces y polimorfismo no aparecieron juntos ni fueron concebidos como una receta universal.

La orientación a objetos nació de una pregunta práctica: ¿cómo representar entidades que poseen estado, comportamiento e interacciones con otras entidades? De Simula a Smalltalk y después C++, Java, Python y JavaScript, la respuesta cambió profundamente.

Antes de los objetos

Los lenguajes de alto nivel de los años cincuenta y sesenta aportaron funciones, procedimientos, estructuras de datos y módulos. A medida que los sistemas crecían, modificar datos manipulados por funciones dispersas se volvía costoso. La simulación proporcionó una de las respuestas más influyentes.

Simula: representar actores

En los años sesenta, Ole-Johan Dahl y Kristen Nygaard desarrollaron lenguajes de simulación. Con Simula 67 introdujeron mecanismos fundamentales: clases, objetos, herencia y métodos virtuales. Una clase describe una categoría; un objeto representa una instancia concreta.

Clase, objeto y otra visión

En el modelo clásico, una clase define estructura y comportamientos comunes y un objeto es una instancia con estado propio. Esta distinción es central en C++, Java y C#, pero no universal: existen sistemas basados en prototipos.

A finales de los sesenta y comienzos de los setenta, Alan Kay desarrolló otra visión, explicada en nuestra biografía de Alan Kay: lo esencial eran objetos autónomos que intercambian mensajes, no las jerarquías de clases.

Smalltalk: todo se convierte en objeto

En Xerox PARC, Alan Kay, Dan Ingalls, Adele Goldberg y otros desarrollaron Smalltalk. Números, colecciones y clases participan en el modelo de objetos y la interacción se centra en mensajes. Su entorno interactivo influyó profundamente en la informática personal y los IDE.

Estado, identidad y comportamiento

Un objeto suele combinar estado, comportamiento e identidad. Dos cuentas pueden tener el mismo saldo sin ser la misma cuenta. Esta identidad es útil en ciertos dominios; en otros, valores inmutables y funciones son más apropiados. La POO no es una obligación universal.

Encapsulación y abstracción

La encapsulación agrupa estado y operaciones y limita el acceso a detalles internos. Su objetivo es reducir dependencias y permitir que una abstracción cambie sin romper a sus usuarios.

La abstracción muestra lo que un componente sabe hacer sin exponer su implementación. La POO no inventó este principio, pero popularizó una forma centrada en entidades que combinan estado y comportamiento.

Herencia y polimorfismo

La herencia permite adquirir y especializar características de otra clase. Puede factorizar código, pero también crea acoplamiento y jerarquías rígidas. Por ello se considera hoy una herramienta entre otras.

El polimorfismo permite trabajar con distintos objetos mediante un comportamiento común. Puede basarse en herencia, interfaces, protocolos, duck typing o mecanismos genéricos. La idea esencial es programar contra un contrato y no contra una implementación concreta.

C++ y Objective-C

A partir de 1979, Bjarne Stroustrup combinó ideas de Simula con la eficiencia de C. El proyecto se convirtió en C++, que difundió masivamente la POO industrial sin abandonar otros paradigmas.

Objective-C, creado por Brad Cox y Tom Love, siguió otra vía: una capa dinámica sobre C inspirada en los mensajes de Smalltalk. Fue importante en NeXT y Apple antes de Swift.

Los años noventa: la POO se vuelve dominante

Durante los años noventa, interfaces gráficas, análisis orientado a objetos, patrones de diseño y UML impulsaron la POO. Llegó a presentarse como una manera general de diseñar cualquier sistema, lo que produjo avances duraderos y algunos excesos.

Java, C# y la difusión industrial

Java apareció en 1995 con clases, recolección de basura e interfaces. Nuestra historia de Java y la biografía de James Gosling detallan esta evolución.

C# adoptó después ideas familiares en .NET y evolucionó con genéricos, lambdas, LINQ, records y pattern matching. Incluso los lenguajes asociados a la POO se volvieron multiparadigma.

Python y JavaScript

Python admite clases y polimorfismo sin imponerlas en todo el código. El duck typing pone el foco en los comportamientos disponibles.

JavaScript, creado por Brendan Eich, se basa históricamente en prototipos. Su sintaxis class moderna sigue apoyándose en ese mecanismo.

Composición antes que herencia

Con la experiencia se difundió la recomendación preferir la composición a la herencia. La composición suele reducir el acoplamiento y facilitar el reemplazo de componentes. No elimina la herencia, pero evita convertir toda reutilización en un árbol de clases.

Interfaces, SOLID y principios de diseño

Las interfaces separan lo que un componente necesita de la implementación concreta. Esta idea sustenta la inyección de dependencias y varios principios SOLID.

SOLID es un conjunto de heurísticas, no leyes. Aplicarlo mecánicamente puede multiplicar clases, interfaces y capas sin beneficio. Una abstracción solo es útil cuando representa una frontera real de responsabilidad o variación.

Patterns, UML y herramientas

En 1994, Design Patterns popularizó patrones como Factory, Observer, Strategy, Decorator y Adapter. Su principal valor es proporcionar vocabulario compartido, no recetas obligatorias.

UML unificó varias técnicas de modelado y sus diagramas de clases se asociaron estrechamente a la POO. Patterns y diagramas ayudan a razonar, pero no sustituyen un diseño adaptado al problema.

Tests y límites de las abstracciones

Encapsulación, interfaces e inyección de dependencias pueden mejorar la testabilidad mediante fakes, stubs o mocks. Pero fragmentar una arquitectura solo para facilitar mocks puede empeorarla. Más abstracciones no significan automáticamente mejor diseño.

Críticas y otros paradigmas

Las limitaciones de la POO se hicieron visibles: jerarquías profundas, estado mutable compartido, objetos muy interconectados y arquitecturas «enterprise» cargadas de capas y factories.

La programación funcional volvió a poner en primer plano funciones puras y datos inmutables. Hoy Java, C#, C++, Python y JavaScript combinan enfoques. La oposición «objetos contra funcional» resulta cada vez menos útil.

Interfaces gráficas, juegos y sistemas distribuidos

GUI y juegos siguen adaptándose bien a entidades con estado e identidad, aunque los motores modernos también usan Entity Component System (ECS) para favorecer composición y datos separados.

En sistemas distribuidos, el modelo actor organiza entidades que reciben mensajes y mantienen estado. No es POO clásica, pero recuerda la importancia que Alan Kay daba a mensajes y aislamiento.

¿Qué queda realmente de la POO?

Tras décadas de experiencia, encapsulación, polimorfismo, composición, identidad y estado siguen siendo ideas duraderas. En cambio, la gran jerarquía de clases ha perdido influencia.

Smalltalk, C++, Java, Python y JavaScript muestran que la POO se entiende mejor como una familia de modelos de programación que como una lista absoluta de requisitos.

¿Por qué seguir aprendiendo POO?

Una enorme cantidad de software y frameworks utiliza clases y objetos. Comprender encapsulación, responsabilidades, contratos y polimorfismo sigue siendo útil. La madurez consiste menos en «hacer objetos en todas partes» que en elegir la representación adecuada para cada problema.

A recordar

La POO nace progresivamente con Simula, se transforma con Smalltalk y Alan Kay, se difunde industrialmente con C++ y se vuelve dominante con Java. Python y JavaScript muestran modelos más dinámicos y multiparadigma.

La experiencia corrigió excesos: la herencia ya no es la respuesta natural a toda reutilización, mientras composición, interfaces, inmutabilidad y funciones ganaron importancia.

La lección duradera no es «todo debe ser una clase», sino agrupar responsabilidades coherentes, ocultar detalles innecesarios y permitir que los componentes colaboren sin depender demasiado de sus implementaciones internas.

Preguntas frecuentes

¿Qué es la programación orientada a objetos?

Es una familia de enfoques que organiza el software alrededor de objetos con estado, identidad y comportamiento que colaboran mediante métodos, mensajes o interfaces.

¿Quién inventó la POO?

No existe un único inventor. Dahl y Nygaard introdujeron mecanismos fundacionales en Simula; Alan Kay y Smalltalk desarrollaron después una visión centrada en mensajes.

¿Cuál es la diferencia entre clase y objeto?

Una clase describe estructura y comportamiento comunes; un objeto es una instancia particular con estado propio. Los sistemas de prototipos funcionan de otra manera.

¿Cuáles son los principales principios?

Encapsulación, abstracción, herencia y polimorfismo; en la práctica moderna también composición, interfaces y gestión de dependencias.

¿Es obligatoria la herencia?

No. Muchos sistemas prefieren composición o interfaces.

¿JavaScript es orientado a objetos?

Sí, pero históricamente mediante prototipos. La sintaxis class moderna sigue apoyándose en ellos.

¿Python es orientado a objetos?

Sí, pero es multiparadigma y no obliga a organizar todo en clases.

¿La POO está obsoleta?

No. Sigue muy utilizada, aunque ya no se considera una solución universal.

¿Conviene preferir composición a herencia?

A menudo sí, porque reduce acoplamiento. La herencia sigue siendo pertinente cuando existe una verdadera relación de especialización.

¿Por qué sigue siendo importante?

Porque encapsulación, responsabilidades, contratos y polimorfismo siguen ayudando a controlar la complejidad en arquitecturas multiparadigma.

¿Te ha resultado útil este artículo?

Fuentes y referencias

Colección

Lenguajes de programación

10 / 26

  1. 01Grace Hopper: de los primeros compiladores a COBOL
  2. 02John Backus: FORTRAN, la notación BNF y el rechazo del código máquina
  3. 03Dennis Ritchie: el lenguaje C en el corazón de Unix
  4. 04FORTRAN: demostrar que un compilador podía competir con el ensamblador
  5. 05El lenguaje C: hacer portables los sistemas sin ocultar la máquina
  6. 06Niklaus Wirth: de Pascal a Oberon, diseñar mediante la simplicidad
  7. 07Bjarne Stroustrup: diseñar C++ sin renunciar al rendimiento
  8. 08Pascal: aprender a programar haciendo visible la estructura
  9. 09C++: de C with Classes al C++ moderno
  10. 10Programación orientada a objetos: objetos, mensajes y abstracciones reutilizables
  11. 11Guido van Rossum: crear Python para que el código sea legible
  12. 12Brendan Eich: JavaScript, del prototipo de Netscape al estándar web
  13. 13James Gosling: el ingeniero que dio origen a Java
  14. 14Python: legibilidad, baterías incluidas y un ecosistema mundial
  15. 15Java: escribir una vez, ejecutar en cualquier lugar
  16. 16JavaScript: el lenguaje que hizo interactiva la Web
  17. 17Ken Thompson: de Unix a Go, la simplicidad como método
  18. 18John McCarthy: Lisp y la idea de programar con símbolos
  19. 19Alan Kay: Smalltalk y el ordenador como medio personal
  20. 20Barbara Liskov: la abstracción que hizo modular el software
  21. 21Robin Milner: ML, la prueba asistida y los lenguajes de la interacción
  22. 22Brian Kernighan: AWK, Unix y el arte de explicar el código
  23. 23Anders Hejlsberg: de Turbo Pascal a C# y TypeScript
  24. 24Larry Wall: Perl, el lenguaje que conectó las herramientas de Internet
  25. 25Yukihiro Matsumoto: Ruby y la felicidad del programador
  26. 26Rasmus Lerdorf: PHP y la democratización de la Web dinámica
BiografíaHistoria de la informáticaPrincipiante

James Gosling: el ingeniero que dio origen a Java

Cómo James Gosling y el equipo Green de Sun diseñaron Java: de Oak y las máquinas virtuales a la portabilidad y el legado del lenguaje.

17 de agosto de 20266 min