Conceptos Básicos

La Programación Orientada a Objetos (OOP por sus siglas en inglés) es un estilo de programación que se desarrolló como consecuencia de 30 años de práctica y experiencia que se remonta a Simula 67 y que contin˙a con Smalltalk, LISP, CLU y, más recientemente, Actor, Eiffel, Objective C, Java y C++.

Este particular estilo de programación captura el comportamiento del mundo real de tal forma que esconde la manera detallada en la que se desarrolla el programa y permite que el programador pueda abstraer el problema en un nivel más alto, olvidándose de los detalles de bajo nivel sobre el funcionamiento interno de las cosas.

La Programación Orientada a Objetos es una manera de programación basada en un concepto de información centralizada en donde el comportamiento del programa, así como la información y las propiedades manejadas por él, están íntimamente relacionados. La información, el comportamiento y las propiedades del programa son concevidos como clases cuyas instancias forman los objetos. Por ejemplo, un polinomio puede tener un rango de valores válidos y éstos pueden estar afectados por operaciones, tales como suma y multiplicación. Consideremos también el objeto pluma, que tiene la propiedad de ser azul y que realiza la operación de escribir.

La Programación Orientada a Objetos también ve el desarrollo de un programa como un comportamiento simulado; lo que es simulado son los objetos representados por la abstracción del sistema desarrollado.

Objetos

En diferentes lenguajes de programación se pueden definir tipos especiales de datos que se basan en los tipos de datos primitivos del lenguaje en particular; por ejemplo, en C se pueden definir un nuevo tipo de datos por medio de una estructura, la cual se basa o bien en tipos de datos primitivos o en otras estructuras.

Este tipo de definiciones se conocen como ADT (Abstract Data Type) que no son más que tipos de datos nuevos que son una extensión de los tipos de datos primitivos del lenguaje. Los ADT's pueden estar formados de un conjunto de valores y de un conjunto de operaciones que pueden actuar sobre los valores. Por ejemplo, C no tiene un tipo de datos para definir n˙meros complejos, sin embargo, podemos crear un tipo de datos basándonos en una estructura cuyos componentes sean la parte real y la parte imaginaria de los n˙meros complejos.

Antes de profundizar en lo que a la Programación Orientada a Objetos se refiere, consideremos una pregunta importante: ¿Qué es un objeto? La anterior es una pregunta compleja y simple a la vez. Es compleja porque cambiar a una nueva manera de pensar no es una tarea fácil; sin embargo, es fácil porque la mayoría de las personas piensan en términos de objetos.

Por ejemplo, cuando vemos una persona podemos referirnos a ella como si fuera un objeto, y un objeto es definido en dos términos: atributos y comportamientos. Una persona tiene atributos, como color de los ojos, edad, peso, etc.; y también tiene comportamientos como caminar, hablar, respirar, etc. En su definición más básica, podemos decir que un objeto es una entidad que contiene tanto información (atributos) como comportamiento.

Esto es justamente lo que diferencía a la manera tradicional de programar (programación orientada a métodos y funciones) y a la programación orientada a objetos. En la programación orientada a funciones, el código es desarrollado en funciones o procedimientos totalmente diferentes uno del otro. Idealmente, los procedimientos o funciones se convierten en una especie de caja negra, en donde las entradas llegan a las funciones y éstas entregan como resultado una salida. La información (los datos) se pone en diferentes estructuras y es manipulada por dichas funciones o procedimientos.

En otras palabras, podemos decir, en términos filosóficos, que un objeto es una entidad que puede reconocerse. En términos de Tecnología de Objetos, un objeto es una abstracción de un elemento del mundo real. En términos de software, un objeto es una estructura de datos y sus funcionas asociadas a ella, es decir, es una colección de valores y métodos que pueden utilizarse para realizar una operación específica.

La programación orientada a funciones ha estado presente desde hace más de 20 años así que øcuál sería la razón de cambiar de metodología? Primero que nada, en la programación orientada a funciones la información se encuentra separada de los procedimientos o funciones, y, en ocasiones, la información es global, así que es muy fácil modificar la información que está fuera del alcance de dichas funciones. Lo anterior significa que el acceso a la información no es controlado y es impredecible (esto es, muchas funciones pueden tener acceso a las variables globales). Segundo, debido a que no se tiene control de quién accede a la información, las pruebas y el depuramiento es mucho más difícil. Los objetos manejan estos problemas combinando la información y el comportamiento en un paquete completo.

Los objetos son mucho más complicados que los tipos de datos primitivos, como los enteros o las cadenas de caracteres. Aunque los objetos pueden contener entidades como enteros o cadenas de caracteres, que representan a los atributos de dicho objeto, también pueden contener métodos, que representan el comportamiento. En un objeto, utilizamos los métodos para operar con los datos. Es más, podemos también, dentro de un objeto, controlar el acceso a los miembros de éste (ambos, datos y atributos). Esto significa que algunos miembros, como tipos de datos y métodos, pueden ser ocultados a otros objetos.

La Programación Orientada a Objetos incluye una gran variedad de conceptos, entre los que por el momento mencionaremos:

  • Ocultamiento de la información
  • Encapsulamiento de la información

Clases

Ahora llegamos a un nuevo concepto de la Programación Orientada a Objetos: Las clases. A partir de ahora, podemos pensar que una case es una especie de plantilla a partir de la cual un objeto es creado. Cuando un objeto es creado, decimos que es instanciado; así, si creamos tres objetos carro, estamos creando, de hecho, tres instancias totalmente diferentes del objeto Carro. Cada objeto contiene su propia copia de atributos y métodos.

En resumen, para que podamos crear a un objeto necesitamos primero definir todas las características, atributos y demás comportamiento de éste. Lo anterior se realiza a través de una clase. Una clase es una plantilla de un objeto; en ella se definen todos los atributos, variables y demás métodos (comportamiento) que puede realizar el objeto; podemos decir que una clase es una versión de un ADT en la Programación Orientada a Objetos. Tenemos entonces que un objeto es una instancia de una clase, o dicho de otra manera, un objeto es la representación en el mundo real de una clase.

La manera en la que se definen las clases y se crean los objetos en la P.O.O. no difiere mucho con la manera en la que se definen los seres vivos en la naturaleza; es decir, en la naturaleza podemos definir a la clase mamíferos, dentro de la cual tenemos a los roedores y a los gatos. Ambos pertenecen a la misma clase, por lo tanto, comparten ciertas características y a su vez tienen características propias que los distinguen entre sí.