jueves, 25 de septiembre de 2008



LENGUAJES DE PROGRAMACION
ORIENTADOS A OBJETOS



1. Historia y evolución
2. Clasificación de el Lenguaje de POO
3. Características de los Lenguajes de POO
4. Ventajas y Desventajas de los Lenguajes de POO
5. Revisión general de algunos LPOO representativos
6 Conclusiones.
7.- Referencias Bibliográficas




1.- HISTORIA Y EVOLUCION

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.



Evolucion de los lenguajes de programación orientados a objetos:




2.-CLASIFICACIÓN DE LOS LENGUAJES DE POO


Existen varias clasificaciones de los LPOO, atendiendo a criterios de construcción o características específicas de los mismos

• Clasificación de Peter Wegner
• Clasificación de Tesler
• Clasificación según el origen



2.1.- Clasificación de Peter Wegner:

• Lenguajes Basados en Objetos: Soportan objetos. Es decir, disponen de
componentes caracterizados por un conjunto de operaciones
(comportamiento) y un estado.
• Lenguajes Basados en Clases: Disponen, además de objetos, de componentes
tipo clase con operaciones y estado común.
• Lenguajes Orientados al Objeto: Además de objetos y clases ofrecen
mecanismos de herencia.





2.2.- Clasificación de Tesler :


Un sistema de tipos son las reglas que establecen la utilización de los tipos su corrección en un lenguaje de modelado o realización


• Beneficios del uso de lenguajes con tipos estrictos
– Evitan los fallos en tiempo de ejecución derivados de conflictos con los tipos
– Detección temprana en tiempo de compilación de errores
– Declaración de tipos como ayuda para la documentación
– Eficiencia en el código

Sistemas de tipos estáticos
• También llamados sistemas con tipado fuerte o estricto
• Exigen asociación explícita de un tipo a cada nombre declarado
• El tipo de cada objeto se ha de determinar con anterioridad a la ejecución del programa
• Menos flexible pero más segura
• Ejecución más eficiente al no tener que hacer comprobación de tipos en tiempo de
ejecución


Sistemas de tipos dinámicos
• También llamados sistemas con tipado débil,no estricto o dinámico
• No exigen asociación explícita de un tipo a cada variable
• Cada objeto conoce su tipo cuando se crea durante la ejecución
• Más flexibilidad
• Pérdida de eficiencia durante la ejecución del programa, debida a la necesidad de mantener
y comprobar el tipo de todos los objetos durante la ejecución





Ligadura estática o temprana
– Resuelve las correspondencias en tiempo de compilación
– No hay sobrecarga en tiempo de ejecución y los fallos se detectan en tiempo
de compilación
– Los enlaces no pueden hacerse sin volver a compilar

Ligadura dinámica o tardía
– La correspondencia se hace al invocar los métodos
– Soporta la evolución de los programas sin tener que recompilar
– Coste en tiempo de ejecución




2.3.- Clasificación según su Origen :







3.- CARACTERISTICAS DE LOS LENGUAJES DE PROGRAMACIÓN
ORIENTADOS A OBJETOS



Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes.


Abstracción: 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.


Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.


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 pueden cambiar el estado interno de un objeto de maneras inesperadas, 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.

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++.

Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple.

Elementos Concretos:

Ø Objetos
Ø Clases
Ø Herencia simple
Ø Herencia múltiple
Ø Comprobación estricta de tipos frente a comprobación débil
Ø Encapsulamiento
Ø Empaquetamiento
Ø Genericidad
Ø Paso de mensajes
Ø Polimorfismo
Ø Excepciones
Ø Concurrencia
Ø Persistencia
Ø Metadatos
Ø Afirmaciones y restricciones
Ø Bibliotecas de clases
Ø Eficiencia
Ø Administración de memoria
Ø Entorno de desarrollo

4.-VENTAJAS Y DESVENTAJAS DE LOS LENGUAJES DE POO


