sábado, 20 de noviembre de 2010

Programación Orientada a Objetos. Una nueva forma de pensar.

En esta ocasión conoceremos un nuevo esquema de programación totalmente distinto a lo que conocimos anteriormente, hablamos de la programación orientada a objetos.

Pero ¿que es la Programación Orientada a Objetos?

En este nuevo modelo, cambia totalmente a lo que comúnmente estábamos acostumbrados en la programación imperativa. Por mencionar un ejemplo, algunos lenguajes no orientados a objetos como Pascal, Basic, C entre otros basan su funcionamiento en el concepto de función. La función lo podremos definir como un conjunto de instrucciones que efectúan un resultado,  de este modo los programas desarrollados en dicho paradigma no son mas una serie de llamadas entre el programa principal y el sistema operativo.

En la programación orientada a objetos cambia este esquema, ya que el elemento principal no es una función en si,  si no lo que se conoce como un objeto.

Un objeto es la representación en un programa de un concepto, y este contiene toda la
información necesaria para abstraerlo: datos que describen sus atributos y operaciones
que pueden realizarse sobre los mismos.

De esta forma la Programación Orientada a Objetos es una nueva forma de pensar una manera distinta de resolver los problemas.

Siempre se entienden mejor las cosas cuando nosotros aplicamos un ejemplo a las nuevas cosas que estamos aprendiendo, de este modo el siguiente ejemplo mostrara la forma de pensar de dicho paradigma de programación.

Si nos detenemos un momento a analizar como resolver determinado problema de programacion, al analizar con detalle los elementos o la manera en que lo podemos resolver,  descubrimos que los elementos de ese problema, si lo vemos de una forma algo abstracta podemos ver que forman una “entidad” (o también podríamos llamarlo un individuo u objeto). Estas entidades poseen un conjunto de propiedades o atributos, y un conjunto de métodos mediante los cuales muestran su comportamiento.

Y no sólo eso, también podremos descubrir,  un conjunto de interrelaciones entre las entidades, guiadas por el intercambio de mensajes; las entidades del problema responden a estos mensajes mediante la ejecución de ciertas acciones.

El siguiente ejemplo es algo raro pero sirve muy bien para que se comprendan algunos conceptos de la filosofía de la programación orientada a objetos.

Imaginemos el siguiente escenario:

Es un día viernes como cualquier otro, y yo me encuentro en casa junto a mi hermanita pequeña, de repente a mi hermanita tiene demasiada hambre; como seria mi reacción natural me dirigiría a la cocina a buscar algo de comer.

La situación anterior puede resultar un tanto extraña, pero ahora si la analizamos en términos de objetos podremos descubrir lo siguiente: El objeto “Hermano” ha  recibido un mensaje procedente del objeto “Hermanita”. El objeto ”hermano” responde al mensaje mediante una acción: buscar comida. El objeto “hermanita” no tiene que decirle al objeto “hermano” como resolver el problema, es responsabilidad del objeto “hermano” resolver el problema como considere mas conveniente.Continuemos con el escenario:

El hermano al dirigirse al refrigerador descubre que no hay nada para comer ya que es viernes. Entonces el hermano acude a una cadena de comida rápida, donde es atendido por una señorita la cual pregunta “¿que desea llevar?” a lo que el hermano responde:” una orden de pollo”. Entonces la señorita del restaurante desaparece y al poco tiempo regresa con una orden de pollo en las manos. El hermano paga el importe del producto y se regresa a su casa. En casa  el hermano le proporciona el alimento a su hermanita que luego de un rato comienza a sentirse mejor .

El objeto hermano, sabe que es lo tiene que hacer para resolver el problema, en este caso conseguir alimento. Para esto entra en juego un nuevo objeto, el objeto “señorita” quien responde al mensaje del objeto “hermano” consiguiendo el alimento. Ahora el objeto “señorita” es responsable de la solución del problema. Después el objeto “señorita” emite un mensaje al objeto “hermano” pidiéndole pagar el importe, el objeto “hermano” responde a tal mensaje con la acción de pagar.

Como hemos podido ver, en la historia nos encontramos con varios objetos que se diferencian de los demás por un conjunto de características y propiedades, también por un conjunto de acciones que realizaban en respuesta a unos eventos que se originaban en otros objetos o en el entorno.

También podemos darnos cuenta de que, aunque todos los objetos tienen propiedades
distintas, como el color del cabello, altura, edad, todos tienen un conjunto de atributos en común por ser ejemplos son de una misma entidad llamada “ser humano”. A este conjunto de objetos (en nuestro caso “ser humano”) lo llamaremos clase.

