viernes, 28 de marzo de 2008

Estado del Arte de la Programación Orientada a Objeto.

Introducción:

La orientación a objeto ha tomado por asalto y en forma legitima al mundo del software. Como medio para la generación de programas, tiene varias ventajas. Fomenta una metodología basada en componentes para el desarrollo de software, de manera que primero se genera un sistema mediante un conjunto de objetos, luego podrá ampliar el sistema agregándole funcionalidad a los componentes que ya había generado o agregándole nuevos componentes, y finalmente podrá volver a utilizar los objetos que generó para el sistema cuando cree uno nuevo, con lo cual reducirá sustancialmente el tiempo de desarrollo de un sistema.

La orientación a objeto es un paradigma (un paradigma que depende de ciertos principios fundamentales). Un paradigma de programación representa un enfoque particular o
filosofía para la construcción del software.

Los conceptos de la programación orientada a objetos tienen origen en
Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Al parecer, en este centro, trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos.

La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de
C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para las cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos.

Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo
Ada, BASIC, Lisp, Pascal, entre otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código.

Los lenguajes orientados a objetos "puros", por otra parte, carecían de las características de las cuales muchos programadores habían venido a depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características imperativas de maneras "seguras". El
Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet, y a la implementación de la máquina virtual de Java en la mayoría de navegadores. PHP en su versión 5 se ha ido modificando y soporta una orientación completa a objetos, cumpliendo todas las características propias de la orientación a objetos.