¿Cuáles son las ventajas de un lenguaje orientado a objetos?
· Fomenta la reutilización y extensión del código.
· Permite crear sistemas más complejos.
· Relacionar el sistema al mundo real.
· Facilita la creación de programas visuales.
· Construcción de prototipos
· Agiliza el desarrollo de software
· Facilita el trabajo en equipo
· Facilita el mantenimiento del software
Lo interesante de la POO es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible.Flexibilidad: Si partimos del hecho que mediante la definición de clases establecemos módulos independientes, a partir de los cuales podemos definir nuevas clases, entonces podemos pensar en estos módulos como bloques con los cuales podemos construir diferentes programas.Reusabilidad: Una vez que hemos definido a la entidad persona para utilizarla en una aplicación de negocios, por mencionar un ejemplo, y deseamos construir a continuación una aplicación, digamos de deportes, en donde requerimos definir a la misma entidad persona, no es deseable volver a escribir la definición para la entidad persona. Por medio de la reusabilidad podemos utilizar una clase definida previamente en las aplicaciones que nos sea conveniente. Es claro que la flexibilidad con la que se definió la clase va a ser fundamental para su reutilización.Mantenibilidad: Las clases que conforman una aplicación, vistas como módulos independientes entre sí, son fáciles de mantener sin afectar a los demás componentes de la aplicación.Extensibilidad: Gracias a la modularidad y a la herencia una aplicación diseñada bajo el paradigma de la orientación a objetos puede ser fácilmente extensible para cubrir necesidades de crecimiento de la aplicación.


¿Cuáles son las desventajas de un lenguaje orientado a objetos?


A pesar de que las ventajas de la programación orientada a objetos superan a las limitaciones de la misma, podemos encontrar algunas características no deseables en ésta.

Limitaciones para el programador. No obstante que la tecnología orientada a objetos no es nueva, un gran porcentaje de programadores no están familiarizados con los conceptos de dicha tecnología. En otras palabras, la lógica de la programación estructurada sigue siendo predominante en la mayoría de los desarrolladores de software, después de haber revisado de forma breve los principios de la programación orientada a objetos, nos es claro que en ésta se requiere una lógica de pensamiento totalmente diferente a la lógica comúnmente utilizada para la programación estructurada.

Tamaño excesivo en las aplicaciones resultantes. La gran mayoría de los equipos de computo cuentan con capacidades tanto de almacenamiento como de memoria lo suficientemente buena como para ejecutar la mayoría de las aplicaciones que puedan desarrollarse con la tecnología orientada a objetos, sin embargo existen casos en los que lo anterior no se cumple. Una de las desventajas de la programación orientada a objetos es que cuando se heredan clases a partir de clases existentes se heredan de forma implícita todos los miembros de dicha clase aun cuando no todos se necesiten, lo que produce aplicaciones muy grandes que no siempre encajan en los sistemas con los que se disponga.

Velocidad de ejecución: Esto tiene que ver, en cierto modo, con el punto anterior, una aplicación innecesariamente pesada en muchas ocasiones es más lenta de ejecutar que una aplicación conformada únicamente por los módulos necesarios.


5. REVISION DE ALGUNOS DE LOS LENGUAJES DE POO





Entre los lenguajes orientados a objetos se destacan los siguientes:

Ø ABAP
Ø ActionScript
Ø ActionScript 3
Ø Ada
Ø C++
Ø C#
Ø Clarion
Ø Lenguaje de programación D
Ø Object Pascal (Delphi)
Ø Flex builder (adobe)
Ø Gambas
Ø Harbour
Ø Eiffel
Ø Java
Ø JavaScript (la herencia se realiza por medio de la programación basada en prototipos)
Ø Lexico (en castellano)
Ø Objective-C
Ø Ocaml
Ø Oz
Ø Lenguaje de programación R
Ø Perl (soporta herencia múltiple. La resolución se realiza en preorden, pero puede modificarse al algoritmo C3 por medio del módulo Class::C3 en CPAN)
Ø PHP (en su versión 5)
Ø Python
Ø Ruby
Ø Smalltalk
Ø Magik (SmallWorld)
Ø VB.NET
Ø Visual FoxPro (en su versión 6)
Ø Visual Basic
Ø XBase++

Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino que son híbridos que combinan la POO con otros paradigmas.

