gravatar

Conceptos básicos de la POO - Parte 1



La programación orientada a objetos se sustenta en los siguientes conceptos:




Estos conceptos no describen totalmente la programación orientada a objetos, sino que son sus conceptos fundamentales. Tampoco son, en su mayoría, exclusivos de la POO ya que ésta deriva de técnicas, conceptos y prácticas ampliamente utilizados con anterioridad a su aparición.

Existen unos cuantos conceptos secundarios que son necesarios para dar soporte a la programación orientada a objetos e incluso algunos de éstos dependen de características particulares de cada lenguaje de programación. Más adelante se abordan estos conceptos secundarios. Pero ahora, sin más preámbulos, abordemos estos conceptos esenciales para lograr una primera visión de lo que significa escribir programas orientados a objetos.


Abstracción

La abstracción es un concepto que tiene importantes implicaciones respecto del análisis y diseño de programas orientados a objetos y de ciertos recursos del lenguaje que dan soporte a este paradigma de programación.

Como concepto general vale recordar que se trata de la habilidad de enfocar la atención en ciertas características pertinentes e ignorar las demás.

A esta altura podrá inferir se trata un concepto bastante amplio que se puede aplicar a la programación orientada a objetos de diversas maneras. Una de ellas es la descrita anteriormente cuando se explicaron los diferentes procesos de abstracción que se aplican durante el análisis y diseño.

Es importante recordar que la programación orientada a objetos implica un nivel más alto de abstracción en comparación con la programación modular y estructurada. Una explicación simplificada de esto surge al considerar que la programación orientada a objetos permite construir programas mediante una representación directa de los conceptos y de la terminología con la que se expresa el problema; por ejemplo, si el problema describe la existencia de libros, escritorios, sillas y personas, entonces el programa constará de esos objetos: libros, escritorios, sillas y personas.

Pero este concepto también se asocia a "mecanismos" de la POO de los cuales el más importante tal vez sea el encapsulamiento (que se explicará en breve).


Objetos e identidad

En un programa orientado a objetos cada objeto generalmente representa una entidad presente en la realidad que se modela u objetos secundarios que aparecen como necesarios para hacer que el programa sea más flexible, comprensible y mantenible o para representar hechos o eventos que ocurren dentro de la computadora durante la ejecución del programa.

A esas "entidades" o "entes" frecuentemente también se las denomina llanamente "objetos" y por ello se hace necesario diferenciar entre los objetos en el espacio del problema (objetos de la realidad) y objetos en el espacio de la solución (objetos computacionales).

Los objetos se identifican unívocamente y es a ello a lo que refiere el concepto de "identidad".

Para crear un objeto computacional resulta necesario utilizar una variable previamente declarada, cuya función es mantener una referencia (un puntero) a ese objeto. Esa variable es el medio que utilizamos habitualmente los programadores para distinguir ese objeto de otros. Así es como el nombre o identificador de dicha variable nos permite individualizar un objeto.

Las variables que se utilizan para apuntar a objetos se denominan "variables de referencia".

Debido a que el contenido de esas variables será siempre una dirección de memoria, se asocia la identidad con la dirección de memoria a partir de la cual se aloja el objeto.

La dirección de memoria de un objeto que se alberga en una variable de referencia se puede observar mediante la sentencia PRINT:

DIM unLibro, otroLibro AS Libro ... 'La siguiente sentencia crea un objeto de tipo Libro unLibro = NEW Libro PRINT unLibro otroLibro = unLibro PRINT otroLibro

La salida mostraría algo como:

(Libro 0x814d4f0)
  (Libro 0x814d4f0)

Pero resulta necesario señalar que esa variable contiene una referencia a un objeto mientras que ese objeto exista o hasta que a esa variable se asigne otra cosa (otra referencia o el valor NULL). De modo que la identidad de un objeto computacional no está definida por una variable de referencia, ya que un objeto podría tener más de una variable que apuntándole o la referencia que contiene podría cambiar. Entonces, lo que define la identidad de un objeto computacional es el hecho de que ocupa un espacio de memoria que no puede ser ocupado por ningún otro.

Pero debido a que ese objeto, que pertenece al espacio de la solución, representa una entidad de la realidad u objeto del espacio del problema, ese objeto real también tiene identidad y por ello el objeto computacional debe reflejar ese hecho de algún modo.

Entonces cabe preguntarse cómo representa el objeto computacional la identidad del objeto real.

Este es el punto a partir del cual a veces surgen confusiones, por ejemplo cuando se dice que la identidad de un objeto está determinada por su estado. En realidad, el estado de un objeto es el conjunto de valores que asumen sus variables de instancia (las que son individuales para cada objeto, en contraposición a las que pueden ser compartidas por todos los objetos de una clase).

De lo que se habla entonces es de la identidad del objeto real, no del objeto computacional. Pero lo que define la identidad de un objeto real generalmente no es todo su estado sino sólo algunos valores específicos: por ejemplo, un objeto "persona" puede tener el siguiente estado "Nombre: Juan Pablo, Apellido: García Muñoz, Documento: 19234567, Domicilio: xxx-xxx, ... ", de estos datos lo que define la identidad de Juan García probablemente sea el número de documento (digo probablemente porque ello depende en gran medida del propósito de la aplicación que se quiere desarrollar).

Entonces, la identidad se refiere al objeto computacional por un lado y al objeto real por otro. Lo que define la identidad del objeto computacional es su referencia (una dirección de memoria) en cambio, lo que define la identidad del objeto real es un conjunto de valores (que pueden ser otros objetos). Cuáles son los elementos que componen ese conjunto dependerá de la naturaleza del objeto y del propósito de la aplicación.

El hecho de que los objetos tengan identidad nos permite realizar una tarea fundamental: compararlos para saber si se trata de un mismo objeto u objetos diferentes.

Para verificar si dos variables contienen referencias a un mismo objeto computacional, todo lo que hay que hacer es comparar si contienen la misma dirección de memoria (referencia). Pero para comparar entidades reales (objetos definidos en el espacio del problema) hay una cuestión adicional que atender: si dos variables de referencia apuntan al mismo objeto computacional sabemos entonces que ambas nos permiten manipular la misma entidad de la realidad representada por el objeto al que ambas apuntan, pero que las referencias sean diferentes no garantiza que sendos objetos computacionales representen entidades diferentes del espacio del problema. Si está pensando que ello sería un error, probablemente estará en lo cierto: por lo general, cada entidad de la realidad debe representarse mediante un único objeto computacional.

Un principio fundamental de la programación orientada a objetos es que cada objeto o entidad que pertenece al espacio del problema y guarda relación con el objetivo de la aplicación, debe estar representado en el modelo computacional. No obstante, en el programa pueden existir objetos que no tienen correspondencia con entidades existentes en el espacio del problema que antes hemos denominado como "objetos secundarios".


Los comentarios están habilitados para que los lectores puedan participar en la corrección del libro, realizar preguntas puntuales o sugerencias. Todo comentario fuera de estos objetivos será eliminado. Por favor, tenga en cuenta lo siguiente:

- Cumpla las normas de etiqueta.

- Realice críticas constructivas.

- No sea redundante.