Con el ejemplo anterior espero que se comprenda que los objetos son casos particulares de las clases, y  que las clases no son mas que una ”plantilla” que definen los comportamientos, variables, y métodos comunes a todos los objetos de un mismo tipo.

En este caso vemos que la clase “ser humano” tiene entre sus muchas variables que la componen: el color de ojos, color de piel, estatura, peso, etcétera. Ahora lo importante es mencionar que a partir de una determinada clase, se pueden definir todos los objetos que se quieran especificando valores particulares para cada objeto, definidos anteriormente en las clases. Así  encontrarnos en el objeto “señorita” cuyo color de cabello es castaño, ojos negros, con una estatura 170 cm,  y así atributos específicos para cada objeto derivado esa clase.

Ahora veremos con mas detalle lo que son los objetos y las clases, las formas en que se comunican y varias definiciones de la programacion orientada a objetos.

Un objeto no es más que un conjunto de variables (datos) y métodos (funciones)
relacionados entre sí. Los objetos en programación se usan para modelar objetos o
entidades del mundo real (en el ejemplo anterior el objeto hermano, hermanita, o señorita). 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.

OBJETO

 

Los atributos del objeto (estado) y lo que el objeto puede hacer (comportamiento) están
expresados por las variables y los métodos que componen el objeto respectivamente.
Por ejemplo, un objeto que modelase un auto en el mundo real tendría variables
que indicarían el estado actual de la bicicleta: su velocidad es de 20 km/h, su cadencia
de pedaleo 90 r.p.m. y su marcha actual es la 5ª. Estas variables se conocen
formalmente como variables instancia o variables miembro porque contienen el estado
de un objeto bicicleta particular y, en programación orientada a objetos, un objeto
particular se denomina una instancia.

Además de estas variables, el objeto bicicleta podría tener métodos para frenar, cambiar
la cadencia de pedaleo, y cambiar de marcha (la bicicleta no tendría que tener un
método para cambiar su velocidad pues ésta es función de la cadencia de pedaleo, la
marcha en la que está y de si los frenos están siendo utilizados o no, entre otros muchos
factores). Estos métodos se denominan formalmente métodos instancia o métodos
miembro, ya que cambian el estado de una instancia u objeto bicicleta particular.

El siguiente esquema lo muestra de una manera mas clara.

BICI COMO OBJETO

El diagrama del objeto bicicleta muestra las variables objeto en el núcleo o centro del
objeto y los métodos rodeando el núcleo y protegiéndolo de otros objetos del programa.
Este hecho de empaquetar o proteger las variables miembro con los métodos miembro
se denomina encapsulación. Este dibujo que muestra el núcleo de variables
miembro del objeto protegido por una membrana protectora de métodos o funciones
miembro es la representación ideal de un objeto y es el ideal que los programadores de
Bicicleta modelada como objetos suelen buscar. Sin embargo a menudo, por razones prácticas, es posible que un objeto desee exponer alguna de sus variables miembro, o proteger otras de sus propios métodos o funciones miembro. Por ejemplo, Java permite establecer 4 niveles de protección de las variables y de las funciones miembro para casos como éste. Los niveles de protección determinan qué objetos y clases pueden acceder a qué variables o a qué métodos.

El hecho de encapsular las variables y las funciones miembro
relacionadas proporciona dos importantes beneficios a los programadores de
aplicaciones:

Capacidad de crear módulos: El código fuente de un objeto puede escribirse y
mantenerse independiente del código fuente del resto de los objetos. De esta
forma, un objeto puede pasarse fácilmente de una parte a otra del programa.
Podemos dejar nuestra bicicleta a un amigo, y ésta seguirá funcionando.
Protección de información: Un objeto tendrá una interfaz pública
perfectamente definida que otros objetos podrán usar para comunicarse con él.
De esta forma, los objetos pueden mantener información privada y pueden
cambiar el modo de operar de sus funciones miembros sin que esto afecte a otros
objetos que usen estas funciones miembro. Es decir, no necesitamos entender
cómo funciona el mecanismo de cambio de marcha para hacer uso de él.

Los mensajes.

Un único objeto por sí solo no es muy útil. En general, un objeto aparece
como un componente más de un programa o una aplicación que contiene otros muchos
objetos. Es precisamente haciendo uso de esta interacción como los programadores
consiguen una funcionalidad de mayor orden y modelar comportamientos mucho más
complejos. Una bicicleta (como objeto) guardada en tu casa por sí sola, la bicicleta es incapaz de desarrollar alguna actividad. Tu bicicleta es realmente útil en tanto que otro objeto (tú) interactúa con ella (pedalea).