5.1.- Simula:

• El Simula 67 fue considerado como el primer LPOO
• Fue diseñado en 1967 por Ole-Johan Dhal y Kristen Nygaard en el Norwegian Computing
Center en Oslo
• El nombre de Simula 67 fue acortado a Simula en 1986, existiendo un estándar del lenguaje
desde 1987 [SIS, 1987]

5.2.- Smalltalk:

- Primer lenguaje creado con tecnología de objetos puros
- El origen de Smalltalk está alrededor de 1970 en la Universidad de UTA de la mano de Alan Kay
- Smalltalk se desarrolla en el Xerox Palo Alto Research Center (PARC) de la mano de Alan
Kay, Adele Goldberg y Daniel Ingalls
- Los conceptos de Smalltalk han influido en el diseño de LPOO y en el aspecto y sensación de los
GUI como los de Macintosh o Motif
- Smalltalk 72, Smalltalk 74, Smalltalk 76, Smalltalk 78 y Smalltalk 80.
- Smalltalk/V de Digital
- Entorno de programación: Lenguaje Smalltalk básico, Colección de clases y el entorno real de
programación
- El estilo del lenguaje se enfatiza la ligadura dinámica y no realiza chequeo de tipos
- El bloque fundamental es la clase, que contiene la descripción de variables y métodos
- Los métodos contienen el código, y definen cómo responde un objeto a un mensaje
- La ejecución de una rutina de un objeto se denomina en la terminología de Smalltalk “enviar un
mensaje” al objeto, cuya clase encontrará la forma apropiada de manejar dicho mensaje
- Todo en Smalltalk son objetos, incluyendo a las propias clases
- El entorno de Smalltalk permite un rápido desarrollo de programas
- La biblioteca de clases fue diseñada para ser extendida y adaptada por adición de subclases para
satisfacer las necesidades de la aplicación
- La arquitectura Modelo/Vista/Controlador (MVC) es una importante contribución de Smalltalk
- Una referencia clásica sobre Smalltalk es [Goldberg and Robson, 1983]






5.3.- EIFFEL:

- Eiffel fue desarrollado por Bertrand Meyer
- Es un lenguaje orientado al objeto puro
- Soporta ligadura dinámica
- Tiene comprobación estricta de tipos
- Admite herencia múltiple
- Soporta clases parametrizadas
- La gestión de memoria la lleva a cabo el entorno de programación
- Eiffel proporciona una biblioteca de clases predefinidas muy completa
- Eiffel cuenta con la clase como único criterio de estructuración
- Una declaración de clase en Eiffel puede incluir una lista de características exportadas, una lista de clases


predecesoras, y una lista de declaraciones de características
- Cuenta con manejo de excepciones
- [Meyer, 1992] es una de las referencias obligadas, aunque con unas miras más amplias, se recomienda


[Meyer, 1997]
- Diseño por contrato
• Precondiciones: que deben cumplirse antes de que se invoque un método
• Postcondiciones: que se garantizan han de cumplirse después de que se haya ejecutado el
método
• Invariantes Invariantes: condición que debe cumplir la clase en toda circunstancia estable
• Un contrato entre el proveedor y el usuario de una clase espera que
�� El usuario de una clase asegurará que las precondiciones de un método se cumplan antes de que el método se invoque
�� El proveedor de la clase garantizará que las postcondiciones se cumplan después que se ha aplicado el método
- Violación de Aserciones
¿De quién es la responsabilidad? ¿De quién es la responsabilidad?

