La programación
orientada a objetos (POO, u OOP según sus siglas en inglés) es
un paradigma de programación que utiliza objetos para crear programas
informáticos. La programación Orientada a objetos (POO) es una forma especial
de programar, más cercana a como expresaríamos las cosas en la vida real que
otros tipos de programación.
Con la POO tenemos que
aprender a pensar las cosas de una manera distinta, para escribir nuestros
programas en términos de objetos, propiedades, métodos y otras cosas que
veremos rápidamente para aclarar conceptos y dar una pequeña base que permita
soltarnos un poco con este tipo de programación.
Muchos de los objetos
pre-diseñados de los lenguajes de programación actuales permiten la
agrupación en bibliotecas o librerías, sin embargo, muchos de estos lenguajes
permiten al usuario la creación de sus propias bibliotecas.
Historia
de la programación orientada a objetos
Los conceptos de clase
y herencia fueron implementados por vez primera en el lenguaje Simula 67, este
fue diseñado en 1967 por Ole-Johan Dhal y Krysten Nygaard en la Universidad de
Oslo y el Centro de Computación Noruego.
Aunque Simula fue el
padre de los primeros conceptos de programación orientada a objetos, ha sido
Smalltalk quién dio el paso definitivo y es éste el que debemos considerar como
el primer lenguaje de programación orientado a objetos. Smalltalk fue diseñado en
el Palo Alto Research Center (PARC) de Xerox Corporation's, en California. En
el centro de investigación de Palo Alto, a comienzos de los 70, el proyecto iniciado
por Alan Kay vio la luz con el nombre de Smalltalk.
El último gran paso lo
dio Bjarne Stroustrup con la creación del C++, quizás el lenguaje de
programación orientado a objetos más usado actualmente. Este, fue definido en
1986 por su autor en un libro llamado The C++ Programming Language, de cita y
referencia obligadas cuando se habla de OOP. Tan importante es esta
publicación, que cuando se habla de C++, a este libro se le llama "El
Libro". La importancia del C++
radica, en que, abandonando ciertos requerimientos de los lenguajes de cuarta
generación con tecnología OOP como son Smalltalk o Actor, ha conseguido darle
una gran potencia y flexibilidad al más famoso lenguaje, el C.
Hoy en día, casi todos
los lenguajes más usados en los 80 se han reconvertido en mayor o menor medida
a la OOP, y han aparecido otros nuevos. Veámoslos rápidamente: C ha pasado a
llamarse C++. Es la mejor implementación OOP sobre un lenguaje compilado
existente en este momento. Su punto más conflictivo no obstante no su total
implementación OOP, sino el hecho de permitir herencia múltiple, lo que, según
los teóricos, no es muy aconsejable.
Java es la estrella de
los últimos años: es pura OOP, impecablemente concebido e implementado por Sun,
y al que sólo se le puede achacar (si es que nos ponemos quisquillosos) que no
dispone de sobrecarga de operadores, cualidad que de los citados aquí sólo
dispone C++.
Conceptos
básicos de la programación orientada a objetos
Estudiaremos los
conceptos de Clase, Objeto, Atributo, Estado, Método, Constructor, Destructor,
Mensaje y Acceso. Estas son las ideas
más básicas que todo aquel que trabaja en OOP debe comprender y manejar
constantemente; es por lo tanto de suma importancia que los entienda
claramente.
Clase:
Una
clase, es simplemente una abstracción que hacemos de nuestra experiencia
sensible. El ser humano tiende a agrupar seres o cosas -objetos- con
características similares en grupos –clases. Cada clase posee unas cualidades
que la diferencian de las otras. Así, por ejemplo, los vegetales se diferencian
de los minerales -entre otras muchas cosas- en que los primeros son seres vivos
y los minerales no. En OOP existe otro concepto muy importante asociado al de
clase, el de "clase abstracta". Una clase abstracta es aquella que
construimos para derivar de ella otras clases, pero de la que no se puede
instanciar.
Objeto:
En POO, un objeto es un conjunto de datos y métodos. Los datos son lo que antes
hemos llamado características o atributos, los métodos son los comportamientos
que pueden realizar. Lo importante de un sistema OOP es que ambos, datos y
métodos están tan intrínsecamente ligados, que forman una misma unidad
conceptual y operacional. En OOP, no se pueden desligar los datos de los
métodos de un objeto. Así es como ocurre en el mundo real. También podemos
decir que un objeto es una instancia de una clase, que es lo mismo a decir que
es un caso particular de una clase.
Atributo:
Es el conjunto de características, cualidades y propiedades que posee un
objeto. Contenedor de un tipo de datos asociados a un objeto, que hace los
datos visibles desde fuera del objeto y esto se define como sus características
predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún
método. En un lenguaje de programación, los atributos se representan con
variables.
Estado:
Es estado es el valor que puede tener el atributo de un objeto.
Método:
Los métodos son los comportamientos que poseen los objetos. Es un algoritmo
asociado a un objeto, cuya ejecución se desencadena tras la recepción de un
"mensaje". Desde el punto de vista del comportamiento, es lo que el
objeto puede hacer. Un método puede producir un cambio en las propiedades del
objeto, o la generación de un "evento" con un nuevo mensaje para otro
objeto del sistema. En un lenguaje de programación, los métodos se representan
con funciones o procedimientos.
Mensaje:
Es una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus
métodos con ciertos parámetros asociados al evento que lo generó.
Constructor:
Un constructor es una función especial que es miembro de esa clase y que tiene
el mismo nombre de la clase. La función de construcción de un objeto se invoca
cuando se crea el objeto. Esto significa que se invoca cuando se ejecuta la
declaración del objeto. Además, para los objetos locales, el constructor se
invoca cada vez que se llega a la declaración del objeto. Como lo dice el
nombre, un constructor es una función que se utiliza para construir un objeto
de una clase dada. Un constructor tiene el nombre de la clase a la que
pertenece.
Destructor: Los
destructores entran en la misma categoría que los constructores. Se utilizan
para realizar ciertas operaciones que son necesarias cuando ya no se utiliza un
objeto como es la liberación de memoria. El destructor se utiliza para cerrar
el dispositivo gráfico y rechazar cualquier espacio de memoria asignado al
objeto.
Acceso:
Los modificadores de acceso indican la visibilidad que una variable o un método
tiene. Tanto los distintos tipos posibles, como la palabra reservada para
denotarlos dependen, como es lógico, de cada lenguaje. De todos modos, todos
los lenguajes OOP incluyen al menos los tres siguientes: Públicos: Son visibles
dentro y fuera de la clase sin restricción alguna; Protegidos Estos miembros de
la clase son visibles desde dentro de la clase y desde cualquier otra clase
heredada, es decir, clases hijas; Privados Lo miembros privados son solo
accesibles desde dentro de la clase donde existen.
Características
de la programación orientada a objetos
La programación
orientada a objetos posee un conjunto de características, que lo hacen ser un
paradigma de programación único. Estas características son las siguientes:
Herencia:
La herencia es la capacidad que posee un objeto de adquirir las propiedades y
comportamientos de otro objeto. La herencia permite reutilizar todo el código
escrito para las superclases re-escribiendo solo aquellas diferencias que
existan entre éstas y las subclases. Esto quiere decir que en la herencia una
clase hija hereda los atributos y métodos de su clase padre. A la clase hija se
le llama subclase o clase heredada, mientras que a la clase padre se le llama
clase base, superclase o clase de la que se hereda. Al heredar, la clase
heredada toma directamente el comportamiento de su superclase, pero puesto que
ésta puede derivar de otra, y esta de otra, etc., una clase toma indirectamente
el comportamiento de todas las clases de la rama del árbol de la jerarquía de
clases a la que pertenece. Se heredan los datos y los métodos, por lo tanto, ambos
pueden ser redefinidos en las clases hijas, aunque lo más común es redefinir
métodos y no datos.
Encapsulación:
Un objeto es como una caja negra, a la que se le envía un mensaje y éste
responde ejecutando el método apropiado, el cual producirá las acciones
deseadas. Un objeto, una vez programado es solo manipulable a través de
mensajes. A este intrínseco vínculo entre datos y métodos y al modo de acceder
y modificar sus datos es a lo que llamamos Encapsulación. Gracias a la
encapsulación, una clase, cuando ha sido programada y probada hasta comprobar
que no tiene fallos, podemos usarla sin miedo a que al programar otros objetos
estos puedan interferir con los primeros produciendo efectos colaterales
indeseables que arruinen nuestro trabajo.
Polimorfismo:
Por polimorfismo entendemos aquella cualidad que poseen los objetos para
responder de distinto modo ante el mismo mensaje. Pongamos por ejemplo las
clases hombre, vaca y perro, si a todos les damos la orden -enviamos el
mensaje- Come, cada uno de ellos sabe cómo hacerlo y realizará este
comportamiento a su modo. Realmente, y para ser exactos, los mensaje no se
envían a las clases, sino a todos o algunos de los objetos instanciados de las
clases. El polimorfismo nos facilita el trabajo, ya que gracias a él, el número
de nombres de métodos que tenemos que recordar disminuye ostensiblemente. En el
polimorfismo entra la sobrecarga, que es la creación de varios métodos que
poseen el mismo nombre, pero que difieren en los parámetros que reciben.
Abstracción:
Denota las características esenciales de un objeto, donde se capturan sus
comportamientos. Cada objeto en el sistema sirve como modelo de un
"agente" abstracto que puede realizar trabajo, informar y cambiar su
estado, y "comunicarse" con otros objetos en el sistema sin revelar
"cómo" se implementan estas características. Los procesos, las
funciones o los métodos pueden también ser abstraídos, y, cuando lo están, una
variedad de técnicas son requeridas para ampliar una abstracción.
Modularidad:
Se denomina "modularidad" a la propiedad que permite subdividir una
aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales
debe ser tan independiente como sea posible de la aplicación en sí y de las
restantes partes. Estos módulos se pueden compilar por separado, pero tienen
conexiones con otros módulos.
Conclusión
La POO es un paradigma
surgido en los años 1970, que utiliza objetos como elementos fundamentales
en la construcción de la solución. Un objeto es una abstracción de algún hecho
o ente del mundo real, con atributos que representan sus características o
propiedades, y métodos que emulan su comportamiento o actividad. Todas las
propiedades y métodos comunes a los objetos se encapsulan o agrupan en clases.
Una clase es una plantilla, un prototipo para crear objetos; en general, se
dice que cada objeto es una instancia o ejemplar de una clase.