1 Orígenes de la programación orientada a objetos Conceptos clave Evolución del software Programación orientada a procedimientos Programación orientada a objetos Objetos Clases Abstracción de datos Encapsulación Herencia Polimorfismo Ligadura dinámica Pase de mensajes Lenguajes orientados a objetos Lenguajes basados en objetos 1.1 Lacrisisdelsoftware Los avances en la tecnología del software siguen siendo espectaculares. Se anuncian nuevas técnicas y herramientas en una vertiginosa sucesión. Esto ha obligado a los ingenieros y a la industria del software a buscar continuamente nuevos enfoques para el diseño y el desarrollo de software, los cuales se vuelven cada vez más críticos en aras de la creciente complejidad de los sistemas de software así como de la naturaleza altamente competitiva de la industria. Estos rápidos avances parece que han creado una situación de crisis dentro de la industria. Es necesario dar respuesta a las siguientes cuestiones para afrontar esta crisis: ¿Cómo representar entidades de problemas de la vida real en el diseño de sistemas? ¿Cómo diseñar sistemas con interfaces abiertos? ¿Cómo garantizar la reusabilidad y la extensibilidad de los módulos? ¿Cómo desarrollar módulos que sean tolerantes a los cambios futuros? 1 BALAGURUSAMY - Programación orie1 1 22/12/2006 13:09:36 Programación orientada a objetos con C++ ¿Cómo mejorar la productividad del software y disminuir el coste del software? ¿Cómo mejorar la calidad del software? ¿Cómo gestionar las planificaciones temporales? ¿Cómo industrializar el proceso de desarrollo de software? Muchos productos software o bien están no terminados, o no se usan o son entregados con errores importantes. La Figura 1.1 muestra el destino de los proyectos software de defensa de Estados Unidos acometidos en los años setenta. Alrededor del 50% de los productos software nunca fueron finalizados, y una tercera parte de los que fueron entregados nunca se usaron. Es interesante anotar que sólo el 2% fueron usados tal como se entregaron sin ninguna modificación. Esto ilustra que la industria del software tiene un récord notablemente malo en productos entregados. Los cambios en los requisitos del usuario han sido siempre el problema principal. Otro estudio (Fig. 1.2) muestra que más del 50% de los sistemas necesitaron modificaciones debido a cambios en los requisitos de usuario y en los formatos de los datos. Esto sólo ilustra que, en un mundo cambiante con un entorno de negocios dinámico, las solicitudes de cambios son inevitables y por tanto los sistemas deben ser adaptables y tolerantes a los cambios. Estos estudios y otros informes sobre implementación de software sugieren que los productos software deberían ser evaluados cuidadosamente para su calidad antes de que sean entregados e implementados. Algunos de los problemas de calidad que deben ser considerados con una evaluación crítica son: 1. 2. 3. 4. 5. Correctitud. Mantenibilidad. Reusabilidad. Apertura e interoperabilidad. Portabilidad. Fig. 1.1 El estado de los proyectos de defensa de Estados Unidos (según datos de su gobierno) BALAGURUSAMY - Programación orie2 2 22/12/2006 13:09:36 Orígenes de la programación orientada a objetos Fig. 1.2 Descomposición de los costes de mantenimiento 6. Seguridad. 7. Integridad. 8. Amabilidad con el usuario. La selección y el uso de herramientas software adecuadas ayudaría a resolver algunos de estos problemas. 1.2 Evolución del software Ernest Tello, un escritor de prestigio en el campo de la inteligencia artificial, comparó la evolución de la tecnología del software con el crecimiento de un árbol. Al igual que un árbol, la evolución del software tiene distintas fases o “capas” de crecimiento. Estas capas se construyeron una sobre otra durante las cinco últimas décadas, como se muestra en la Figura 1.3, en la que cada capa representa una mejora sobre las anteriores. Sin embargo, la analogía falla si consideramos la vida de estas capas. En los sistemas software, cada una de las capas continúa siendo funcional, mientras que en el caso de los árboles, sólo la capa superior es funcional. Alan Kay, uno de los promotores del paradigma orientado a objetos y el principal diseñador de Smalltalk, dijo: “Cuando la complejidad aumenta, la arquitectura domina el material básico”. Para construir software complejo hoy en día no basta con juntar una secuencia de instrucciones de programación y varios conjuntos de procedimientos y módulos; necesitamos incorporar técnicas sólidas de construcción y estructuras del programa que sean fáciles de comprender, implementar y modificar. Desde la invención de la computadora, se han probado muchos enfoques de programación. Entre éstos se incluyen técnicas tales como programación modular, programación descendente, programación ascendente y programación estructurada. La principal motivación de cada una ha sido la preocupación para manipular la complejidad creciente de los programas BALAGURUSAMY - Programación orie3 3 22/12/2006 13:09:37 Programación orientada a objetos con C++ Fig. 1.3 Capas del software de computadoras para que éstos sean fiables y de fácil mantenimiento. Estas técnicas se hicieron populares entre los programadores durante las dos últimas décadas. Con la aparición de lenguajes tales como C, la programación estructurada se hizo muy popular y fue la técnica principal de los años ochenta. La programación estructurada era una herramienta potente que permitió a los programadores escribir programas moderadamente complejos con bastante facilidad. Sin embargo, cuando los programas aumentaron más su tamaño, incluso el enfoque estructurado fracasó en mostrar los resultados deseados en términos de programas libres de errores, fáciles de mantener y reutilizables. La programación orientada a objetos (POO) es un enfoque para la organización y el desarrollo de programas que intenta eliminar algunos de los escollos de los métodos de programación convencionales al incorporar lo mejor de las características de la programación estructurada con varios conceptos nuevos y potentes. Es una nueva forma de organizar y desarrollar programas y no tiene nada que ver con un lenguaje particular. Sin embargo, no todos los lenguajes son adecuados para implementar fácilmente los conceptos de la POO. 1.3 Introducción a la programación orientada a procedimientos A la programación convencional, usando lenguajes tales como COBOL, FORTRAN y C, se conoce comúnmente como programación orientada a procedimientos (POP). En el enfoque orientado a procedimientos, el problema se visualiza como una secuencia de cosas a realizar tales como leer, calcular e imprimir. Se escribe una serie de funciones para realizar estas tareas. Se presta atención principalmente a las funciones. En la Figura 1.4 se muestra una estructura de programa típica para la programación orientada a procedimientos. Se BALAGURUSAMY - Programación orie4 4 22/12/2006 13:09:38 Orígenes de la programación orientada a objetos Fig. 1.4 Estructura típica de los programas orientados a procedimientos ha usado la técnica de descomposición jerárquica para especificar las tareas que se tienen que completar para resolver un problema. La programación orientada a procedimientos básicamente consiste en escribir una lista de instrucciones (o acciones) para que las realice la computadora, y organizar estas instrucciones en grupos denominados funciones. Normalmente usamos un diagrama de flujo para organizar estas acciones y representar el flujo de control de una acción a otra. Mientras nos concentramos en el desarrollo de funciones, se presta muy poca atención a los datos que están siendo usados por varias funciones. ¿Qué le ocurre a los datos? ¿Cómo se ven afectados por las funciones que trabajan sobre ellos? En un programa que consta de varias funciones, muchos elementos importantes de datos son declarados como globales de manera que pueden ser accedidos por todas las funciones. Cada función puede tener sus propios datos locales. La Figura 1.5 muestra la relación entre los datos y las funciones en un programa orientado a procedimientos. Los datos globales son más vulnerables a un cambio inadvertido por parte de una función. En un programa grande es muy difícil identificar qué dato es usado por cada función. En el caso de que necesitemos revisar una estructura de datos externa, también necesitamos revisar todas las funciones que acceden a tales datos. Esto proporciona una oportunidad para que surjan los errores sin enterarnos. Otro inconveniente serio con el enfoque orientado a procedimientos es que no modela muy bien los problemas del mundo real. Esto es debido a que las funciones están orientadas a la acción y no se corresponden realmente con los elementos del problema. Algunas de las características de la programación orientada a procedimientos son: El énfasis se pone en hacer cosas (algoritmos). Los programas grandes se dividen en programas más pequeños denominados funciones. La mayoría de las funciones comparten datos globales. BALAGURUSAMY - Programación orie5 5 22/12/2006 13:09:38 Programación orientada a objetos con C++ Fig. 1.5 Relaciones entre datos y funciones en programación orientada a procedimientos Los datos se mueven públicamente en el sistema de función en función. Las funciones transforman datos de una forma a otra. Emplea el enfoque descendente en el diseño del programa. 1.4 Paradigma de programación orientada a objetos El principal factor que motivó la invención del enfoque orientado a objetos fue eliminar algunos de los defectos encontrados en el enfoque orientado a procedimientos. POO trata a los datos como un elemento crítico en el desarrollo del programa y no permite que fluyan libremente por el sistema. Une los datos con las funciones que operan sobre ellos, y los protege de modificaciones accidentales por parte de funciones externas. POO permite la descomposición de un problema en una serie de entidades llamadas objetos y luego construye los datos y las funciones alrededor de estos objetos. En la Figura 1.6 se muestra la organización de los datos y las funciones en los programas orientados a objetos. Sólo las funciones asociadas con el objeto pueden acceder a los datos de un objeto. Sin embargo, las funciones de un objeto pueden acceder a las funciones de otros objetos. Algunas de las características llamativas de la programación orientada a objetos son: El énfasis radica en los datos en lugar de en los procedimientos. Los programas se dividen en lo que se conoce como objetos. Las estructuras de datos se diseñan de manera que caracterizan a los objetos. Las funciones que operan sobre los datos de un objeto se juntan con la estructura de datos. Se ocultan los datos y éstos no pueden ser accedidos por funciones externas. Los objetos se pueden comunicar entre sí a través de las funciones. Se pueden añadir fácilmente nuevos datos y funciones cuando sea necesario. Sigue un enfoque ascendente en el diseño del programa. BALAGURUSAMY - Programación orie6 6 22/12/2006 13:09:38 Orígenes de la programación orientada a objetos Fig. 1.6 Organización de datos y funciones en POO La programación orientada a objetos es el concepto más emergente entre los paradigmas de programación y todavía tiene un significado diferente para distintas personas. Es por tanto importante disponer de una definición de trabajo de la programación orientada a objetos antes de continuar. Definimos “la programación orientada a objetos como un enfoque que suministra una forma de modularizar programas por medio de la creación de áreas de memoria particionadas para tanto datos como funciones que pueden ser usadas como plantillas para crear bajo demanda copias de tales módulos”. De esta manera, se considera que un objeto es un área particionada de la memoria de la computadora que almacena datos y un conjunto de operaciones que pueden acceder a tales datos. Puesto que las particiones de memoria son independientes, se pueden usar los objetos en varios programas diferentes sin sufrir modificaciones. 1.5 Conceptos básicos de la programación orientada a objetos Es necesario comprender algunos de los conceptos usados ampliamente en programación orientada a objetos. Estos incluyen los siguientes: Objetos. Clases. Abstracción de datos y encapsulación. Herencia. Polimorfismo. Ligadura dinámica. Pase de mensajes. En esta sección, discutiremos algunos de estos conceptos con algo de detalle. BALAGURUSAMY - Programación orie7 7 22/12/2006 13:09:39 Programación orientada a objetos con C++ Objetos Los objetos son las entidades básicas en tiempo de ejecución en un sistema orientado a objetos. Pueden representar a una persona, un lugar, una cuenta bancaria, una tabla de datos o cualquier elemento que el programa tenga que manipular. También pueden representar datos definidos por el usuario tales como vectores, el tiempo y listas. El problema de programación es analizado en términos de objetos y de la naturaleza de la comunicación entre los mismos. Se deberían elegir los objetos del programa de tal manera que representen lo más fielmente posible a los objetos del mundo real. Los objetos ocupan espacio en la memoria y tienen una dirección asociada como un registro en Pascal o una estructura en C. Cuando se ejecuta un programa, los objetos interactúan entre sí mediante el envío de mensajes. Por ejemplo, si “cliente” y “cuenta” son dos objetos de un programa, entonces el objeto cliente puede enviar un mensaje al objeto cuenta solicitando un balance bancario. Cada objeto contiene datos y código para manipularlos. Los objetos pueden interaccionar sin tener que conocer los detalles de los datos y del código de los demás. Es suficiente con conocer el tipo de mensaje aceptado y el tipo de respuesta devuelto por los objetos. Aunque diferentes autores los representan de manera distinta, la Figura 1.7 muestra dos notaciones que son popularmente usadas en análisis y diseño orientado a objetos. Clases Ya hemos mencionado que los objetos contienen datos y código para manipular dichos datos. El conjunto completo de datos y código de un objeto puede constituir un tipo de dato definido por el usuario con la ayuda de una clase. De hecho, los objetos son variables del tipo clase. Una vez que se ha definido una clase, podemos crear cualquier número de objetos pertenecientes a dicha clase. Cada objeto se asocia con los datos del tipo de la clase con la que está creado. Una clase es por tanto una colección de objetos del mismo tipo. Por ejemplo, mango, manzana y naranja son miembros de la clase fruta. Las clases son tipos de datos definidos por el usuario y se comportan como los tipos intrínsecos de un lenguaje de programación. La sintaxis usada para crear un objeto no es diferente de la sintaxis usada para crear un objeto entero en C. Fig. 1.7 BALAGURUSAMY - Programación orie8 8 Dos formas de representar un objeto 22/12/2006 13:09:39 Orígenes de la programación orientada a objetos Si se ha definido fruta como una clase, entonces la instrucción fruta mango; creará un objeto mango perteneciente a la clase fruta. Abstracción de datos y encapsulación A la envoltura de datos y funciones en una sola unidad (llamada clase) se conoce como encapsulación. La encapsulación de datos es la característica más llamativa de una clase. Los datos no son accesibles al mundo exterior y solamente aquellas funciones que están envueltas en la clase pueden acceder a ellos. Estas funciones proporcionan la interfaz entre los datos del objeto y el programa. A este aislamiento de los datos del acceso directo por el programa se le denomina ocultación de los datos u ocultación de la información. La abstracción se refiere al acto de representar las características esenciales sin incluir los detalles de fondo o las explicaciones. Las clases usan el concepto de abstracción y se definen como una lista de atributos abstractos tales como tamaño, peso y coste, y funciones para operar sobre estos atributos. Ellas encapsulan todas las propiedades esenciales de los objetos que van a ser creados. A los atributos se les denomina algunas veces miembros dato ya que ellos almacenan la información. A las funciones que operan sobre estos datos se les denomina algunas veces métodos o funciones miembro. Debido a que las clases usan el concepto de abstracción de datos, también se les conoce como Tipos Abstractos de Datos (TAD). Herencia La herencia es el proceso por el que los objetos de una clase adquieren las propiedades de los objetos de otra clase. Ello implica el concepto de clasificación jerárquica. Por ejemplo, el pájaro ‘petirrojo’ forma parte de la clase ‘pájaro volador’ la cual forma parte de nuevo de la clase ‘pájaro’. El principio que subyace en este tipo de división es que cada clase derivada comparte características comunes con la clase de la cual se deriva como se ilustra en la Figura 1.8. En POO, el concepto de herencia suministra la idea de reusabilidad. Esto significa que podemos añadir características a una clase existente sin modificarla. Ello es posible al derivar una nueva clase a partir de otra existente. La nueva clase tendrá las características combinadas de ambas clases. El verdadero atractivo y potencia del mecanismo de herencia es que permite al programador reutilizar una clase que es casi, pero no exactamente, lo que quiere, y adaptar la clase de tal manera que no introduzca efectos laterales indeseables en el resto de las clases. Observe que cada sub-clase define solamente aquellas características que son exclusivas de la misma. Sin el uso de la clasificación, cada clase tendría que incluir explícitamente todas sus características. Polimorfismo El polimorfismo es otro concepto importante en POO. Polimorfismo, un vocablo griego, significa la posibilidad de tomar más de una forma. Una operación puede exhibir diferen- BALAGURUSAMY - Programación orie9 9 22/12/2006 13:09:39 10 Programación orientada a objetos con C++ Fig. 1.8 Propiedad de herencia tes comportamientos en diferentes situaciones. El comportamiento depende de los tipos de datos usados en la operación. Por ejemplo, consideremos la operación de adición. Para dos números, la operación generará su suma. Si los operandos son cadenas de caracteres, entonces la operación generará una tercera cadena por concatenación. Al proceso de hacer que un operador exhiba diferentes comportamientos en diferentes situaciones se le conoce como sobrecarga del operador. La Figura 1.9 ilustra cómo un solo nombre de función se puede usar para manipular un número diferente y tipos diferentes de argumentos. Esto es algo similar a que una palabra concreta tenga varios significados dependiendo del contexto. Al uso de un solo nombre de función para realizar diferentes tipos de tareas se le conoce como sobrecarga de la función. El polimorfismo juega un papel importante al permitir que los objetos tengan diferentes estructuras internas para compartir la misma interfaz externa. Esto significa que se puede acceder de la misma manera a una clase general de operaciones incluso aunque las acciones específicas asociadas con cada operación puedan diferir. El polimorfismo es ampliamente usado al implementar la herencia. Ligadura dinámica Por ligadura se entiende el enlace de una llamada a un procedimiento con el código a ejecutar en respuesta a la llamada. Ligadura dinámica (también conocida como última ligadura) BALAGURUSAMY - Programación orie10 10 22/12/2006 13:09:40 Orígenes de la programación orientada a objetos Fig. 1.9 11 Polimorfismo significa que el código asociado con una llamada a un procedimiento dado no es conocido hasta el instante de la llamada en tiempo de ejecución. Está asociada con el polimorfismo y la herencia. Una llamada a una función asociada con una referencia polimórfica depende del tipo dinámico de dicha referencia. Consideremos el procedimiento “dibujar” de la Figura 1.9. Por herencia, cada objeto tendrá este procedimiento. Sin embargo, su algoritmo es único para cada objeto y por tanto el procedimiento dibujar estará redefinido en cada clase que define al objeto. En tiempo de ejecución, se llamará al código que iguale al objeto bajo la referencia actual. Pase de mensajes Un programa orientado a objetos consta de un conjunto de objetos que se comunican entre sí. El proceso de programar en un lenguaje orientado a objetos, por tanto, involucra los siguientes pasos básicos: 1. Creación de las clases que definen los objetos y su comportamiento, 2. Creación de los objetos a partir de las definiciones de clase, y 3. Establecimiento de la comunicación entre objetos. Los objetos se comunican entre sí enviando y recibiendo información de la misma manera que las personas se pasan mensajes entre ellas. El concepto de pase de mensajes lo hace más fácil que hablar sobre la construcción de sistemas que directamente modelan o simulan a sus réplicas del mundo real. Un mensaje para un objeto es una solicitud para la ejecución de un procedimiento, y por tanto invocará a una función (procedimiento) en el objeto receptor que genere el resultado deseado. El pase de mensajes implica la especificación del nombre del objeto, el nombre de la función (mensaje) y la información a enviar. BALAGURUSAMY - Programación orie11 11 22/12/2006 13:09:40 12 Programación orientada a objetos con C++ Ejemplo: Los objetos tienen un ciclo de vida. Ellos pueden ser creados y destruidos. La comunicación con un objeto es factible sólo a lo largo de su vida. 1.6 Ventajas de la POO POO ofrece varias ventajas tanto para el diseñador del programa como para el usuario. La orientación a objetos contribuye a la solución de muchos problemas asociados con el desarrollo y la calidad de los productos software. La nueva tecnología promete mayor productividad del programador, mejor calidad del software y menor coste de mantenimiento. Las principales ventajas son: Por medio de la herencia, podemos eliminar código redundante y extender el uso de clases existentes. Podemos construir programas a partir de módulos de trabajo estándar que se comunican entre sí, en lugar de tener que empezar desde cero la escritura del código. Esto conduce a un ahorro en el tiempo de desarrollo y a una productividad mayor. El principio de ocultación de los datos ayuda al programador a construir programas seguros que no pueden ser invadidos por código de otras partes del programa. Es posible tener múltiples copias de un objeto que coexisten sin ninguna interferencia. Es posible transformar objetos del dominio del problema a otros en los programas. Es fácil dividir el trabajo de un proyecto basado en objetos. El enfoque del diseño centrado en los datos nos permite capturar más detalles de un modelo de forma que se puedan implementar. Se pueden mejorar y actualizar fácilmente los sistemas orientados a objetos desde los pequeños hasta los grandes sistemas. Las técnicas de pase de mensajes para la comunicación entre objetos simplifican mucho las descripciones de las interfaces con sistemas externos. Se puede gestionar fácilmente la complejidad del software. Mientras sea posible incorporar todas estas características en un sistema orientado a objetos, su importancia depende del tipo de proyecto y la preferencia del programador. Hay una serie de cuestiones que necesitan ser abordadas para recoger los beneficios establecidos anteriormente. Por ejemplo, las bibliotecas de objetos deben de estar disponibles para su reutilización. La tecnología está aún en desarrollo y los productos actuales pueden ser BALAGURUSAMY - Programación orie12 12 22/12/2006 13:09:41 Orígenes de la programación orientada a objetos 13 rápidamente sustituidos. Es necesario desarrollar controles y protocolos estrictos si no se quiere comprometer la reutilización. Desarrollar un software que sea fácil de usar lo hace difícil de construir. Se espera que las herramientas de la programación orientada a objetos ayudarán a gestionar este problema. 1.7 Lenguajes orientados a objetos La programación orientada a objetos no es lo que hace falta en un lenguaje particular. Lo mismo que la programación estructurada, los conceptos de POO se pueden implementar usando lenguajes tales como C y Pascal, Sin embargo, la programación se hace pesada y puede generar confusión cuando los programas crecen de tamaño. Un lenguaje que esté especialmente diseñado para soportar los conceptos de POO se vuelve más adecuado para implementarlos. Los lenguajes deberían soportar varios de los conceptos de POO para proclamar que están orientados a objetos. Dependiendo de las características que soportan, se pueden clasificar en las dos categorías siguientes: 1. Lenguajes de programación basados en objetos. 2. Lenguajes de programación orientados a objetos. La programación basada en objetos es el estilo de programación que soporta principalmente encapsulación e identidad de objetos. Las características principales que se requieren para la programación basada en objetos son: Encapsulación de datos. Ocultación de datos y mecanismos de acceso. Inicialización automática y aclarado de objetos. Sobrecarga de operadores. Se dice que los lenguajes que soportan programación con objetos son lenguajes de programación basados en objetos. No soportan la herencia ni la ligadura dinámica. Ada es un típico lenguaje de programación basado en objetos. La programación orientada a objetos incorpora todas las características de la programación basada en objetos junto con dos características adicionales, a saber, herencia y ligadura dinámica. La programación orientada a objetos puede por tanto estar caracterizada por la siguiente sentencia: Características basadas en objetos + herencia + ligadura dinámica Entre los lenguajes que soportan estas características se incluyen C++, Smalltalk, Object Pascal y Java. Hay un gran número de lenguajes de programación basados en objetos y orientados a objetos. La Tabla 1.1 lista algunos lenguajes POO populares de propósito general y sus características. Como se aprecia en la Tabla 1.1, todos los lenguajes proporcionan polimorfismo y ocultación de datos. Sin embargo, muchos de ellos no proporcionan facilidades para concurrencia, persistencia y genericidad. Eiffel, Ada y C++ proporcionan facilidad genérica, la cual es una construcción importante para soportar reutilización. Sin embargo, persistencia (un BALAGURUSAMY - Programación orie13 13 22/12/2006 13:09:41 1 Programación orientada a objetos con C++ Tabla 1.1 Características de algunos lenguajes POO Características Simula * Smalltalk * Objective C C++ Ada ** Ligadura (primera o última) Ambas Última Ambas Polimorfismo Ocultación de datos Concurrencia Pobre Pobre Pobre Difícil No No Herencia No Herencia múltiple No No — — No Recogida de residuos No Persistencia No Prometida No No Como L3G No No Algo de soporte Genericidad No No No No No No Bibliotecas de objetos No mucho Ambas Primera Object Pascal Turbo Pascal Última Primera Primera Ambas Eiffel * Java * Prometida * Auténticos lenguajes orientados a objetos ** Lenguajes basados en objetos Otros son extensiones de lenguajes convencionales proceso de almacenamiento de objetos) no está totalmente soportada por ninguno de ellos. En Smalltalk, aunque se puede grabar en disco todo el estado actual de ejecución, aún los objetos individuales no se pueden almacenar en un archivo externo. Comercialmente, C++ tiene solo 10 años de antigüedad, Smalltalk y Objetive C 13 años y Java sólo 5 años. Aunque Simula ha existido durante más de dos décadas, ha pasado la mayor parte de su vida en un entorno de investigación. Sin embargo, el campo es tan reciente que no debería ser juzgado tan severamente. El uso de un lenguaje concreto depende de las características y requisitos de una aplicación, del impacto de la elección en la organización y de la reutilización de los programas existentes. C++ se ha convertido en la actualidad en el lenguaje POO de propósito general más elegido, más práctico y más ampliamente usado en la industria. 1.8 AplicacionesdelaPOO La POO se ha convertido en la actualidad en una de las palabras pegadizas de la programación. Aparece una gran cantidad de excitación e interés entre los ingenieros de software en usar POO. Las aplicaciones de la POO están empezando a ganar importancia en muchas áreas. La aplicación más popular de la programación orientada a objetos, hasta ahora, ha sido en el área del diseño de interfaces de usuario tales como “Windows”. Se han desarrollado cientos de sistemas de ventanas usando las técnicas de POO. BALAGURUSAMY - Programación orie14 14 22/12/2006 13:09:42 Orígenes de la programación orientada a objetos 15 Los sistemas reales de las empresas son a menudo mucho más complejos y contienen más objetos con atributos y métodos complicados. POO es útil en estos tipos de aplicaciones ya que puede simplificar un problema complejo. Entre las áreas que auguran en el futuro la aplicación de la POO se incluyen: Sistemas de tiempo real. Simulación y modelado. Bases de datos orientadas a objetos. Hipertexto, hipermedia y expertexto. IA y sistemas expertos. Redes neuronales y programación paralela. Soporte de decisión y sistemas de automatización de oficinas. Sistemas CIM/CAM/CAD. La riqueza del entorno POO ha permitido a la industria del software mejorar no sólo la calidad de los sistemas software sino también su productividad. La tecnología orientada a objetos está desde luego cambiando la forma de pensar, analizar, diseñar e implementar de los ingenieros del software. RESUMEN La tecnología del software ha evolucionado a lo largo de una serie de fases durante La fase más popular hasta hace poco fue la programación orientada a procedimientos POP emplea el enfoque de programación descendente donde un problema se visualiza las cinco últimas décadas. (POP). como una secuencia de tareas a realizar. Se escribe una serie de funciones para implementar dichas tareas. POP tiene dos inconvenientes principales, (1) los datos se mueven libremente en el programa y son por tanto vulnerables a cambios causados por cualquier función del programa, y (2) no modela muy bien los problemas del mundo real. La programación orientada a objetos (POO) fue inventada para superar los inconvenientes de la POP. Emplea el enfoque de programación ascendente. Trata a los datos como un elemento crítico en el desarrollo del programa y no permite que fluyan libremente por el sistema. Une los datos con las funciones que operan sobre ellos en una estructura de datos llamada clase. A esta característica se le denomina encapsulación de datos. En POO, un problema es considerado como una colección de entidades llamadas objetos. Los objetos son instancias de las clases. Al aislamiento de los datos del acceso directo por el programa se denomina ocultación de los datos. La abstracción de datos se refiere a juntar características esenciales sin incluir detalles de fondo. BALAGURUSAMY - Programación orie15 15 22/12/2006 13:09:43 1 Programación orientada a objetos con C++ La herencia es el proceso por el cual los objetos de una clase adquieren propiedades Polimorfismo significa un nombre, múltiples formas. Nos permite tener más de una de objetos de otra clase. función con el mismo nombre en un programa. También permite la sobrecarga de operadores de manera que una operación pueda exhibir diferentes comportamientos en diferentes situaciones. Ligadura dinámica significa que el código asociado con un procedimiento dado no se conoce hasta el instante de la llamada en tiempo de ejecución. El pase de mensajes implica especificar el nombre del objeto, el nombre de la función (mensaje) y la información a enviar. La tecnología orientada a objetos ofrece varias ventajas sobre los métodos de programación convencionales, la más importante es la reusabilidad. Las aplicaciones de la tecnología POO han adquirido importancia en casi todas las áreas de computación incluyendo los sistemas de negocios en tiempo real. Hay una serie de lenguajes que soportan el paradigma de la programación orientada a objetos. Son populares entre ellos C++, Smalltalk y Java. C++ se ha convertido en la actualidad en un lenguaje estándar de la industria. Términos clave abstracción de datos Ada bibliotecas de objetos C++ clases clasificación jerárquica concurrencia datos globales datos locales diagramas de flujo Eiffel encapsulación de datos funciones funciones miembro herencia herencia múltiple Java lenguaje ensamblador lenguaje máquina lenguajes orientados a objetos ligadura dinámica ligadura primera ligadura última métodos BALAGURUSAMY - Programación orie16 16 miembros dato Object Pascal Objective C objetos ocultación de datos pase de mensajes persistencia polimorfismo programación ascendente programación basada en objetos programación descendente programación estructurada programación modular programación orientada a objetos programación orientada a procedimientos recogida de residuos reusabilidad Simula Smalltalk sobrecarga de función sobrecarga de operador Turbo Pascal 22/12/2006 13:09:44 Orígenes de la programación orientada a objetos 17 Preguntas de repaso 1.1 ¿Cuáles piensa que son los principales retos a los que se enfrenta la industria del software en la actualidad? 1.2 Discuta brevemente la evolución del software durante el periodo 1950–1990. 1.3 ¿Qué es la programación orientada a procedimientos? ¿Cuáles son sus principales características? 1.4 Discuta un enfoque para el desarrollo de programas orientados a procedimientos. 1.5 Describa cómo comparten datos las funciones en un programa orientado a procedimientos. 1.6 ¿Qué es la programación orientada a objetos? ¿En qué difiere de la programación orientada a procedimientos? 1.7 ¿Cómo se organizan las funciones y los datos en un programa orientado a objetos? 1.8 ¿Cuáles son las ventajas exclusivas de un paradigma de programación orientada a objetos? 1.9 Distinga entre los siguientes términos: (b) Objetos y clases. (c) Abstracción de datos y encapsulación de datos. (d) Herencia y polimorfismo. (e) Ligadura dinámica y pase de mensajes. 1.10 ¿Qué clases de cosas se pueden convertir en objetos en POO? 1.11 Describa la herencia cuando se aplica a la POO. 1.12 ¿Qué entiende por ligadura dinámica? ¿Qué utilidad tiene en POO? 1.13 ¿En que difiere el enfoque orientado a objetos del enfoque basado en objetos? 1.14 Liste algunas áreas de aplicación de la tecnología POO. 1.15 Determine si las siguientes sentencias son VERDADERO o FALSO. (a) En programación orientada a procedimientos, todos los datos son compartidos por todas las funciones. (b) En programación orientada a procedimientos, se pone especial énfasis en los algoritmos en lugar de en los datos. (c) Una de las características destacables de la programación orientada a objetos es la división de los programas en objetos que representan entidades del mundo real. (d) La envoltura de datos de diferentes tipos en una sola unidad se conoce como encapsulación. (e) Un problema de la programación orientada a objetos es que una vez que se crea una clase, ésta nunca se puede modificar. (f) La herencia significa la posibilidad de reutilizar los valores de los datos de un objeto. (g) El polimorfismo se utiliza ampliamente al implementar la herencia. (h) Los programas orientados a objetos se ejecutan mucho más rápido que los programas convencionales. (i) Los sistemas orientados a objetos se pueden escalar mejor desde los pequeños hasta los grandes. (j) El enfoque orientado a objetos no se puede usar para crear bases de datos. BALAGURUSAMY - Programación orie17 17 22/12/2006 13:09:44