Es una forma de construir, pensar, diseñar e implementar programas basados en objetos que combinan estados, comportamientos e identidades. El estado está compuesto por datos, el comportamiento es una serie de acciones que se realizan y son llamados métodos y le identidad es una identidad del objeto que lo diferencia del resto de los objetos.

Las tareas que se realizan con estos objetos, basados en su colaboración y relación entre ellos. El objetivo de esto es mantener diversas partes del código separado entre sí, llegando de esta forma a tener una unidad de código fácil de mantener y de reutilizar en otros proyectos. La comunicación entre los diversos objetos se realiza mediante mensajes entre ellos. Estos mensajes son llevado acabo mediante el llamado métodos de una cierto objeto.

El paradigma orientado a objetos fue inventado por Kristen Nygaard y Ole-Johan Dahl en los años 60, creando el lenguaje Simula, concibiendo a un objeto como una componente autocontenida (con una estructura de datos asociada, y unos procedimientos propios, o métodos) en un sistema. Estas componentes se combinan para crear un sistema completo.

Los coneptos clave dentro del paradigma es el de un objeto, generado de forma dinámico en tiempo de ejecución. Cada objeto debe tener un padre, y todos parten de una raíz única, el objeto padre de todo lo que existe en un lenguaje. Pero para darnos una mejor idea, veamos los puntos que establece Alan Kay, creador de Smalltalk, el verdadero lenguaje orientado a objetos.

 

La POO está basada en el principio de diseño recursivo:

  1. Todo son objetos.
  2. Los objetos funcionan haciéndose peticiones de uno a otro mediante paso de mensajes.
  3. Cada objeto tiene su propia memoria, que consta de otros objetos.
  4. Cada objeto es un ejemplar (instancia) de una clase. Una clase agrupa objetos similares.
  5. La clase es el repositorio del comportamiento asociado con un objeto.
  6. Las clases están organizadas en una estructura arbórea que se denomina jerarquía de herencia.

El concepto dinámico, mediante el cual se desarrolla este paradigma, es claro. Un objeto puede interactuar con otro objeto de forma dinámica sin que así se planeara, en tiempo de ejecución, únicamente comunicándose a través de mensajes, que pueden tener una respuesta requerida o reusarse a dar la respuesta deseada. De esta forma no tenemos como obligatorio tener un cierto tipo de objetos generados de ciertas clases.

Cada objeto tiene una responsabilidad, y el resultado es el producto de la colaboración de todos los objetos en la solución del problema. Las acciones en Programación Orientada a Objetos se producen como respuesta a las peticiones de acciones, que se llaman mensajes. Un objeto puede aceptar un mensaje y como respuesta realizará una acción y devolverá un valor. Obsérvese que como usuario de un servicio que proporciona un objeto lo único que se necesita saber es el nombre de los mensajes que aceptará el objeto. No hace falta tener ninguna idea sobre cómo se realizarán las acciones en respuesta a la petición. Una vez aceptado un mensaje, un objeto es responsable de llevarlo a cabo.

Habría que resaltar que los mensajes son diferentes de las llamadas a función tradicionales en dos aspectos importantes: en un mensaje hay designado un receptor que acepta el mensaje y la interpretación del mensaje puede ser diferente, dependiendo del receptor. Aunque varios objetos diferentes puedan aceptar el mismo mensaje, las acciones (comportamiento) que realizará el objeto podrán ser diferentes. La determinación de qué comportamiento realizará el objeto se toma en tiempo de ejecución (vinculación tardía, o late binding). El hecho de que el mismo nombre pueda significar dos operaciones completamente diferentes es una forma de polimorfismo.

Si vemos lo importante que es el concepto de unidad del objeto entenderemos que cada objeto es como un computador en miniatura, un procesador especializado en realizar una tarea específica. Pero el comportamiento está asociado con las clases, no con instancias individuales. Todos los objetos que son instancias de una clase utilizan el mismo método en respuesta a mensajes similares. En cada nivel de abstracción podemos registrar cierta información. Esa información será aplicable a todos los niveles inferiores, más especializados y esta información (datos y comportamiento) que le asociamos a un nivel de abstracción en la jerarquía de clases es automáticamente aplicable a los niveles inferiores de la jerarquía. Las subclases pueden alterar o sobrescribir información heredada de las clases padre.