Los objetos de un programa interactúan y se comunican entre ellos por medio de
mensajes. Cuando un objeto A quiere que otro objeto B ejecute una de sus funciones
miembro (métodos de B), el objeto A manda un mensaje al objeto B.

¿Que es una clase?

en el mundo real existen varios objetos de un mismo tipo, o como
diremos, de una misma clase. Por ejemplo, mi bicicleta es una de las muchas
bicicletas que existen en el mundo. Usando la terminología de la programación
orientada a objetos, diremos que mi bicicleta es una instancia de la clase de objetos
conocida como bicicletas. Todas las bicicletas tienen algunos estados o atributos (color,
marcha actual, cadencia actual, dos ruedas) y algunos métodos (cambiar de marcha,
frenar) en común. Sin embargo, el estado particular de cada bicicleta es independiente
del estado de las demás bicicletas. La particularización de estos atributos puede ser
diferente. Es decir, una bicicleta podrá ser azul, y otra roja, pero ambas tienen en común
el hecho de tener una variable “color”. De este modo podemos definir una plantilla de
variables y métodos para todas las bicicletas. Las plantillas para crear objetos son
denominadas clases.
Una clase es una plantilla que define las variables y los métodos que son comunes para
todos los objetos de un cierto tipo.

La herencia.

Ya que conocemos el concepto de clase y el de objeto, estamos preparados de
introducir otra de las características básicas de la programación orientada a objetos: el
uso de la herencia.
La herencia permite definir nuevas clases partiendo de otras ya
existentes. Las clases que derivan de otras heredan automáticamente todo su
comportamiento, pero además pueden introducir características particulares propias que
las diferencian.

La programación orientada a objetos va más allá, permitiéndonos definir clases a partir
de otras clases ya construidas. Por ejemplo, las bicicletas de montaña, las de carretera y los triciclos son todos, en definitiva, bicicletas. En términos de programación orientada
a objetos, son subclases o clases derivadas de la clase bicicleta. Análogamente, la clase
bicicleta es la clase base o superclase de las bicicletas de montaña, las de carretera y los triciclos.

Una importante característica es que estas subclases no se limitan a los estados y los comportamientos que heredan de su clase base. Muy al contrario, estas subclases
pueden añadir variables y métodos a aquellas que han heredado.Las clases derivadas pueden incluso sobrescribir los métodos heredados y proporcionar implementaciones más especializadas para esos métodos.

La herencia es una herramienta clave para abordar la resolución de un problema de
forma organizada, pues permite definir una relación en una forma jerárquica entre todos los conceptos que se están manejando. Es posible emplear esta técnica para descomponer un problema de cierta magnitud en un conjunto de problemas subordinados a él.

Referencias:

Introducción a la programacion orientada a objetos.-Luis R. Izquierdo-

Programacion Orientada a Objetos con Java, una introducción practica usando BlueJ.-David J. Barnes –Michael K. Editorial PEARSON 3a Edición.

http://es.wikipedia.org/wiki/Herencia_(inform%C3%A1tica)

http://es.wikipedia.org/wiki/Objeto_(programaci%C3%B3n)

http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos

http://es.wikipedia.org/wiki/Clase_(inform%C3%A1tica)

3 comentarios:

  1. Excelente entrada.
    Me hiciste repensar lo que eran los lenguajes de programación orientados a objetos, lo planteaste de una manera tan simple pero a la vez tan completo (o al menos eso creo yo, no se los demás que piensen).
    De nuevo gracias por incluir las referencias, sobre todo buscare ese libro de programación en Java.
    Saludos.

    ResponderEliminar
  2. Gracias compañero ;) la verdad es que si nos ponemos a analizar un poco como trabaja el paradigma orientado a objetos, no son mas que objetos que interactuan entre si, como comente en la entrada, en la programacion orientada a objetos el principal elemento es justamente eso: un objeto, a diferencia de los demas paradigmas en donde otros elementos principales son las funciones,(como el caso de los lenguajes funcionales) por mencionarte un ejemplo.Vemos que si es un interesante esquema de programacion, ya que cambia totalmente la manera de atacar los problemas.

    ResponderEliminar
  3. Muy bien, cuatro puntos extra. Me están dando risa los comentarios ;)

    ResponderEliminar