Es por eso que la Programación Orientada a Objetos (POO u
OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo, encapsulamiento entre otros. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos.
EVOLUCIÓN DE LA PROGRAMACIÓN ORIENTADA A OBJETO.
POO (Programación Orientada a Objetos) es un importante conjunto de técnicas que se pueden utilizar para hacer el desarrollo de programas más eficientes mientras se mejora la facilidad de los programas resultantes. En esencia, Programación Orientada a Objetos es un nuevo medio de enfocar el trabajo de programación. Sin embargo, a fin de comprender lo que es la Programación Orientada a Objetos, es necesario comprender sus raíces. Así pues, comenzaremos por examinar la historia del proceso de programación analizada cómo evolución Programación Orientada a Objetos y deduciendo, en consecuencia, por qué es tan importante este concepto.

Programación Estructurada:
Durante la década de los sesenta, muchos de los grandes esfuerzos para el desarrollo de software encontraron severas dificultades:

Los tiempos del desarrollo de software generalmente se retrasaban.
Los costos rebasaban en gran medida a los presupuestos y
Los productos terminados no eran confiables.

La gente comenzó a darse cuenta de que el desarrollo de software era una actividad mucho más compleja de lo que habían imaginado. Las actividades de investigación en la década de los sesenta dieron como resultado la evolución de la programación mediante procedimientos a la programación estructurada, un método disciplinado para escribir programas que son:

Más claros
Fáciles de probar y corregir y
Más fáciles de modificar que los no estructurados

Estas mejoras de la programación mediante procedimientos condujeron a nuevos conceptos como son: Estructuras de control, funciones y módulos.

El desarrollo del lenguaje de programación estructurado Pascal por Niklaus Wirth, en 1971. Pascal, cuyo nombre se debe al aniversario de los setecientos años del nacimiento del filósofo y matemático Blas Pascal, fue diseñado para la enseñanza de la programación estructurada en ambientes académicos; convirtiéndose en el lenguaje de programación favorito en varias universidades.

Desafortunadamente, el lenguaje carecía de muchas de las características necesarias para poder utilizarse en aplicaciones comerciales, industriales y gubernamentales, de manera que no ha sido muy aceptado fuera de las universidades.

Un concepto importante en campo de la programación Estructurada: Abstracción, ya que la Abstracción se puede definir como la capacidad de examinar algo sin preocuparse de los detalles internos. En un programa estructurado, es suficiente conocer que un procedimiento sea fiable, para que se pueda utilizar sin tener que conocer cómo funciona su interior. Esto se conoce como una Abstracción funcional y es el núcleo de la programación estructurada. Hoy casi todos los lenguajes de programación tienen construcciones que facilitan la programación estructurada.
Programación Lineal.
Los lenguajes de programación lineal (BASIC, COBOL Y FORTRAN) no tenían facilidad para reutilizar el código existente de programas. De hecho se duplicaban segmentos de software cada vez más en muchos programas. Los programas se ejecutaban en secuencias lógicas, haciendo la lógica difícil de comprender. El control de programas era difícil y se producían continuos saltos a lo largo del referido programa. Aún más, los lenguajes lineales no tenían capacidad de controlar la visibilidad de los elementos llamados datos.

Programación no Estructurada.
Comúnmente, las personas empiezan a aprender a programar escribiendo programas pequeños y sencillos consistentes en un solo programa principal. Aquí "programa principal" se refiere a una secuencia de comandos o instrucciones que modifican datos que son a su vez globales en el transcurso de todo el programa. Ilustrándose esto en la figura.

Estas técnicas de programación ofrecen tremendas desventajas una vez que el programa se hace suficientemente grande. Por ejemplo, si la misma secuencia de instrucciones se necesita en diferentes situaciones dentro del programa, la secuencia debe ser repetida. Esto ha conducido a la idea de extraer estas secuencias, darles un nombre y ofrecer una técnica para llamarlas y regresar desde estos procedimientos.

Programación Procedimental.
Con la programación procedimental uno puede combinar las secuencias de instrucciones repetibles en un solo lugar. Una llamada de procedimiento se utiliza para invocar al procedimiento. Después de que la secuencia es procesada, el flujo de control procede exactamente después de la posición donde la llamada fue hecha. Figura .

Programación Modular.
En la programación modular, los procedimientos con una funcionalidad común son agrupados en módulos separados. Un programa por consiguiente, ya no consiste solamente de una sección. Ahora está dividido en varias secciones más pequeñas que interactúan a través de llamadas a procedimientos y que integran el programa en su totalidad. Ver figura.

¿Qué es la programación orientada a objetos (POO)?
La programación orientada a objetos es un método de implementación en que los programas se organizan como colecciones cooperativas de objetos, cada uno de los cuales representa una instancia de alguna clase, y cuyas clases son, todas ellas, miembros de una jerarquía de clases unidas mediante relaciones de herencia.

¿QUÉ ES UN OBJETO?
Un objeto es una entidad lógica que contiene datos y un código especial que indica como manipular los datos. El uso de un objeto impone a veces castigos al momento de la ejecución que en ocasiones pueden degradar seriamente el diseño de un programa.

Los objetos son construcciones de programación que se obtienen a partir de cosas llamadas clases. El programador tiene la responsabilidad absoluta de crear clases propias, pero también puede tener acceso a las clases desarrolladas por otros.

¿QUÉ ES UNA CLASE?
El elemento básico de la programación orientada a objetos en Java es la clase. Una clase define la forma y comportamiento de un objeto.

Una clase es la unidad básica que encapsula toda la información de un Objeto (un objetoes una instancia de una clase).

ABSTRACCIÓN:
La abstracción es uno de los medios más importantes, mediante el cual nos enfrentamos con la complejidad inherente al software. La abstracción es el proceso de simplificar un problema complejo. Al abordar la solución de un problema, uno no se abruma con cada uno de los detalles, mas bien, lo simplifica enfocándose tan sólo en los aspectos relevantes para la solución.

Una abstracción se centra en la vista externa de un objeto, de un modo que sirva para separar el comportamiento esencial de un objeto de su implementación. Definir una abstracción significa describir una entidad del mundo real, no importa lo compleja que pueda ser.


ENCAPSULACIÓN:
La encapsulación o encapsulamiento es la propiedad que permite asegurar que el contenido de la información de un objeto está oculta al mundo exterior: el objeto A no conoce lo que hace el objeto B, y viceversa. La encapsulación (también se conoce como ocultación de la información), en esencia, es el proceso de ocultar todos los objetos de un objeto que no contribuyen a sus características
esenciales.

La encapsulación permite la división de un programa en módulos. Estos módulos se implementan mediante clases, de forma que una clase representa la encapsulación de una abstracción.

MODULARIDAD:
La modularidad es 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 si y de las restantes partes.

La modularización, consiste en dividir un programa en módulos que se puedan compilar por separado, pero que tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la modularidad de diversas formas. Por ejemplo, en C++ los módulos son archivos compilados por separado. La práctica usual es situar los interfaces de los módulos en archivos con nombres con extensión .h (archivos de cabecera) y las implementaciones de los módulos se sitúa en archivos con nombre con extensión .cpp.

La modularidad es la propiedad de un sistema que permite su descomposición en un conjunto de módulos cohesivos y débilmente acoplados

HERENCIA Y JERARQUÍA:
Una de las propiedades más importantes de la programación orientada a objetos es la herencia. De hecho, algunos piensan que un programa que no emplea herencia no es un programa orientado a objetos.

La herencia es aquella propiedad de la programación orientada a objetos que le permite a una clase, llamada clase derivada, compartir la estructura y el comportamiento de otra clase, llamada clase base.
Otra razón para usar herencia es que permite construir una jerarquía entre clases. Las clases que incluyen aquellas cosas que se heredan más comúnmente se encuentran en la parte superior de la jerarquía, justo como sus antepasados están en la parte superior de la jerarquía de su familia genética.

La jerarquía es una propiedad que permite una ordenación de las abstracciones. Las dos jerarquías mas importantes de un sistema complejo son: estructura de clases (jerarquía «es–un» (is–a): generalización/especialización) y una estructura de objetos (jerarquía «parte–de» (part– of): agregación).

POLIMORFISMO:
La quinta propiedad significativa de los lenguajes de programación orientados a objetos es el polimorfismo. Característica fundamental de la POO, que no es otra cosa que la posibilidad de construir varios métodos con el mismo nombre, pero con relación a la clase a la que pertenece cada uno, con comportamientos diferentes. Esta propiedad no suele ser considerada como fundamental en los diferentes modelos de los objetos propuestos, pero, dada su importancia, no tiene sentido considerar un objeto modelo que no soporte esta propiedad.

Polimorfismo es la propiedad que indica, literalmente, la posibilidad de que una entidad tome muchas formas. En términos prácticos, el polimorfismo permite a objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma operación de diferentes formas, según sea el objeto que se referencia en ese momento.

ENVÍO DE MENSAJES:
Se menciono que en un sistema los objetos trabajan en conjunto. Esto se lora mediante el envío de mensajes entre ellos. Un objeto envía un mensaje para realizar una operación, y el objeto ejecutará la operación.

Una televisión y su control remoto puede ser un ejemplo muy intuitivo del mundo que nos rodea. Cuando desea ver un programa de televisión, busca el control remoto, se sienta en su silla favorita y presiona el botón de encendido. ¿Qué ocurre? El control remoto le envía, literalmente, un mensaje al televisor para que se encienda. El televisor recibe el mensaje, lo identifica como una petición para encenderse y así lo hace. Cuando desea ver otro canal, presiona el botón correspondiente del control remoto, mismo que envía otro mensaje a la televisión (cambiar de canal). El control remoto también puede comunicar otros mensajes como ajustar el volumen, silenciar y activar los subtítulos.

Volvamos a las interfaces. Muchas de las cosas que hace mediante el control remoto, también las podrá hacer si se levanta de la silla, va a la televisión y presiona los botones correspondientes. La interfaz que la televisión le presenta (el conjunto de botones y perillas) no es, obviamente, la misma que le muestra al control remoto (un receptor de rayos infrarrojos).

ASOCIACIONES:
Los objetos se relación entre sí de alguna forma. Por ejemplo, cuando enciende su televisor, en términos de orientación a objetos, usted se asocia con su televisor.

AGREGACIÓN:
Vea su computadora: cuenta con un gabinete, un teclado, un ratón, un monitor, una unidad de CD-ROM, uno o varios discos duros, un módem, una unidad de disquete, una impresora y, posiblemente, bocinas. Dentro del gabinete, junto con las citadas unidades de disco, tiene una CPU, una tarjeta de vídeo, una de sonido y otros elementos sin los que, sin duda, difícilmente podría vivir. Por lo que s
u computadora es una agregación o adición.