• Precondiciones: De quien solicita el servicio (cliente) Precondiciones: De quien solicita el
servicio (cliente)
• Postcondiciones Postcondiciones: De quien ofrece el servicio (servidor)
• Invariantes Invariantes: De quien esté actuando en ese momento sobre el objeto
• ¿Qué provoca la violación de una aserción? Excepciones
• ¡Qué se encargue el responsable!
- Manejo de la excepción: tratar de arreglar la situación, cláusula de rescate: , intentar nuevamente:
- Pasar la responsabilidad... ¿Nadie? El sistema aborta Aserciones y Herencia: La subcontratación
el subcontratado pide menos y garantiza más (sino no es negocio )




5.4.- C++:

- C++ es un lenguaje híbrido, extensión del lenguaje C.
- Fue desarrollado por Bjarne Stroustrup en los laboratorios AT&T
- Las primeras versiones del lenguaje se denominaron C con clases, y datan de 1980
- El nombre de C++ se debe a Rick Mascitti, quien lo bautizó de esta manera en el verano de 1983
- C++ fue instalado por primera vez fuera del grupo de investigación del autor en julio de 1983
- En 1987 surge la necesidad de estandarización de C++
- Dispone de capacidades para la herencia simple y múltiple
- Por defecto C++ tiene ligadura estática
- Las funciones definidas como virtuales pueden beneficiarse del concepto de ligadura dinámica
- C++ es estrictamente tipado, aunque admite la posibilidad de casting.
- No cuenta con un recolector de basura
- La ausencia de un gestor automático de memoria por defecto, obliga al concepto de destructor
- Ocultamiento de la información, incluso a los descendientes
- Cuenta con un mecanismo de acceso especial por parte de una clase o una función que se declare
como friend
- Soporte de manejo de excepciones
- Soporte de genericidad mediante las plantillas
- Permite sobrecarga de operadores
- Sintaxis oscura, y gramática difícil de analizar
- Lenguaje complejo, preocupado por la detección temprana de errores, y por la eficiencia de la
ejecución, perdiendo algo de sencillez y de flexibilidad para el diseño
- [Stroustrup, 1997] es una referencia válida para este lenguaje



5.5.- Java:

- Realizado por un equipo de Sun Microsystems a finales de 1995
- Ha recibido una especial atención desde los primeros meses de 1996
- Es un lenguaje orientado al objeto puro diseñado desde cero, que recibe muchas influencias de
C++
- Se le atribuyen las siguientes características
• Simple y poderoso
• Seguro
• Robusto
• Interactivo
• Independiente de la arquitectura
• Interpretado
• Sencillo de aprender
- Soporta threads
-Recogida de basura automática
- De la abundante bibliografía existente se recomienda [SUN, 2001]
- Java produce un bytecode que será interpretado por una máquina virtual
- La máquina virtual se encuentra a menudo en navegadores web
- La explosión de Internet ha influido en el auge de Java


6.- CONCLUSIONES

En la actualidad existen varios lenguajes de programación orientados a objetos, no obstante a muchos de estos lenguajes todavía les falta madurez en lo que se refiere a “orientado a objetos”.

Por otro lado las ventajas que ofrece la programación orienta a objetos son notorias como la reutilización de código, la flexibilidad que ofrece y la mantenibilidad no obstante a eso se sigue utilizando la programación estructurada.

7.- REFERNCIAS BIBLIOGRAFICAS

Paginas en internet.

http://Lenguajes –orientado-a-objetos.blogspot.com/
http://es.wikipedia.org
http://www.monografias.com
http://www.alegsaonline.com/art.php?id=13
http://elticus.com/?contenido=44http://www.ulfix.net/content/view/37/114/1/1/

Bibliografia escrita.

Joyanes Aguilat, L. (2003), Fundamentos de programación. Algoritmos, estructuras
de datos y objetos. McGraw Hill