En resumen la visión de la computación en Programación Orientada a Objetos es similar a crear un universo de objetos computacionales interactuando entre sí. Es una simulación del mundo real.

Si vemos y comparamos esto con los lenguajes que se dicen ser orientados a objetos veremos que en realidad sólo se cumplen unos cuantos de los principios, pero no los fundamentales. Lenguajes tradicionales, conocidos comúnmente bajo OO como C++ y Java en realidad son una especie de lenguajes orientados a clases, donde es más importante la clase y su interacción estática que el comportamiento entre los objetos de manera dinámica. Los lenguajes más cercanos al paradigma son Ojective-C y por supuesto Smalltalk.

Conceptos

Clase: Es una definición de un objeto. Es un contenedor de uno o más datos, junto con las propiedades que lo manipulan llamados métodos o funciones. Podemos decir que una clase es el modelo que generará en tiempo real el programa en forma de objeto. Como este modelo o base, que describe las propiedades es un conjunto de variables y métodos que pueden ser utilizadas como objetos en cualquier punto del programa, las clases son la base del diseño orientado a objetos.

Objeto: Es una unidad compacta, que se encuentra en tiempo de ejecución y realiza las tareas propias de un programa. Los objetos en programación se usan para modelar objetos o entidades del mundo real (el objeto hijo, madre, o farmacéutica, por ejemplo). Un objeto es, por tanto, la representación en un programa de un concepto, y contiene toda la información necesaria para abstraerlo: datos que describen sus atributos y operaciones que pueden realizarse sobre los mismos. La siguiente figura muestra una representación visual de un objeto.

Herencia: Es posible utilizar clases ya definidas, con interfaces e implementaciones específicas o métodos virtuales, pero ampliarlas.

Polimorfismo: Se refiere a la posibilidad de definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta. Existen dos tipos de polimorfismos, el dinámico que es aquél en el que el código no incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible y el estático que es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explicitados y declarados uno por uno antes de poder ser utilizados.

Lenguajes de programación orientados a objetos

ABAP Objects

1980

SAP AG

C++

1983

Bjarne Stroustrup

C#

2001

Microsoft

Java

1995

James Gosling y Sun Mycrosystems

Objective-C

1986

Tom Love y Brad Cox

Python

1991

Guido van Rossum

VisualBasic .Net

2001

Microsoft

Eiffel

1986

Bertrand Meyer

PHP

1995

Rasmus Lerdorf

Perl

1987

Larry Wall

Ruby

1995

Yukihiro Matsumoto

Windows Power Shell

2006

Microsoft

Ocaml

1996

Xavier Leroy, Jérôme Vouillon, Damien Doligez, Didier Rémy

F#

2002

Microsoft

Fortran 2003

 

 

Smalltalk

1970

Alan Kay, Dan Ingalls, Adele Goldenberg.

COBOL 2002

1959 hasta al 1997 orientado a objetos

Diseñadores de las primeras implementaciones orientadas a objetos: Micro Focus, Fujitsu, and IBM

Oberon

1986

Niklaus Wirth

Modula-2

1978

Niklaus Wirth

CLU

1974

Barbara Kiskov y sus estudiantes

Groovy

2003

JCP

Lua

1993

Roberto Ierusalimschy, Waldemar Celes, Luiz Henrique de Figueiredo

ActionScript

1998

Gary Grossman

D

1999

Walter Bright

Referencia

 

  1. Dr. Alan Kay  on the Meaning of “Object-Oriented Programming”, Dr. Alan Kay. http://www.purl.org/stefan_ram/pub/doc_kay_oop_en

  2. How Object-Oriented Programming Started. http://heim.ifi.uio.no/~kristen/FORSKNINGSDOK_MAPPE/F_OO_start.html

  3. http://en.wikipedia.org/wiki/Object-oriented_programming

  4. De T. Budd, Introducción a la Programación Orientada a Objetos

  5. Wikipedia