Programación orientada a objetos Julia de Frutos Eduardo Fernández Programación orientada a objetos 1. Introducción. La programación orientada a objetos (Poo) es un paradigma de programación más orientado a como vemos las cosas en la vida real que otros tipos de programación (programación lógica, funcional, imperativa,...) Este tipo de programación permite solventar algunos de los problemas que ha tenido el desarrollo del software desde sus comienzos, como por ejemplo la falta de portabilidad y baja reusabilidad del código, junto con la dificultad en la modificación y desarrollo del mismo. Además es una técnica de codificación bastante mas intuitiva que el resto. La programación orientada a objetos tiene tres propiedades básicas: Debe estar basado en objetos, estar basado en clases y debe de ser capaz de mantener una herencia entre clases. La mayoría de los lenguajes cumplen una o dos de estas propiedades pero pocos logran cumplir las tres. En particular, la herencia. Posteriormente veremos los conceptos objeto, clase y herencia junto con el resto de conceptos asociadazos a la Poo. Aprender esta técnica no es complicado, pero es una manera subjetiva de programar que depende del desarrollador. Aunque podemos dar diferentes soluciones a un mismo problema, no todas ellas son válidas. La dificultad no radica en aprender esta técnica, si no en ejecutarla bien. Solo programando bien podemos aprovechar todas las ventajas que nos ofrece la programación orientada a objetos. 2. Origen. Los orígenes de la programación orientada a objetos se encuentran en Simula67. Este era un lenguaje creado para realizar simulaciones en el Centro de Cómputo Noruego en Oslo. Sus desarrolladores fueron Ole-Johan Dahl y Kristen Nygaard. Se dieron cuenta de que las cualidades de las naves con las que estaban simulando podía afectar unas a otras. Su idea fue la de agrupar diversos tipos de naves en diversas clases de objetos. Los objetos se agrupan en clases y estas definen sus propios datos y operaciones. Esta idea fue pulida posteriormente en Smalltak1, desarrollado en Simula2 en Xerox PARC3. Smalltalk: es un sistema informático que permite realizar tareas de computación mediante la interacción con un entorno de objetos virtuales. 2 Simula: primer lenguaje de programación orientada a objetos (OOP). 1 1 Programación orientada a objetos Julia de Frutos Eduardo Fernández Fue 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. En los años ochenta la programación orientada a objetos adquiere un papel dominante debido a la aparición de C++, una extensión de C que soporta este tipo de programación. Termina consolidándose finalmente con el auge de las Interfaces gráficas de usuario. Estas facilitan la comunicación del usuario con el ordenador mediante un sistema de iconos, ventanas y textos para los cuales la programación orientada a objetos está muy bien adaptada. Las características de esta técnica de programación fueron añadidas a muchos lenguajes existentes tales como Ada, Basic, Fortran, Pascal y otros. Pero estos lenguajes no se crearon para soportarlas lo que condujo a problemas de compatibilidad y mantenimiento del código, mientras que los lenguajes diseñados específicamente para ello carecían de las herramientas indispensables para muchos programadores que no podían trabajar sin ellas. El problema era conseguir un lenguaje basado en los métodos de la programación orientada a objetos, pero que incluyese algunas de las características del resto de paradigmas de manera segura. El Eiffel de Bertrand Meyer fue uno de los primeros leguajes que solventaron este problema; aunque se encuentra en desuso debido a la gran aceptación de Java y su maquina virtual que se encuentra implantada en la mayoría de navegadores web. Mas recientemente, nuevos lenguajes han apareciendo orientados a objetos pero con un procedimiento mas metodológico, como Pitón y Ruby. Probablemente, después de Java los lenguajes orientados a objetos mas importantes sean Visual Basic y C# diseñados para la plataforma .NET4 de Microsoft. 3. Conceptos básicos de POO. Objeto: Conjunto concreto de datos y operaciones (métodos). Se corresponden con los objetos que nos rodean. Un ejemplo de objeto puede ser un libro. Tiene una serie de propiedades (número de hojas, autor, editor, ...) y unas operaciones (se puede abrir, leer, anotar, ...) Clase: Conjunto de las propiedades y métodos de un tipo de objeto determinado. Podemos definir la clase libro, donde un objeto perteneciente a esta clase sería “El Camino” de Miguel Delibes. 3 Xerox PARC: una división de investigación de Xerox Corporation, con sede en Palo Alto. 4 .NET: proyecto de Microsoft para crear una nueva plataforma que permita un desarrollo de aplicaciones rápido. Microsoft pretende desarrollar una estrategia que sume todos sus productos, desde el Sistema Operativo hasta sus herramientas de mercado. 2 Programación orientada a objetos Julia de Frutos Eduardo Fernández Método: Algoritmo asociado a una clase de objetos o a uno de ellos. Se ejecutan tras recibir un "mensaje". Un método es lo que los objetos pueden hacer. No puedo escribir con un libro, por ejemplo. Un método puede producir un cambio en algunas de las propiedades del objeto, y/o la generación de un "evento" junto con un mensaje que se envía a otro objeto o así mismo. De esta forma, en el ejemplo de los libros, el método leer generaría un mensaje dirigido al propio libro para que fuese abierto. Evento: Es un suceso en el sistema. El programa envía el mensaje adecuado al objeto pertinente. Mensaje: Información dirigida a un objeto, el cual le dice que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó. Propiedad o atributo: Características de un objeto o una clase de objetos. Permiten ver los datos asociados a un objeto desde fuera. Su valor puede ser alterado por el evento provocado por un método Estado interno: Propiedad invisible de los objetos que solo se ve afectada por un método del objeto. Se utiliza para indicar las distintas situaciones del objeto o clases de objetos. 4. Características de la Poo. Abstracción: Permite no preocuparse por los detalles de implementación de cada tipo de dato. Estos toman el nombre de tipos de datos abstractos (TDA), incluidos en los lenguajes Pascal, Ada, Modula-2 y C++ entre otros. La abstracción está presente en casi todos los lenguajes de programación actuales. Algunos ejemplos de abstracción son los ya mencionados TDA, las estructuras de datos, los procedimientos y las funciones. Encapsulamiento: Consiste en separar la implementación de los objetos de los objetos en si. De este modo solo se puede cambiar el estado del objeto mediante las operaciones asociadas al mismo, sin tener que modificar su código. Así también se evita que el usuario altere su estado de manera incontrolada. Esta propiedad también recibe el nombre de “ocultación de la información”. El usuario del objeto desconoce la distribución de la información dentro del objeto y la información disponible en él. Pero gracias a los métodos asociados a cada uno puede usarlos y manejarlos. Un ejemplo de encapsulamiento es el circuito eléctrico de una casa. El usuario solo accede a ciertas partes del circuito (enchufes e interruptores), aunque las partes del circuito internas comparten información entre si. Polimorfismo: Es la posibilidad que ofrece la Poo de asociar a objetos diferentes distintos métodos con el mismo nombre. Cada objeto actuará en consecuencia según como este implementado el método. Por ejemplo, el mensaje "+" a un objeto de tipo entero significa suma, mientras que para un objeto de tipo cadena significaría concatenación. 3 Programación orientada a objetos Julia de Frutos Eduardo Fernández Cuando esto sucede en tiempo de ejecución, hablamos de asignación tardía o asignación dinámica. C++ tiene la posibilidad de polimorfismo en tiempo de compilación mediante operadores. Herencia: las clases de objetos no están desligadas unas de otras, sino que se relacionan entre sí, formando una jerarquía. 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. Esto suele hacerse agrupando los objetos en clases y las clases en árboles que reflejan un comportamiento común. Cuando un objeto pertenece a más de una clase se llama herencia múltiple, aunque esta característica no está soportada por algunos lenguajes como Java. 5. Diferencias con la programación imperativa5. La programación imperativa condujo a mejoras de la técnica de programación secuencial, tales como la programación estructurada y "refinamientos sucesivos", los métodos modernos de diseño de software orientado a objetos incluyen mejoras entre las que están el uso de los patrones de diseño, diseño por contrato, y lenguajes de modelado (ej: UML). Las principales diferencias son: La POO es más moderna, es una evolución de la programación imperativa que plasma en el diseño de una familia de lenguajes conceptos que existían previamente con algunos nuevos. La POO se basa en lenguajes que soportan sintáctica y semánticamente la unión entre los tipos abstractos de datos y sus operaciones (a esta unión se la suele llamar clase). La POO incorpora en su entorno de ejecución mecanismos tales como el polimorfismo(capacidad del código de un programa para ser utilizado con diferentes tipos de datos) y el envío de mensajes entre objetos. Con el tiempo se le fueron adjudicando problemas a la programación imperativa. Esos problemas fueron haciéndose cada vez más graves y antes de la programación orientada a objetos diversos autores encontraron soluciones basadas en aplicar estrictas metodologías de trabajo. De esa época son los conceptos de cohesión y acoplamiento. De esos problemas se destacan los siguientes: 5 Apartado extraído de http://es.wikipedia.org/wiki/Orientado_a_objetos 4 Programación orientada a objetos Julia de Frutos Eduardo Fernández Modelo mental anómalo. Nuestra imagen del mundo se apoya en los seres, a los que asignamos nombres sustantivos, mientras la programación clásica se basa en el comportamiento, representado usualmente por verbos. Es difícil modificar y extender los programas, pues suele haber datos compartidos por varios subprogramas, que introducen interacciones ocultas entre ellos. Es difícil mantener los programas. Casi todos los sistemas informáticos grandes tienen errores ocultos, que no surgen a la luz hasta después de muchas horas de funcionamiento. Es difícil reutilizar los programas. Es prácticamente imposible aprovechar en una aplicación nueva las subrutinas que se diseñaron para otra. Es compleja la coordinación y organización entre programadores para la creación de aplicaciones de media y gran envergadura. En la programación orientada a objetos pura no deben utilizarse llamadas de subrutinas, únicamente mensajes. Por ello, a veces recibe el nombre de programación sin CALL, igual que la programación estructurada se llama también programación sin GOTO. Sin embargo, no todos los lenguajes orientados a objetos prohíben la instrucción CALL (o su equivalente), permitiendo realizar programación imperativa y orientada a objetos a la vez. 6. Lenguajes orientados a objetos Ada: se usa en entornos en los que se necesita una gran seguridad y fiabilidad, como en la defensa. C++: está considerado como el lenguaje más potente, debido a que permite trabajar tanto a alto como a bajo nivel, aunque obliga a hacer casi todo manualmente, al igual que C, lo que hace difícil aprendizaje. C#: combina el control a bajo nivel de lenguajes como C y la velocidad de programación de lenguajes como Visual Basic. VB.NET: es una versión de Visual Basic destinada al desarrollo de aplicaciones .NET. Visual Basic apareció en el año 1991 como una evolución del QuickBasic que fabricaba Microsoft. Clarion: está orientado a la programación de aplicaciones de bases de datos. Es compatible con una gran cantidad de ellas incluyendo todas las de formato SQL, ADO, y XML, además puede generar salidas a HTML, XML, archivos de texto y PDF, entre otros. Delphi: entorno de desarrollo de software diseñado para programación general con especial énfasis en la programación visual. En Delphi se utiliza como lenguaje una versión moderna de Pascal llamada Object Pascal. Es producido por Borland. Delphi da la posibilidad de producir archivos ejecutables para Windows, GNU/Linux y la plataforma .NET. Eiffel: fue creado en 1985 por Bertrand Meyer. Se centra en la construcción de software robusto. Su lenguaje es parecido al de Pascal. 5 Programación orientada a objetos Julia de Frutos Eduardo Fernández Java: fue desarrollado por James Gosling y sus compañeros de Sun Microsystems al inicio de la década de 1990. A diferencia de los lenguajes de programación convencionales, Java es compilado en un bytecode6 que es ejecutado por una máquina virtual Java. El lenguaje toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos mucho más simple y elimina herramientas como los punteros. Lexico: es un lenguaje en español que busca facilitar el aprendizaje y la enseñanza de la programación orientada a objetos. Permite experimentar con los algoritmos diseñados sin tener que dedicar meses a aprender un lenguaje de programación. Objective-C: Es el principal lenguaje de programación en Mac OS X. Mac OS X es el sistema operativo de la familia de ordenadores Macintosh. Ocaml: nace de la evolución del lenguaje CAML, abreviación de Categorical Abstract Machine Language), al integrarsele la programación con objetos. Oz: es un lenguaje multi-paradigma. Contiene la mayoría de los conceptos de los principales paradigmas de programación, incluyendo programación lógica, funcional, imperativa, orientada a objetos, con restricciones, distribuida y concurrente. PHP: es un lenguaje de programación usado generalmente para la creación de contenidos en webs. El nombre es el acrónimo recursivo de "PHP: Hypertext Preprocessor", inicialmente PHP Tools, o, Personal Home Page Tools. Se trata de un lenguaje interpretado. PowerBuilder: herramienta de desarrollo de clase empresarial creada por la empresa Sybase. PowerBuilder permite el desarrollo de diferentes tipos de aplicaciones y componentes para arquitecturas cliente/servidor, distribuídas y Web. Las aplicaciones desarrolladas con PowerBuilder solo pueden ser ejecutadas en el sistema operativo Microsoft Windows, aunque cierto tipo de componenetes, llamados componentes no visuales o NVOs, y que contienen sólo lógica de aplicación, se pueden ejecutar en otros sistemas operativos como Unix. Python: es un lenguaje de programación interpretado e interactivo, capaz de ejecutarse en gran cantidad de plataformas. Creado por Guido van Rossum en 1990, su nombre procede de la afición de su creador por los humoristas británicos Monty Python. El principal objetivo de este lenguaje es la facilidad, tanto de lectura, como de diseño. Ruby: es un lenguaje de programación interpretado de muy alto nivel. Fue creado en Japón en el año 1993 por Yukihiro Matz Matsumoto. 6 Bytecode: código intermedio, más abstracto que el código máquina. Habitualmente se lo trata como a un fichero binario que contiene un programa ejecutable similar a un objeto, que es un fichero binario que contiene código máquina producido por el compilador. 6 Programación orientada a objetos Julia de Frutos Eduardo Fernández Smalltalk: es considerado como el primer de los lenguaje orientado a objetos. Dentro de Smalltalk todo es un objeto, incluidos los números reales o el propio entorno Smalltalk. No todos estos lenguajes son igualmente eficaces. Existen lenguajes como OOCOBOL, OOLISP, OOPROLOG y Object REXX que han sido desarrollados añadiendo a sus versiones anteriores las características de la orientación a objetos, como ya pasara con C++. 7. Conclusión. Pese a los grandes ventajas que ofrece la programación orientada a objetos gracias a características propias como la herencia y la encapsulación, aun quedan problemas por solucionar. No hay un lenguaje dominante que elimine la dependencia que existe entre unos y otros, y las definiciones de las clases pueden resultar erróneas después de meses de trabajo. Por otro lado, todos los elementos del programa deben de ser vistos como objetos y la transición a este tipo de programación hace que sea necesario el reciclaje de muchos de los programadores. Aun así, las líneas de investigación no se detienen y empieza a hablarse de programación orientada a aspectos (POA). Aunque es todavía un paradigma en estado embrionario, cada vez es mas gente la que se interesa por ella. 8. Bibliografía. http://es.wikipedia.org/wiki/Orientado_a_objetos http://www.monografias.com/trabajos/objetos/objetos.shtml http://www.desarrolloweb.com/articulos/499.php 7