programación orientada a objetos:
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.
La programación orientada a
objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación
que viene a innovar la forma de obtener resultados. Los objetos manipulan los
datos de entrada para la obtención de datos de salida específicos, donde cada
objeto ofrece una funcionalidad especial.
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.
Está basada en varias
técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento
y encapsulamiento.
Su uso se popularizó a
principios de la década de 1990. En la actualidad, existe una gran variedad de
lenguajes de programación que soportan la orientación a objetos.
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.
características:
Existe un acuerdo acerca de
qué características contempla la "orientación a objetos". Las
características siguientes son las más importantes:1
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. El proceso de abstracción permite seleccionar las
características relevantes dentro de un conjunto e identificar comportamientos
comunes para definir nuevos tipos de entidades en el mundo real. La abstracción
es clave en el proceso de análisis y diseño orientado a objetos, ya que
mediante ella podemos llegar a armar un conjunto de clases que permitan modelar
la realidad o el problema que se quiere atacar.
Encapsulamiento
Significa reunir todos los
elementos que pueden considerarse pertenecientes a una misma entidad, al mismo
nivel de abstracción. Esto permite aumentar la cohesión (diseño estructurado)
de los componentes del sistema. Algunos autores confunden este concepto con el
principio de ocultación, principalmente porque se suelen emplear conjuntamente.
Polimorfismo
Comportamientos diferentes,
asociados a objetos distintos, pueden compartir el mismo nombre; al llamarlos
por ese nombre se utilizará el comportamiento correspondiente al objeto que se
esté usando. O, dicho de otro modo, las referencias y las colecciones de
objetos pueden contener objetos de diferentes tipos, y la invocación de un
comportamiento en una referencia producirá el comportamiento correcto para el
tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de
ejecución", esta última característica se llama asignación tardía o
asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en
"tiempo de compilación") de polimorfismo, tales como las plantillas y
la sobrecarga de operadores de C++.
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. Al igual que la encapsulación, los lenguajes soportan la modularidad
de diversas formas.
Principio de ocultación
Cada objeto está aislado del
exterior, es un módulo natural, y cada tipo de objeto expone una
"interfaz" a otros objetos que especifica cómo pueden interactuar con
los objetos de la clase. El aislamiento protege a las propiedades de un objeto
contra su modificación por quien no tenga derecho a acceder a ellas; solamente
los propios métodos internos del objeto pueden acceder a su estado. Esto
asegura que otros objetos no puedan cambiar el estado interno de un objeto de
manera inesperada, eliminando efectos secundarios e interacciones inesperadas.
Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos
internos del objeto de una manera controlada y limitando el grado de
abstracción. La aplicación entera se reduce a un agregado o rompecabezas de
objetos.
Recolección de basura
La recolección de basura
(garba ge collection) es la técnica por la cual el entorno de objetos se encarga
de destruir automáticamente, y por tanto desvincular la memoria asociada, los
objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el
programador no debe preocuparse por la asignación o liberación de memoria, ya
que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie
lo esté usando. En la mayoría de los lenguajes híbridos que se extendieron para
soportar el Paradigma de Programación Orientada a Objetos como C++ u Objecto Pascal, esta característica no existe y la memoria debe des asignarse expresamente.