Fundamentos de Programación Orientada a Objetos

I.- FUNDAMENTOS DE PROGRAMACIÓN ORIENTADA A OBJETOS 1.1 Evolución de la programación 1.2 Conceptos fundamentales de la Programación Orientada a Objetos 1.2.1 Los lenguajes orientados a objetos 1.3 Relaciones entre clases y objetos 1.4 El papel de clases y objetos en el análisis y el diseño

Página 1

Ing. Isis Espinosa Salazar

Fundamentos de Programación Orientada a Objetos

I.- FUNDAMENTOS DE PROGRAMACIÓN ORIENTADA A OBJETOS 1.1 Evolución de la programación 1.2 Conceptos fundamentales de la Programación Orientada a Objetos 1.2.1 Los lenguajes orientados a objetos 1.3 Relaciones entre clases y objetos 1.4 El papel de clases y objetos en el análisis y el diseño 1.1 Evolución de la programación

La evolución de la programación puede sintetizarse en tres modelos o paradigmas:

El significado de paradigma (paradigma en latín; paradeigma en griego) en su origen significaba un ejemplo ilustrativo; en particular, enunciado modelo que mostraba todas las inflexiones de una palabra. Un paradigma es una forma establecida de pensar acerca de cómo hacer algo. En el libro The Structure of Scientific Revolutions, el historiador Thomas Kuhn describía un paradigma como un conjunto de teorías, estándares y métodos que juntos representan un medio de organización del conocimiento: es decir, un medio de visualizar el mundo. ‰ ‰ ‰

La programación mediante procedimientos (procedural), La programación estructurada y La programación orientada a objetos

PROGRAMACION MEDIANTE PROCEDIMIENTOS [PROCEDURAL]
Programación y abstracción

• • • • • • • • • •

La abstracción es el proceso de extraer las propiedades relevantes de un objeto al tiempo que se ignoran los detalles no esenciales. Las propiedades extraídas definen una vista del objeto. En esencia, la abstracción supone la capacidad de encapsular y aislar, la información del diseño, de la ejecución. Definir una abstracción significa describir una entidad del mundo real, no importa lo compleja que pueda ser y, a continuación, utilizar esta descripción en un programa. La abstracción es fundamental para gestionar la complejidad del diseño y escritura del software. La abstracción es la clave para diseñar buen software. La abstracción es uno de los medios más importantes, mediante el cual nos enfrentamos con la complejidad inherente al software. Una abstracción se centra en la vista externa de un objeto, de modo que sirva para separar el comportamiento esencial de un objeto de su implementación Como describe Wulft: «Los humanos hemos desarrollado una técnica excepcionalmente potente para tratar la complejidad: abstraemos de ella. Incapaces de dominar en su totalidad los objetos complejos, se ignora los detalles no esenciales, tratando en su lugar con el modelo ideal del objeto y centrándonos en el estudio de sus aspectos esenciales.» El proceso de abstracción fue evolucionando desde la aparición de los primeros lenguajes de programación. La abstracción es esencial para el funcionamiento de una mente humana normal y es una herramienta muy potente para tratar la complejidad. El método más idóneo para controlar la complejidad es aumentar los niveles de abstracción. Las personas normalmente comprenden el mundo construyendo modelos mentales de partes del mismo; tratan de comprender cosas con las que pueden interactuar. Un modelo mental es una vista simplificada de cómo funciona, de modo que se pueda interactuar con ella. En esencia, este proceso de construcción de modelos es lo mismo que el diseño de software, aunque el desarrollo de software es único: el diseño de software produce el modelo que puede ser manipulado por una computadora. Sin embargo, los modelos mentales deben ser más sencillos que el sistema al cual imitan, o en caso contrario serán inútiles. Por ejemplo, consideremos un mapa como un modelo de su territorio. A fin de ser útil, el mapa debe ser más sencillo que el territorio que modela. Un mapa nos ayuda, ya que abstrae sólo aquellas características del territorio que deseamos modelar. Un mapa de carreteras modela cómo conducir mejor de una posición a otra. Un mapa topográfico modela el contorno de un territorio, quizá para planear un sistema de largos paseos o caminatas.

Página 2

Ing. Isis Espinosa Salazar

Fundamentos de Programación Orientada a Objetos

De igual forma que un mapa debe ser más pequeño significativamente que su territorio e incluye sólo información seleccionada cuidadosamente, así los modelos mentales abstraen esas características de un sistema requerido para nuestra comprensión, mientras ignoran características irrelevantes. Este proceso de abstracción es psicológicamente necesario y natural: la abstracción es crucial para comprender este complejo mundo. Un conjunto se puede definir por abstracción como una colección no ordenada de elementos en el que no existen duplicados. Utilizando esta definición, se puede especificar si sus elementos se almacenan en un arreglo, una lista enlazada o cualquier otra estructura de datos. Un vendedor de coches podría ver un coche desde el punto de vista de sus características de venta. Propiedades relevantes serían el precio, el color, el equipo opcional y la duración de la garantía. Por otro lado, un mecánico vería el coche desde el punto de vista de los sistemas que necesitan mantenimiento. Para él, propiedades relevantes serían el motor, sistema electrónico de encendido, tipo de aceite, el tamaño del filtro de aceite y el número y tipo de bujías. Las propiedades relevantes de un objeto vienen definidas por la forma en que se usa o manipula el objeto. Claramente las propiedades de un coche, importantes para un vendedor, son distintas de las de un mecánico. Enfocándose sobre las propiedades relevantes e ignorando los detalles irrelevantes, se puede reducir la complejidad de manejo de un objeto. Consideremos la tarea de encontrar un archivo en un disco y leer su contenido. Si tuviésemos que manejar todos los detalles de bajo nivel para saber cómo encontrar un archivo concreto en el disco y cómo leer sus contenidos, sería una tarea bastante difícil. Deberíamos comprender cómo se almacenan los datos en los discos y todos los mandatos de bajo nivel que controlan las operaciones del manejador de disco. Afortunadamente, existe un sistema de archivos que proporciona una visión abstracta de la información en un disco, de forma que se pueden ignorar los detalles de bajo nivel. Se puede acceder al archivo sin más que proporcionar su nombre. El sistema de archivos maneja los detalles de bajo nivel para leer los datos en el disco y devolverlos al programa. El arte de la programación es el método por el que se describirá a una computadora (mediante un lenguaje de programación) un fenómeno, una acción, un comportamiento o una idea. En general, un programa no es más que una descripción abstracta de un procedimiento o fenómeno que existe o sucede en el mundo real. Frecuentemente, un programa imita un comportamiento o acción humana; otras veces simula (es decir, reproduce) un fenómeno físico. Sin embargo, la relación entre abstracción y lenguaje de programación es doble: por un lado se utiliza el lenguaje de programación para escribir un programa que es una abstracción del mundo real; por otro lado se utiliza el lenguaje de programación para describir de un modo abstracto el comportamiento físico de la computadora que se está utilizando (por ejemplo, utilizando números decimales en lugar de números binarios, variables en lugar de celdas de memoria direccionadas explícitamente, etc.). En los primeros días de la informática, los programadores enviaban instrucciones binarias a una computadora, manipulando directamente interrupciones en sus paneles frontales. En la década de los cincuenta, los únicos mecanismos de abstracción eran el lenguaje de máquina y el lenguaje ensamblador. El lenguaje ensamblador ofrecía la posibilidad de utilizar mnemónicos, que eran abstracciones diseñadas para evitar que los programadores tuvieran que recordar las secuencias de bits que componen las instrucciones de un programa. Ofrece también la posibilidad de utilizar nombres simbólicos para representar celdas de memoria. El siguiente nivel de abstracción se consigue agrupando instrucciones primitivas para formar macroinstrucciones. Un conjunto de instrucciones realizadas por un usuario se pueden invocar por una macroinstrucción; una macroinstrucción instruye a la máquina para que realice muchas cosas. Tras los lenguajes de programación ensambladores aparecieron los lenguajes de programación de alto nivel, que supusieron un nuevo nivel de abstracción. Los lenguajes de programación de alto nivel permitieron a los programadores distanciarse de las características arquitectónicas específicas de una máquina dada. Cada instrucción en un lenguaje de alto nivel puede invocar varias instrucciones máquina, dependiendo de la máquina específica donde se compila el programa. Esta abstracción permitía a los programadores escribir software para propósito genérico, sin preocuparse sobre qué máquina ejecutaría el programa. Secuencias de sentencias de lenguajes de alto nivel se pueden agrupar en procedimientos y se invocan por una sentencia. El mundo en que vivimos se halla plagado de objetos: aviones, trenes, automóviles, teléfonos, libros, computadoras, etcétera. Sin embargo, en esa época las técnicas de programación no reflejaban esto. Lo procedural [procedimientos] fue el paradigma principal de la programación, el cual define un programa como un algoritmo escrito en algún lenguaje de programación. Las razones de este énfasis son principalmente históricas.

• •

• •

• •

• • •

• •

Página 3

Ing. Isis Espinosa Salazar

Fundamentos de Programación Orientada a Objetos

Desde la época de su desarrollo, durante los años cuarenta, las computadoras fueron utilizadas por los matemáticos con propósitos militares: el cálculo de trayectorias de bombas y la decodificación de transmisiones hecha por el enemigo o por diplomáticos son algunos ejemplos de estos propósitos. Después de la segunda guerra mundial, las computadoras todavía eran utilizadas, principalmente, por los matemáticos para resolver problemas con su disciplina. Este panorama se reflejó en el primer lenguaje de programación de alto nivel comercialmente disponible, el cual se introdujo en 1957. Este lenguaje fue FORTRAN, cuyas siglas son un acrónimo para FORmula TRANslation (traducción de fórmulas). Un reflejo adicional de este uso predominante es el hecho de que en los años sesenta casi todos los cursos de computación se impartían en los departamentos de ingeniería o matemáticas. El término de ciencia de la computación todavía no era de uso común y los departamentos de ciencia de la computación se encontraban en desarrollo. Esta situación sufrió un cambio drástico principalmente por dos razones. Una de las desventajas con los programas orientados a procedimientos es el fracaso de los lenguajes tradicionales basado en procedimientos en proporcionar medios adecuados para limitar el costo del software, lo cual incluye todos los costos asociados al desarrollo inicial del programa y su mantenimiento subsecuente. La inversión en sofware contribuye en gran medida a los costos totales del proyecto porque están relacionados directamente con la productividad humana (son sensibles al esfuerzo laboral), mientras que el costo asociado al hardware se relaciona con la tecnología de fabricación. Por ejemplo, los microchips que se adquirían por más de 500 dólares hace diez años, ahora se pueden comprar por menos de un dólar. Es mucho más fácil, aumentar drásticamente la productividad de fabricación en un 1000% con la consecuente reducción en costo del hardware, que los programadores dupliquen la cantidad o la calidad del código que producen. Si bien los costos del hardware se desplomaron, la productividad de software y los costos relacionados con su desarrollo permanecieron relativamente constantes. Otra de las desventajas de la programación basada en procedimientos fue la aparición de pantallas gráficas y el interes subsecuente en las aplicaciones utilizando ventanas. El acceso a una interfaz gráfica de usuarios (GUI) donde un usuario puede moverse con facilidad alrededor de una sola ventana es un desafío cuando se intenta lograrlo con un código procedural. La programación múltiple y las posibles ventanas que se traslapan en una misma pantalla gráfica simplemente aumenta la enorme complejidad cuando se utiliza código procedural. Las razones anteriores movitaron la búsqueda de nuevas soluciones o mejoras a la programación mediante procedimientos, lo que condujo a la programación estructurada.

• •

PROGRAMACION 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. Estructuras de control

Tal como los arquitectos diseñan edificios empleando la sabiduría colectiva de su profesión, así deberían los programadores diseñar sus programas. Nuestro campo es más joven que la arquitectura y nuestra sabiduría colectiva es considerablemente menor.

Página 4

Ing. Isis Espinosa Salazar

Fundamentos de Programación Orientada a Objetos

• • • • •

Aprendimos que la programación estructurada produce programas que son más fáciles de entender, probar, corregir, modificar, e incluso comprobar en el sentido matemático, que los programas que no están estructurados. La figura 1.1 utiliza diagramas de actividad (o de flujo) para resumir las estructuras de control. Los estados inicial y final indican la entrada y salida sencillas de cada estructura de control. Conectar de manera arbitraria símbolos individuales en un diagrama de actividad puede provocar que los programas no estén estructurados. Por lo tanto, la profesión de computación eligió un conjunto limitado de estructuras de control que se pueden combinar solamente de dos sencillas maneras para construir programas estructurados.

Figura 1.1. Estructuras de secuencia de entrada sencilla/salida sencilla, selección y repetición de C++.

• • • •

Por simplicidad, solamente se utilizan estructuras de entrada sencilla /salida sencilla; sólo existe una forma de entrar y una forma de salir de cada estructura de control. Conectar estructuras de control en secuencia para formar programas estructurados es sencillo, el estado final de una estructura de control se conecta con el estado inicial de la siguiente estructura de control, esto es, las estructuras de control se colocan una sobre la otra en el programa. A esto le llamamos apilar estructuras de control. Las reglas para formar programas estructurados permiten, además, anidar estructuras de control. La figura 1.2 muestra las reglas para formar programas estructurados. Además, las reglas suponen que comenzamos con el diagrama de actividad más sencillo (figura 1.3), el cual consiste solamente en un estado inicial, un estado de acción, un estado final y flechas de transición.

Página 5

Ing. Isis Espinosa Salazar

• • • • Aplicando las reglas de la figura 1. de manera que llamaremos a la regla 2 la regla del apilado. en cualquier orden. Página 6 Ing. • • • • • La regla 3 se llama regla de anidamiento. Por ejemplo. Las utilizamos para separar los cuatro diagramas de actividad que muestran la aplicación de la regla 2 de la figura 1. La regla 2 genera una pila de estructuras de control. [Nota: Las líneas verticales punteadas de la figura 1.3). Cualquier estado de acción se puede representar mediante cualquier estructura de control (secuencia.2 al diagrama de actividad más sencillo. Al aplicar de manera repetida la regla 3 al diagrama de actividad más sencillo. Entonces.3. al aplicar de manera repetida la regla 2 al diagrama de actividad más sencillo.4).4. Reglas para formar programas estructurados. Los símbolos punteados de estados de acción alrededor de cada una de las estructuras de selección doble representan el estado de acción que se reemplazó en el diagrama de actividad más simple original. provoca un diagrama de actividad que contiene muchos estados de acción en secuencia (figura 1. Por ejemplo. Las reglas 2 y 3 se pueden aplicar con la frecuencia que usted desee. Isis Espinosa Salazar . y reemplaza cada uno de estos estados de acción con una estructura de selección doble. provoca un diagrama de actividad con estructuras de control anidadas más pulcras. Comience con el diagrama de actividad más sencillo (figura 1. 4. 3. if/else. Figura 1. if.5 el estado de acción del diagrama de actividad más sencillo se reemplaza con una estructura de selección doble (if/else). Diagrama de actividad más sencillo. Figura 1. while. switch.] Figura 1. Cualquier estado de acción se puede reemplazar por dos estados de acción en secuencia. en la figura 1.2 se produce un diagrama de actividad con la apariencia de una cuidadosa construcción con bloques.2. Aplicación repetida de la regla 2 de la figura 1.Fundamentos de Programación Orientada a Objetos Reglas para formar programas estructurados 1.2.4 no son parte del UML. do/while o for). 2. la regla 3 se aplica de nuevo a los estados de acción en la estructura de selección doble.

5 no son parte del UML. Figura 1. aplique las reglas de la figura 1. Los diagramas que surgen de la aplicación de las reglas de la figura 1. Aplicación repetida de la regla 3 de la figura 1. Aquí los utilizamos como ayudas pedagógicas para mostrar que cualquier estado de acción se puede representar mediante una estructura de control]. no se puede escribir un diagrama de actividad con sintaxis incorrecta (tal como el de la figura 1.2. Isis Espinosa Salazar . Si el diagrama se reduce al diagrama de actividad más sencillo. La belleza del método estructurado es que utilizamos sólo siete estructuras de control de entrada sencilla/salida sencilla y las ensamblamos solamente de dos maneras posibles. el conjunto de todos los posibles programas estructurados. para reducir el diagrama al diagrama de actividad más sencillo. no lo está.Fundamentos de Programación Orientada a Objetos • [Nota: Las flechas punteadas y los símbolos de estados de acción punteados que aparecen en la figura 1. el original está estructurado. Si no está seguro de si un diagrama en particular es correcto.6). Si se siguen las reglas de la figura 1.2 al diagrama de actividad más sencillo • • • • • La regla 4 genera estructuras anidadas más grandes.2 constituyen un conjunto de todos los diagramas de actividad posibles y. Página 7 Ing. de lo contrario. por lo tanto. más involucradas y más profundas.2 a la inversa.5.

la programación estructurada promueve la simplicidad. Todo lo que se puede hacer con una estructura do/while y con la estructura for. estructura if (selección). Simplemente liste las instrucciones a ejecutar. • • La estructura de secuencia es trivial. apiladas o anidadas. Repetición. en el orden en el que se deben ejecutar: La selección se implementa en una de estas tres maneras: ‰ ‰ ‰ Estructura if (selección simple). Isis Espinosa Salazar . Diagrama de actividad con sintaxis no permitida. La combinación de estos resultados muestra que cualquier forma de control necesaria en un programa en C++ se puede expresar en términos de las siguientes estructuras de control: • ‰ ‰ ‰ secuencia. están compuestas por estructuras de control.Fundamentos de Programación Orientada a Objetos Figura 1. En realidad. La repetición se implementa en una de estas tres formas: ‰ ‰ ‰ estructura while. Veremos a continuación otra unidad de programación estructurada llamada función. estructura for. Selección. todo lo que se puede hacer con la estructura if/else y la estructura switch se puede implementar mediante la combinación de estructuras if (aunque quizá no sea tan claro y eficiente). Estructura switch (selección múltiple). La programación estructurada alienta el uso de abstracciones de control. tales como ciclos. Resumiendo Los resultados de Bohm y Jacopini indican que sólo se necesitan tres formas de estructuras de control: • ‰ ‰ ‰ Secuencia. sentencias if-then. Nuestro objetivo es explicar cómo crear programas a partir de estructuras de control que contienen estados de acción y decisión. estructura while (repetición). se puede hacer con la estructura while (aunque quizá no de manera sencilla). • • • Página 8 Ing. estructura do/while. a su vez. Estructura if/else (selección doble). es bastante sencillo probar que la estructura if sencilla es suficiente para proporcionar cualquier forma de selección.6. • • De hecho. • Estas estructuras de control se pueden combinar solamente de dos maneras. Aprenderemos a crear programas grandes mediante la combinación de funciones que. que se han incorporado en lenguajes de alto nivel. • Es sencillo probar que la estructura while es suficiente para proporcionar cualquier forma de repetición. Estas sentencias de control permitieron a los programadores abstraer las condiciones comunes para cambiar la secuencia de ejecución. También explicaremos cómo es que las funciones promueven la reutilización del software.

o son ejecutadas con ligeras variaciones. que se reunen en una entidad y se reutilizan. sus distintos componentes. sólo necesitaban el interfaz necesario. pero que tienen conexiones con otros módulos. Las funciones permiten realizar tareas que se ejecutaban repetidamente. Una clasificación de objetos basada en alguna relación entre ellos es una jerarquía. de funcionamiento más sencillo. como indica Liskov. consiste en dividir un programa en módulos que se puedan compilar por separado. El criterio a seguir en la construcción de un módulo es que si no se necesita algún tipo de información. Un módulo es una técnica que proporciona la posibilidad de dividir sus datos y procedimientos en una parte privada sólo accesible dentro del módulo. En particular. La modularización. La jerarquía de la compañía ayuda a los empleados a comprender la estructura de su compañía y su relación dentro de ella.y parte pública -accesible fuera del módulo-. Para resolver este problema se ha desarrollado un mecanismo de estructuración diferente. no se debe tener acceso a ella. El diagrama muestra la jerarquía de empleados basándose en la relación de quién informa a quién. La modularidad reduce el tiempo para probar el coche y la probabilidad de que un coche sea montado con un defecto. Por otra parte. Se pueden definir tipos. Por ejemplo. tampoco resuelve el problema que se produce al trabajar múltiples programadores con nombres de procedimientos idénticos. Un programador puede escribir un procedimiento o conjunto de procedimientos que utilizan otros programadores. la transmisión y el radio. • • • • • • • Página 9 Ing. La mayoría de los sistemas complejos son modulares. Están construidos combinando componentes o paquetes. En computación la modularidad es la propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos). para que algún objetivo sea más fácil de conseguir. Las jerarquías también ayudan a comprender sistemas y organizaciones complejas. Sin embargo. Este criterio es el ocultamiento de la información. datos (variables y procedimientos) en cualquiera de las dos partes. Estos programadores no necesitaban conocer con exactitud los detalles de la implementación. Como se verá la modularidad es la propiedad de un sistema que permite su descomposición en un conjunto de módulos cohesivos y débilmente acoplados. han sido ya probados individualmente. en lugar de duplicar el código varias veces. Una adecuada modularización de un sistema complejo también ayuda a manejar su complejidad. se podría dividir un sistema complejo en componentes. Dividir las cosas en piezas más pequeñas y más sencillas de entender hace que un sistema grande sea más sencillo de comprender. Cuando se monta un automóvil. las funciones no resuelven todos los problemas. tales como el motor.7 incluye un diagrama de organización de una compañía típica.Fundamentos de Programación Orientada a Objetos Funciones • • • Las funciones o procedimientos fueron uno de los primeros mecanismos de abstracción que se utilizaron ampliamente en los lenguajes de programación. Isis Espinosa Salazar . La figura 1. no es un mecanismo efectivo para ocultar la información. el concepto de función proporcionó la primera posibilidad de ocultamiento de la información. Módulos • • • La modularidad se refiere al proceso de dividir un objeto en piezas más pequeñas. cada una de ellas debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. o módulos. de forma que cada componente pueda ser probado de forma individual.

en sistemas complejos compuestos de abstracciones.8. En un programa estructurado es suficiente conocer que un procedimiento dado realiza una tarea específica. Un concepto importante introducido con la programación estructurada. que se puede definir como la capacidad para examinar algo sin preocuparse de sus datos internos. sino conocer cómo se utiliza correctamente la función y lo que hace. Esta división permite escribir código más claro y mantener el control sobre cada función. que realizan tareas menos complejas. • • • • Funciones Función1 Función2 Función3 Función4 Función11 Función21 Función22 Función31 Función41 Función42 Función221 Función311 Función411 Figura 1. Tal jerarquía hace que las abstracciones sean más fáciles de entender porque expone la relación entre características y comportamientos comunes. ya comentado anteriormente. Programa estructurado. descendente.Fundamentos de Programación Orientada a Objetos Director Director de ventas Tesorero Director de investigación Director de operaciones Gerente ventas zona Jefe científico Desarrollo de lenguajes de programación Desarrollo sistema Desarrollo de aplicaciones Gerente de patentes Gerente de ventas zona Investigación de patentes Gerente ventas zona Aplicación de patentes Gerente ventas zona Figura 1. conocidas como funciones (subrutinas. subprogramas o procedimientos). Diagrama de la organización de una compañía • Los científicos han usado esta técnica desde hace mucho tiempo para identificar y clasificar especies del reino animal y vegetal. Isis Espinosa Salazar . Página 10 Ing.7. El cómo se realiza esta tarea no es importante. es el de abstracción. Un orden jerárquico basado en las relaciones de la naturaleza se denomina taxonomía. o refinamiento sucesivo comienza descomponiendo el programa en piezas manejables más pequeñas. Una forma de ordenar abstracciones similares. • Un programa estructurado se construye rompiendo el programa en funciones. es ir del concepto más general al menos general. La técnica top-down.

se añaden nuevos datos. En un programa estructurado. Esta tarea puede ser frustrante y consumir un tiempo considerable en programas con millones de líneas de código y miles de funciones. se necesitará modificar todas las funciones que accedan a los datos. El sistema de números complejos no será útil con esta restricción. los datos locales se ocultan dentro de funciones y los datos compartidos se pasan como argumentos (Fig. también crece su independencia de los tipos de datos fundamentales que procesa. 1. resta. Se presenta un problema: sólo puede manipular un número complejo.Fundamentos de Programación Orientada a Objetos • • • Los módulos resuelven algunos problemas. Isis Espinosa Salazar . las modificaciones se deben hacer en cada sentencia que actúa sobre esos tipos de datos dentro del programa. pero ¿qué sucede si otros usuarios desean tener dos o más pilas? Supongamos que un programador ha desarrollado un tipo de dato complejo o (representación de un número complejo) y ha definido las operaciones aritméticas sobre números complejos -suma. pero es la situación en que se encuentra el programador con módulos simples. En un programa estructurado. el medio en que se almacenan los datos se hace más crítico. los módulos permitirán a nuestros programadores ocultar los detalles de la implementación de su pila. que es la capacidad de hacer múltiples copias de las zonas de datos. por cualquier función Variables locales Variables locales Función A Accesible sólo por función A Función B Accesible sólo por función B Figura 1. las estructuras de datos de un programa son tan importantes como las operaciones realizadas sobre ellas. • • • • • • Variables globales Accesibles. Por ejemplo. Página 11 Ing. La disposición de los datos no se puede cambiar sin modificar todas las funciones que accedan a ellos. por ejemplo. de modo que ellos puedan también acceder a esos elementos. multiplicación y división-. Los tipos de datos se procesan en muchas funciones dentro de un programa estructurado. Los módulos proporcionan un método efectivo de ocultamiento de la información.9. asimismo ha definido rutinas para convertir números convencionales a complejos. A medida que la complejidad de un programa crece.9). Si. y cuando se producen cambios en esos tipos de datos. Variables globales y locales. • • Dado que muchas funciones acceden a los mismos datos. Esto se hace más evidente a medida que crece un programa en tamaño. pero no todos los problemas del desarrollo de software. pero no permiten realizar instanciación.

caracteres. ¿Qué funciones se necesitarán? ¿Qué estructuras de datos? La solución sería más aproximada si hubiera una correspondencia lo más estrecha posible entre los menús y ventanas y sus correspondientes elementos de programa. Los lenguajes de programación típicamente tienen tipos de datos incorporados: enteros. Uno de los resultados más tangibles de esta investigación fue el desarrollo del lenguaje de programación estructurado Pascal por Niklaus Wirth. Los lenguajes tradicionales normalmente no son extensibles. el lenguaje carecía de muchas de las características necesarias para poder utilizarse en aplicaciones comerciales. Esto es. etc. y eso hace que los programas tradicionales sean más complejos de escribir y mantener. Desventajas de la programación estructurada • • • • • • • Los programas basados en funciones son difíciles de diseñar. industriales y gubernamentales. fue diseñado para la enseñanza de la programación estructurada en ambientes académicos. los lenguajes tradicionales presentan dificultad en la creación de nuevos tipos de datos. Desafortunadamente. Aunque los programas estructurados son más fáciles de diseñar en grupo. los errores de comunicación entre miembros de equipos pueden conducir a gastar tiempo en reescrituración. ventanas. Por otra parte. es un componente que realiza una tarea específica. El problema es que sus componentes principales funciones y estructuras de datos. En resumen. los cambios que un programador hace a los datos se deben reflejar en el trabajo del resto del equipo. en 1971. tal como convertir un conjunto de números o visualizar una ventana. Cuando diferentes programadores trabajan en equipo para diseñar una aplicación.Fundamentos de Programación Orientada a Objetos Datos globales Datos globales Datos globales Función1 Función2 Función3 Función4 Figura 1. Cada procedimiento actúa como una caja negra. supongamos que se está escribiendo un programa para crear los elementos de un interfaz gráfico de usuario: menús. cuyo nombre se debe al aniversario de los setecientos años del nacimiento del filósofo y matemático Blas Pascal. Este procedimiento permite empaquetar código programa en funciones.no modelan bien el mundo real. convirtiéndose en el lenguaje de programación favorito en varias universidades.10. punto flotante. Dado que los diferentes programadores manipulan funciones independientes que relacionan a tipos de datos compartidos mutuamente. ¿Cómo crear sus propios tipos de datos? Los tipos definidos por el usuario y la facilidad para crear tipos abstractos de datos en determinados lenguajes es la propiedad conocida como extensibilidad. Descomposición de un programa en módulos (funciones) Resumiendo La programación estructurada se emplea desde el principio de la década de los setenta y es uno de los métodos más utilizados en el campo de la programación. a cada programador se le asigna la construcción de un conjunto específico de funciones y tipos de datos. Pascal. etc. Por ejemplo. con los métodos tradicionales. pero ¿qué sucede con los datos? Las estructuras de datos utilizadas en programas son con frecuencia globales o se pasan explícitamente como parámetros. Una forma para aumentar significativamente la productividad del programador consiste en crear un código que se • • • • • • Página 12 Ing. Isis Espinosa Salazar . un programa se divide en dos componentes: procedimientos y datos. cuadros de diálogo. de manera que no ha sido muy aceptado fuera de las universidades.

Sin embargo. Esta complejidad se deriva de dos elementos: • • ‰ ‰ La complejidad del dominio del problema La dificultad de gestionar el proceso de desarrollo (la interacción entre componentes) Página 13 Ing.Fundamentos de Programación Orientada a Objetos pueda reutilizar sin realizar una revisión extensiva y sin volver a probarlo y evaluarlo. La incapacidad del código estructurado en base a procedimientos. no han existido avances de la misma magnitud en el diseño de software. Isis Espinosa Salazar . se incrementa su complejidad interna. tener computadoras rápidas y baratas es sólo la mitad de la ecuación. el incremento de la complejidad del software. Tales sistemas de representación automática son mucho más fáciles de usar. Actualmente las nuevas herramientas para hojas de cálculo contienen sistemas expertos. baratas y más potentes. PROGRAMACION ORIENTADA A OBJETOS • Para entender mejor la programación orientada a objetos. se han convertido en herramientas indispensables para científicos e ingenieros. haremos un breve estudio sobre las causas fundamentales que llevaron a cabo la creación de la misma. Esencialmente. Quizá lo más importante es que se han vuelto parte de nuestra vida. hay complejidad!). pero esta facilidad tiene un precio. cómo y dónde habría que colocar las etiquetas. dando información tan variada como los puntos finales del gráfico. para proporcionar su reutilización condujo a la búsqueda de otros enfoques de software. el usuario tenía que hacer la mayor parte del trabajo. Se dice que la complejidad del software es una propiedad esencial no accidental (¡si hay software. los primeros sistemas gráficos necesitaban que los usuarios especificaran detalles de cómo debería verse el gráfico. Parte del problema es que las expectativas para el software han crecido considerablemente. A medida que el software es más fácil de usar.11 muestra lo que se conoce como paradoja de la complejidad: la complejidad del sistema crece a medida que se intenta hacer más fácil su uso. la escala. La figura 1. Alta Complejidad total del software Complejidad Sencillez para el usuario Baja Figura 1.11. • • Por ejemplo. Aunque ha habido tremendos avances en el campo del hardware. Podemos resumir como causas principales las siguientes: ‰ ‰ ‰ La complejidad inherente al software La crisis del software Los Factores de la calidad del software La complejidad inherente al software • • • A medida que las computadoras se han vuelto más rápidas. que analizan los datos y producen un gráfico de forma automática.

Esta característica se facilita descomponiendo nuestras implementación en centenares y a veces millones de módulos independientes. ‰ La dificultad de gestionar el proceso de desarrollo • • • • • • El tamaño de un programa no es una gran virtud en un sistema de software. la realidad sugiere que un porcentaje alto de los recursos de desarrollo de software se gastan en la conservación del software. están abiertos a diferentes interpretaciones y con frecuencia contienen elementos que son diseños en lugar de requisitos esenciales. Desgraciadamente. el corrector debe notificarlo al usuario. en ocasiones acompañados por esquemas y dibujos. Por lo tanto. Sin embargo. ‰ ‰ Los requisitos de un sistema de software cambian durante su desarrollo. en muchas ocasiones contradictorios. Hoy es usual encontrar sistemas en funcionamiento cuyo tamaño se mide en cientos de miles o incluso millones de líneas de código. el corrector puede corregirlo. Por ejemplo. Cuando se detecta un posible error de ortografía. El medio común de expresar los requisitos hoy en día es utilizar un gran volumen de textos. En casos extremos los usuarios suelen tener sólo ideas vagas de lo que desean que haga el sistema. si se debe hacer algo. un procesador de texto puede contener un componente para corrección ortográfica y otro que proporcione servicios de diccionario de sinónimos. Los usuarios y desarrolladores tienen diferentes perspectivas de la naturaleza del problema y hacen suposiciones diferentes sobre la naturaleza de la solución. Esto supone que un sistema grande tiende a evolucionar con el tiempo y el mantenimiento del software en ocasiones es un término que no siempre está bien acuñado. Consideremos el corrector ortográfico. procesadores de texto y programas de dibujo. No es inusual que los programas de aplicación. a medida que el número de componentes crece. consten de cientos de miles de líneas de código.Fundamentos de Programación Orientada a Objetos La complejidad del dominio del problema • • Los problemas a resolver mediante software implican normalmente elementos ineludibles de complejidad. la elaboración de un programa de gran dimensión requiere la escritura de grandes cantidades de nuevo software y la reutilización del software existente. el número de interacciones entre componentes crece rápidamente. el corrector debe interaccionar con el componente del procesador de texto responsable de reemplazar texto en el documento. Para hacer la corrección. Para ser más preciso. el corrector ortográfico. Isis Espinosa Salazar . en la que se encuentran una gran cantidad de requisitos. Otro factor que incrementa la complejidad es la interacción entre componentes. de forma que el posible error pueda mostrarse en pantalla y que se pueda preguntar al usuario acerca de la acción a ejecutar. la evolución que responde a cambios de requisitos y la conservación cuando se utilizan medios para mantener piezas de software en funcionamiento. Esta complejidad se produce por: ‰ Las difíciles interacciones entre los usuarios de un sistema y sus desarrolladores. tales como las hojas de cálculo. Si el usuario está de acuerdo en que hay un error ortográfico. Recordemos que hace dos o tres décadas los programas en lenguaje ensamblador se construían a base de centenares de líneas. Tales documentos son difíciles de comprender. debe relacionarse con el componente de la aplicación que crea una ventana o caja de diálogo. Obviamente. ‰ Los usuarios encuentran generalmente muy difícil precisar sus necesidades de forma que los desarrolladores puedan comprender. Página 14 Ing. existen diferentes términos a definir: El mantenimiento que busca errores.

el costo de desarrollo y mantenimiento del software no debería exceder el beneficio esperado por la venta del producto. las modificaciones de los sistemas complejos. Por el contrario. Un componente muy relacionado con el costo es el tiempo que se necesita para diseñar y construir el software. Este proceso se llama mantenimiento del software. Este costo puede reducirse cuando el diseño y el funcionamiento del sistema son comprensibles. • • • • • • • • • • • • • • • • Un software debería ser fiable. Aunque la falla de un procesador de textos es molesta. el software debería ser adaptable. se podrán llevar a cabo. Isis Espinosa Salazar . es decir. aunque difíciles.Fundamentos de Programación Orientada a Objetos Ingeniería de Software • La Ingeniería de Software es el área de la computación que tiene que ver con las técnicas de construcción de software de gran tamaño. lograr que la operación y el diseño del sistema sean fácilmente entendibles por otros profesionales del software. Rentable. A menudo. La construcción del software irá mejor y con menos errores si todo el mundo que trabaja en la aplicación entiende la operatividad global del sistema y sus componentes. Adaptable. Si la próxima generación de Ingenieros del Software comprende cómo funciona. Es decir. Ejemplos de este tipo de sistemas son los aviones militares y civiles. La comprensibilidad es también muy importante debido a la larga vida del software. debería funcionar correctamente y sin fallas. Ser el primero en introducir un producto en el mercado da a una compañía una decidida ventaja sobre sus competidores. Por la discusión previa. Un sistema de seguridad crítico es aquel en el que una falla podría significar la pérdida de una vida humana. es difícil predecir qué características y capacidades pueden querer los clientes del software. Por el alto costo de desarrollo. la pérdida es insignificante comparada con la pérdida potencial cuando falla un sistema crítico: las vidas humanas. Un producto de software suele evolucionar con el tiempo y a menudo Ingenieros del Software. Reducir el tiempo para desarrollar un producto puede reducir costos y por lo tanto. los expertos estiman que el 67% del costo de desarrollo del software se dedica al mantenimiento. que no tienen nada que ver con el producto original. Reutilizable. El mantenimiento adaptativo involucra cambios y añadiduras al software que mejoran la efectividad o competitividad del producto. La comprensibilidad es muy importante porque los software de gran tamaño son construidos por muchas personas agrupadas en equipos de trabajo. son los que se encargan de introducir mejoras y arreglar los errores del producto. es más económico reconstruir el sistema desde el principio. tiene sentido hacer sus componentes flexibles de forma que puedan ser reutilizados cuando se desarrolle Página 15 Ing. Examinemos cada una de estas propiedades. Una forma de conseguir que el software sea más fiable es hacerlo más fácil de comprender o comprensible. el software debería ser reutilizable. incrementar los beneficios. Sin duda. el Ingeniero del Software puede reducir los costos de mantenimiento global. A menudo. Muchas compañías de software han ido a la bancarrota por haber subestimado los costos de desarrollo de un sistema. Comprensible. Debido a la larga vida del software. Si se ha de gastar muchos millones de dólares en un software. Es decir. cuando lo tiene casi terminado. Diseñando software al que puedan añadir fácilmente en el futuro nuevas características y capacidades. Imagine que ha pasado varias horas escribiendo un texto para un curso en un procesador de textos y. es extremadamente difícil hacer modificaciones o correcciones para un sistema pobremente diseñado. se puede ver que un software debería ser rentable. las máquinas de terapia radioactiva y los marcapasos. Como medida de la dificultad del mantenimiento del software. Se pierde todo su trabajo. Una falla del software en cualquiera de estos sistemas podría tener consecuencias desastrosas. estaría muy enfadado y tendría todo el derecho a estarlo. El objetivo de un Ingeniero de Software es producir un software que sea: ‰ ‰ ‰ ‰ ‰ Fiable. el procesador de textos falla de forma inesperada.

es el proceso de separar los aspectos de un objeto en externos e internos. es conveniente comprender que los tipos abstractos de datos es uno de los conceptos más interesantes de la abstracción. el principio de encapsulamiento u ocultamiento de la información tiene características mucho más poderosas que las que se realizan en la programación estructurada. este proceso de descomposición se extiende a la fase de implementación. Los usuarios pueden crear variables con valores que están en el rango de valores legales y pueden operar sobre esos valores utilizando las operaciones definidas. Para construir un tipo abstracto de datos se debe poder: ‰ ‰ ‰ ‰ Exponer una definición del tipo. Por ejemplo. en el caso de una pila se puede definir dicha pila como un tipo abstracto de datos y las operaciones sobre la pila como las únicas operaciones legales que están permitidas para ser realizadas sobre instancias de la pila. aclaremos un poco más estos conceptos. reducir los costos de desarrollo y mejorar el mantenimiento. Página 16 Ing. un tipo abstracto de dato corresponde a un conjunto (puede ser de tamaño indefinido) de valores legales de datos y un número de operaciones primitivas que se pueden realizar sobre esos valores. Esta estrategia es ciertamente una práctica frecuente en otros negocios. ya que los objetos en el dominio de la aplicación se corresponden directamente con los objetos en el dominio del software. no se necesita conocer nada de ingeniería eléctrica. Isis Espinosa Salazar . Ahora bien. aunque se trata por todos los medios de que este equipo sea lo más pequeño posible. El tipo abstracto de datos es un concepto más teórico. La reutilización puede mejorar la fiabilidad. • • Los módulos son mecanismos de ocultamiento de información y no cumplen básicamente más que los apartados 1 y 2. e incluso con coordinación difícil entre ellos. se producen comunicaciones entre ellos mas complejas. Los aspectos externos de un objeto deben ser visibles o conocidos. sin embargo. • La cantidad de trabajo que conlleva exige el uso de un equipo de desarrolladores. Es más fácil diseñar e implementar aplicaciones orientadas a objetos. El encapsulamiento u ocultamiento de la información. Esencialmente. Modularidad.Fundamentos de Programación Orientada a Objetos un nuevo sistema. La descomposición de una aplicación en entidades y relaciones que son significativas a los usuarios es un análisis convencional con técnicas de diseño. Los Ingenieros del Software han desarrollado un cierto número de principios de diseño que ayudan a llevar a cabo los objetivos marcados en la sección anterior gestionando la inevitable complejidad del software de sistemas grandes. Proteger los datos asociados con el tipo de modo que sólo se pueda actuar sobre ellos con las rutinas proporcionadas. Los módulos se utilizan frecuentemente como una técnica de implementación para tipos abstractos de datos. Permitir instancias múltiples del tipo. Con la programación orientada a objetos. para otros objetos del sistema. Ocultar ciertos aspectos de un objeto permite modificarlos sin afectar a otras partes del sistema. Al igual que los tipos definidos por el sistema. particularmente si el equipo está disperso geográficamente. el radio puede verse como una caja negra con botones y cables. Encapsulamiento u ocultamiento de la información. a medida que hay mas desarrolladores. los altavoces y la antena. estos principios son: Principios de diseño en Ingeniería de Software • • • • ‰ ‰ ‰ Abstracción. Los aspectos internos son los detalles del funcionamiento del radio. • • • • • Un Tipo Abstracto de Dato (TAD) es un tipo de dato definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el sistema. Para instalar y usar el radio en un coche. Por ejemplo. Los aspectos internos son detalles que no deberían afectar a otras partes del sistema. los aspectos externos del radio de un coche son los controles y los tipos de conexiones necesarios para conectar el radio al sistema eléctrico. como suele ser el caso de proyectos grandes. Hacer disponible un conjunto de operaciones que se puedan utilizar para manipular instancias de ese tipo. Estos principios de diseño de la Ingeniería de Software ya han sido tratados en otra parte de estas notas.

Con estos términos se quería expresar que el software era caro. es el proceso de ocultar todos los secretos de un objeto que no contribuyen a sus características esenciales. aunque en otro tiempo fue despreciada su importancia. Cuando se aplica al diseño de sistemas de software. Pese a las muchas herramientas y métodos utilizados. en esencia. se puede quitar el radio viejo.12. poco fiable y escaso. Entre las diferentes fases del ciclo de vida del software (Figura 1. Se puede reemplazar la radio de un coche por un reproductor de CD sin afectar a otros componentes del vehículo. el encapsulamiento permite que se pueda cambiar el comportamiento interno de un componente software sin afectar a otros aspectos del sistema. En la práctica. asumió los términos ingeniería del software y crisis del software. los problemas del diseño descendentes permanecen igual. Ciclo de vida del software Página 17 Ing. esto significa que cada clase debe tener dos partes: un interfaz y una implementación. este cambio no debería afectar a la forma en que los usuarios acceden al sistema y dictan o leen mensajes. La crisis del software • • • • • • En 1968 una conferencia sobre software.12). así como los mecanismos que realizan el comportamiento deseado. El encapsulamiento permite la división de un programa en módulos. Las metodologías y técnicas estructuradas que han reinado en la década de los setenta y ochenta no han eliminado el problema. El encapsulamiento (también se conoce como ocultamiento de la información). El interfaz de una clase captura sólo su vista externa y la implementación contiene la representación de la abstracción. Estos módulos se implementan mediante clases. se considera actualmente como uno de los problemas más graves en el desarrollo del software. de forma que una clase representa el encapsulamiento de una abstracción. posiblemente debido a que la complejidad del problema ha crecido considerablemente. Análisis Diseño Implementación Depuración Mantenimiento Figura 1. si el principio de encapsulamiento ha sido aplicado correctamente a un sistema automático de correo de voz. insertar el nuevo y conectarlo. de hecho la crisis del software continúa hoy en día. Si el sistema de almacenamiento de mensajes ha sido debidamente ocultado y aislado. Isis Espinosa Salazar . el mantenimiento. debería ser capaz de cambiar el componente que se encarga de almacenar los mensajes sin afectar a otras partes del sistema. Muchos investigadores sugieren que los costos del mantenimiento requieren más de la mitad de los costos y recursos globales del desarrollo total del software.Fundamentos de Programación Orientada a Objetos • • • • • • El 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. Debido a que el manejo de la radio ha sido encapsulado y su vista externa está definida mediante controles y conectores. Un gran beneficio del ocultamiento de información es que ayuda a hacer cambios en sistemas complejos. patrocinada por la OTAN. Se podría incrementar el número de mensajes que un usuario puede almacenar. Por ejemplo.

En respuesta al artículo de Brooks. apuntaba que en los últimos diez años no se había producido ningún progreso significativo en el desarrollo de software. el inventor de Objective-C. siendo por consiguiente una parte esencial de esta revolución. Página 18 Ing. de modo similar a la construcción de cualquier objeto complejo (tal como un automóvil) que se construye ensamblando sus partes. en un famoso artículo. Es un arma tremendamente potente. • • Los cambios realizados en la evolución de un programa son el punto débil de los métodos tradicionales de desarrollo de software.13. las propuestas de reusabilidad o reutilización. la POO (Programación Orientada a Objetos) no sólo son nuevos lenguajes de programación. Es un nuevo paradigma. siendo paradójicamente uno de los puntos fuertes de los métodos de desarrollo de software orientado a objetos. una revolución industrial basada en partes reutilizables e intercambiables que modificarán el universo del software. de componentes software. • • Por consiguiente. Brooks. Costos de las diferentes fases del ciclo de vida de un proyecto software. se consideran como bloques iniciales para la construcción del programa. y analizaba críticamente todas las tecnologías más prometedoras. de igual modo que la revolución industrial cambió la fabricación. el lenguaje debe ser capaz de soportar el nuevo paradigma. Brad Cox. mantenía dudas sobre sus ventajas efectivas.Fundamentos de Programación Orientada a Objetos Análisis 6% Diseño 5% Implementación 7% Depuración 15 % Mantenimiento 67% Figura 1. publicó un artículo en el que esencialmente rebatía las tesis de Brooks: • • Existe una bala de plata. En 1986. Recientemente. Isis Espinosa Salazar . La bala de plata es un cambio cultural en lugar de un cambio tecnológico. Aunque él confesaba que tenía más confianza en la programación orientada a objetos que en cualquier otra tecnología. impulsada por vastas fuerzas económicas a la que nuevos obstáculos técnicos sólo pueden resistir brevemente. Fredrick P. sino un nuevo modo de pensar y diseñar aplicaciones que pueden ayudar a resolver problemas que afectan al desarrollo del software. Sin embargo.

Existen dos principios fundamentales para conseguir esto: ‰ ‰ diseño simple descentralización • • Reutilización Capacidad de los productos para ser reutilizados. Corrección Capacidad de los productos software de realizar exactamente las tareas definidas por su especificación. Página 19 Ing. en su totalidad o en parte. Fácil de utilizar Un software es fácil de utilizar si se puede comunicar con él de manera cómoda. Compatibilidad Facilidad de los productos para ser combinados con otros. en nuevas aplicaciones. Robustez Capacidad de los productos software de funcionar incluso en situaciones anormales. Transportabilidad (portabilidad) La transportabilidad o portabilidad es la facilidad con la que un software puede ser transportado sobre diferentes sistemas físicos o lógicos. Isis Espinosa Salazar . Extensibilidad Facilidad que tienen los productos de adaptarse a cambios en su especificación. Verificabilidad La verificabilidad es facilidad de verificación de un software. es su capacidad para soportar los procedimientos de validación y de aceptar juegos de pruebas o ensayos de programas. Integridad La integridad es la capacidad de un software para proteger sus propios componentes contra los procesos que no tengan derecho de acceso. Entre ellas se destacan las siguientes: • • • • • • • • Eficiencia La eficiencia del software es su capacidad para hacer un buen uso de los recursos que manipula.Fundamentos de Programación Orientada a Objetos Los factores de la calidad del software La construcción de software de calidad requiere el cumplimiento de numerosas características.

En un determinado sentido. y cuyas clases son todas miembros de una jerarquía de clases unidas mediante relaciones de herencia. en lugar de cosas u objetos (sustantivos). C++. Algunos autores de libros aún recuerdan la gran frustración que sentían las empresas de desarrollo de software. las entidades de software creadas (llamadas clases). pasando por las funciones o procedimientos. • • • • • • • • Página 20 Ing. etc. estas unidades no son particularmente reutilizables. como bloques de construcción lógicos (jerarquía de objetos). ya que tiene que reinventar las cosas repetidamente. En la actualidad la programación orientada a objetos se ha hecho enormemente popular. los programadores siguen viviendo en un mundo orientado a objetos y pueden programar de una manera orientada a objetos. autor del méto Booch de diseño orientado a objetos muy popular en la década de los noventa. Era difícil poner a punto este software. es decir. que viven en un mundo de objetos. El software es un asunto complejo. la década de la programación orientada a objetos. cada uno de los cuales representan una instancia de alguna clase. bases de datos. sin lugar a dudas. así como cumplir con los requerimientos de Ingeniería de sofware y los factores de calidad. Mediante la tecnología de objetos. Grady Booch. y 3) las clases se relacionan unas con otras por medio de relaciones de herencia. si se diseñan apropiadamente tienden a ser mucho más reutilizables en proyectos futuros. el desarrollo de sistemas operativos con tiempo compartido y memoria virtual. define la programación orientada a objetos (POO) como: ƒ Un método de implementación en el que los programas se organizan como colecciones cooperativas de objetos. • • Existen tres importantes partes en la definición: la programación orientada a objeteos 1) utiliza objetos. junto a compañías importantes en el campo del software. Ahora.. Object Pascal. Este cambio de paradigma complicó la escritura de programas. los módulos.Fundamentos de Programación Orientada a Objetos Para poder enfrentar todos los problemas anteriores. etc. las técnicas orientadas a objetos pueden verse como un producto natural de una larga progresión histórica que va desde las estructuras de control. Como Rentsch predijo. cómo se puede estructurar información en una computadora. se hace necesario el desarrollo de una nueva forma de pensar y de desarrollar programas. la programación orientada a objetos será en los ochenta lo que la programación estructurada fue en la década de los setenta. Los programadores. Basic y C) se basaban en acciones (verbos). Las mejoras a la tecnología de software comenzaron a aparecer con los beneficios de la denominada programación estructurada (y las disciplinas relacionadas como el análisis y diseño de sistemas estructurados) que se realizaba en la década de los setenta. • • La década de los noventa fué. especialmente aquellas que desarrollaban proyectos a gran escala. orientados a objetos. programan primordialmente mediante el uso de verbos. Antes de la aparición de los lenguajes orientados a objetos.e impulsor del lenguaje unificado de modelado UML. sistemas operativos. Pascal. Escritores y diseñadores de software. esto se logra con la programación orientada a objetos. así. como por ejemplo. que los desarrolladores de software sintieron que tenían las herramientas necesarias para realizar mayores adelantos en el proceso de desarrollo de software. los tipos abstractos de datos y los objetos ( este último concepto se verá más adelante ). La realidad llegaba cuando la empresa decidía producir de manera comercial el sistema en el que cientos de personas habían trabajado durante muchos años. 2) cada objeto es una instancia de una clase. Con gran frecuencia los programadores deben comenzar de nuevo cada nuevo proyecto y escribir código similar desde cero: esto significa gasto de tiempo y de dinero. los lenguajes de programación (tales como FORTRAN. Un problema fundamental con la programación basada en procedimientos es que las unidades de programación no reflejan de manera fácil y efectiva a las entidades del mundo real. tales como Smalltalk. ¿Qué es la programación orientada a objetos? ¿Por qué es tan popular? • • La programación orientada a objetos es algo más que una colección de lenguajes de programación. creador de la empresa Racional – fabricante de la herramienta Rose para ingeniería de software orientada a objetos . Éste es un proceso más natural de programación y ha dado como resultado un mayor grado de productividad. Pero no fue hasta que la tecnología de la programación orientada a objetos se hizo popular en la década de los noventa. se dedican de modo continuo a producir compiladores de lenguajes. no algoritmos. Se podría decir que este tipo de programación es un nuevo modo de pensar sobre lo que significa computar (computarizar). con la disponibilidad de los lenguajes orientados a objetos tales como Java y C++. Isis Espinosa Salazar .

no se enfrentan a métodos alternativos de resolución de un problema. La orientación a objetos fuerza a reconsiderar nuestro pensamiento sobre la computación. de hecho. Cualesquiera que sean los beneficios que se perciban de la programación orientada a objetos. y otros más. El polimorfismo permite que un mismo mensaje pueda actuar sobre objetos diferentes y comportarse de modo distinto. están asociados con la continua evolución y mantenimiento de ese software durante su vida útil. ¿Qué son los objetos y por qué son tan especiales? • • • • • • • • • • En realidad. Isis Espinosa Salazar . de facturas. un tipo abstracto de dato al que se añaden importantes innovaciones en lo referente a compartir código y la reutilización. Esto puede ser importante debido a que se estima que el 80% de los costos de software no están asociados con los esfuerzos originales para el desarrollo de software. animales. La desventaja es el tiempo y esfuerzos que implica el diseño e implementación de nuevo código. mensajes y métodos. sencillamente. herencia y persistencia. Con frecuencia. de registro. Existen objetos de datos. Algunas empresas indican que la reutilización de software no es. Una idea fundamental es la comunicación de los objetos a través de paso de mensajes. y otras cosas. esto es. Bobrow y Stefik definen un estilo de programación como «un medio de organización de programas sobre la base de algún modelo conceptual de programación y un lenguaje apropiado para hacer programas en un estilo claro». modificar y corregir. mejor organizado y fácil de mantener. de tiempo. es claro que ésta será la metodología clave de la programación para las siguientes décadas. mencionan que la programación orientada a objetos tiende a producir software que es más comprensible. y por consiguiente tienen dificultad en ver la ventaja de elegir un estilo más apropiado al problema a manejar». De hecho. Jenkins y Glasgow observan que «la mayoría de los programadores trabajan en un lenguaje y utilizan sólo un estilo de programación. gente. vídeo. Sólo mire a su alrededor.Fundamentos de Programación Orientada a Objetos • Con las bibliotecas de componentes reutilizables. de cheques. Desde el enfoque de un TAD. semáforos. Sugieren que existen cuatro clases de estilos de programación: • • • • • • • ‰ ‰ ‰ ‰ Orientados a procedimientos Orientados a objetos Orientados a lógica Orientados a reglas Algoritmos Clases y objetos Expresado en cálculo de predicados Reglas If-then • No existe ningún estilo de programación idóneo para todas las clases de programación. Página 21 Ing. de audio. el principal beneficio que obtienen de la programación orientada a objetos. La orientación a objetos se acopla a la simulación de situaciones del mundo real. la tecnología de objetos es un esquema de compactación que permite crear unidades útiles de software. elevadores. clases e instancias. Vivimos en un mundo de objetos. edificios. permitiendo una reducción en el tamaño del código y un incremento en la funcionalidad. la cantidad de tiempo para el cual se asigna espacio y permanece accesible en la memoria del computador. La persistencia se refiere a la permanencia de un objeto. Existen automóviles. casi cualquier sustantivo puede representarse razonablemente como un objeto. un objeto es. Más bien. tales como la MFC (Microsoft Foundation Classes) y las creadas por Rogue Wave y muchas otras empresas desarrolladoras de software. Los objetos son tipos de datos que encapsulan con el mismo nombre estructuras de datos y las operaciones o algoritmos que manipulan esos datos. de archivo. Ellos programan en un paradigma forzado por el lenguaje que utilizan. La herencia permite diferentes tipos de datos para compartir el mismo código. aviones. Los mecanismos básicos de orientación a objetos son: objetos. sobre lo que significa realizar computación y sobre cómo se estructura la información dentro de la computadora. se puede reducir la cantidad del esfuerzo requerido para implementar ciertas clases de sistemas (comparadas con el esfuerzo que se hubiera requerido para reinventar estas capacidades en nuevos proyectos). Además de esta idea se añaden los mecanismos de herencia y polimorfismo.

Por consiguiente. Esté marco se caracteriza por la utilización del diseño modular OO y la reutilización del software. el marco de POO se revela como el más adecuado para la elaboración del diseño y desarrollo de aplicaciones. Principios básicos de la orientación a objetos. Jerarquía Figura 1. tales como iconos de menús. Aumento espectacular de LPOO (Lenguajes de Programación Orientada a Objetos). con construcciones de programación visuales. En el entorno de las bases de datos. la POO se adjunta bien a los modelos semánticos de datos para solucionar las limitaciones de los modelos tradicionales. sobre todo realización de prototipos y programas de simulación.9. sin necesidad de especificar los detalles de implementación. Macintosh. Instancias Herencia. Los objetos pasan a ser los elementos fundamentales en este nuevo marco. incluido el modelo relacional. Windows. La entrada al sistema se puede controlar a través de líneas de órdenes (enfoque utilizado por DOS y UNIX).Fundamentos de Programación Orientada a Objetos Conceptos clave Abstracción Encapsulación Persistencia Herencia Polimorfismo Genericidad Entidades básicas Objeto Mensajes. Razones fundamentales que están influyendo en la importancia de la POO • Algunas de las causas que están influyendo considerablemente en el notable desarrollo de las técnicas orientadas a objetos son: ‰ La POO (Orientación a Objetos) es especialmente adecuada para realizar determinadas aplicaciones. etc. Introduciremos también otras unidades de programación estructurada llamadas clases. crearemos objetos a partir de clases y procederemos con nuestra explicación acerca de la programación orientada a objetos. Página 22 Ing. tales como la estructura de datos a utilizar para la representación de los objetos definidos. Los TAD (Tipo Abstracto de Dato) han aumentado la capacidad para definir nuevos tipos (clases) de objetos. o alternativamente el usuario puede interactuar con el sistema. Los interfaces de usuario de una aplicación manipulan la entrada y salida del usuario. su función principal es la comunicación con el usuario final. en detrimento de los subprogramas que lo han sido en los marcos tradicionales. Interfaces de usuario gráficos (por iconos) y visuales. Después. Isis Espinosa Salazar . Los mecanismos de encapsulamiento de la POO soportan un alto grado de reutilización de código. Métodos Clases. que se incrementa por sus mecanismos de herencia. ‰ ‰ ‰ ‰ • • • • • Estas razones hacen fundamentalmente que dentro de las tendencias actuales de la ingeniería de software. cuyo significado se definirá abstractamente.

Todos exhiben un comportamiento. Toma ventaja de las relaciones de herencia e incluso de las relaciones de herencia múltiple. Objetos diferentes pueden tener atributos similares y comportamiento similares. Toma ventaja de las relaciones entre clases. Veremos que la orientación a objetos es una manera natural de pensar acerca del mundo real y de escribir programas de cómputo. Podemos. y entre humanos y chimpancés. los objetos también se comunican mediante mensajes. camina y parpadea. Isis Espinosa Salazar . etcétera. Mire a su alrededor en el mundo real. Quizá nos inclinemos a dividir los objetos en dos categorías: objetos animados y objetos inanimados. es decir. hablar de objetos. se infla y se desinfla. La programación orientada a objetos encapsula datos (atributos) y funciones (operaciones) en paquetes llamados objetos. mediante el modelado de objetos reales. los datos y las funciones de un objeto están íntimamente ligados. rebota. pensar en términos de playas en vez de granos de arena.Fundamentos de Programación Orientada a Objetos 1. animales. computadoras. edificios. en donde objetos de cierta clase. gente. camiones. Los objetos inanimados. es posible manejar un automóvil de manera efectiva sin tener que conocer a fondo los detalles de cómo funcionan internamente los sistemas del motor y la transmisión. Se mueven y hacen cosa. Tenemos la maravillosa habilidad de abstracción que nos permite ver imágenes en pantalla como objetos tales como gente. todos tienen atributos. En esta sección introduciremos los conceptos básicos. a saber. Un objeto de la clase convertible ciertamente tiene las características de la clase más general automóvil. como tamaño. un bebé llora. ¡objetos!. color. Los humanos aprendemos de los objetos al estudiar sus atributos y al observar su comportamiento. peso. etcétera. es decir. una bola rueda. si lo deseamos. los detalles de implementación se ocultan dentro de los mismos objetos. frena y gira. un sargento que le ordena a un soldado que se coloque en posición de firmes). Por ejemplo. Los objetos tienen la propiedad de ocultar información. Por donde quiera que voltee los puede ver. o realizan operaciones (por ejemplo. se pueden hacer comparaciones entre bebés y adulto. árboles y montañas. La programación orientada a objetos nos brinda una forma natural de ver el proceso de programación. parecen no hacer nada en absoluto. Con seguridad. todos los objetos tienen algo en común. etcétera) que especifican lo que hacen. plantas. los objetos no saben cómo se implementan otros objetos. • • • • • • • • • • • • Página 23 Ing. una toalla absorbe agua. tiene atributos y operaciones similares. forma.2 Conceptos fundamentales de la Programación Orientada a Objetos • • • • • Comenzaremos nuestra introducción a la orientación a objetos. Los automóviles. La programación orientada a objetos (POO) toma como modelo a los objetos reales para elaborar su contraparte en software. Esto significa que aunque los objetos pueden saber cómo comunicarse con otros a través de interfaces bien definidas. Sin embargo. automóviles. Comenzaremos nuestra introducción a la programación orientada a objetos con la terminología clave de ésta. La programación orientada a objetos proporciona también comunicación entre los objetos. que los describen. Parecen que sólo están ahí. Tal como las personas se envían mensajes entre sí (por ejemplo. duerme. en lugar de puntos individuales de color. vagones y patinetas tienen mucho en común. aviones. por lo general. tal como una clase de vehículos. en donde las nuevas clases de objetos creadas se derivan mediante la absorción de atributos y operaciones de clases existentes y mediante la adición de sus propias características únicas. Los objetos animados están vivos de alguna manera. como las toallas. sus atributos y comportamiento. un automóvil acelera. pensar en objetos y la terminología. gatea. Los humanos pensamos en términos de objetos. bosques en vez de árboles y casas en lugar de ladrillos. pero el techo del convertible puede quitarse o ponerse.

a las funciones que componen una clase se les llama funciones miembro (por lo general. Las ventajas de la orientación a objetos son muchas en programación y modelado de datos. Los programadores de C se concentran en escribir funciones. los datos son importantes en C. El atractivo intuitivo de la orientación a objetos es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible. Por ejemplo. En C++. Podemos construir muchas casas a partir de un plano. Los sustantivos en una especificación de sistema ayudan al programador en C++ a determinar el conjunto de clases desde el que se crean los objetos que trabajan juntos para implementar un sistema. El programador utiliza tipos predefinidos (y otros tipos definidos por el usuario) como bloques de construcción. A menudo. Además.Fundamentos de Programación Orientada a Objetos • • • • • • • • • • • • • • • • • • • • También. Las clases son a los objetos lo que los planos son a las casas. la programación tiende a ser orientada a acciones. En C y otros lenguajes de programación por procedimientos. En C++. mientras que en C++. la clase CajeroBanco necesita relacionarse con la clase CuentaBanco. en otros lenguajes de programación orientados a objetos. Cada clase contiene datos. La orientación a objetos puede describirse como el conjunto de disciplinas (ingeniería) que desarrollan y modelan software que facilitan la construcción de sistemas complejos a partir de componentes. En C. la unidad de programación es la función. Ciertamente. se les denomina métodos). a los componentes de datos de una clase se les llama dato miembro. Los verbos en una especificación de sistema ayudan al programador en C a determinar un conjunto de funciones que trabajan juntas para implementar el sistema. Página 24 Ing. grupos de clases relacionadas se empaquetan como componentes reutilizables. la unidad de programación es la clase. para construir tipos definidos por el usuario (clases). así como un conjunto de funciones que manipulan esos datos. las clases pueden tener relación con otras clases. a través de la cual se obtienen las instancias. pero la idea es que los datos existen primordialmente para apoyar las acciones que realizan las funciones. la programación tiende a ser orientada a objetos. a una instancia de un tipo definido por el usuario (es decir. El foco de atención en C++ se centra en las clases (desde las que se crean los objetos) en vez de funciones. como Java. Los programadores en C++ se concentran en crear sus propios tipos definidos por el usuario llamados clases y componentes. una clase) se le llama objeto. en el diseño orientado a objetos de un banco. las clases contienen funciones que implementan el comportamiento y datos que implementan los atributos de la clase. La más simple de estas relaciones se denomina asociación. Como apuntaban Ledbetter y Cox (1985): ‰ La programación orientada a objetos permite una representación más directa del modelo de mundo real en el código. y podemos crear instancias de muchos objetos a partir de una clase. En C++. veremos por qué el ocultamiento de información es crucial para la buena ingeniería de software. Los programadores agrupan acciones dentro de funciones que realizan alguna tarea común y agrupan funciones para formar programas. Veremos que el software empaquetado como clases puede reutilizarse en futuros sistemas de software. Tal como a una instancia de un tipo predefinido como int se le llama variable. El resultado es que la radicalmente transformación normalmente llevada a cabo de los requisitos del sistema (definido en términos de usuario) a la especificación del sistema (definido en términos de computadora) se reduce considerablemente. Isis Espinosa Salazar . En C++.

Isis Espinosa Salazar . Las disciplinas y técnicas orientadas a objetos manipulan la transformación automáticamente. si alguno de estos elementos no existe se dice que el modelo no es orientado a objetos. salvo que se quisiera agregar algun comentario extra.15. encapsulamiento. la transformación del problema en términos de un lenguaje de computadora Von Newmann. Estas tareas se realizan mediante la modelización del mundo real. a continuación. Construcción de software • • • • • Los conceptos y herramientas orientados a objetos son tecnologías que permiten que los problemas del mundo real sean expresados de modo fácil y natural. La tecnología orientada a objetos puede cubrir estos cambios y algunos otros más en el futuro. Se necesita un nuevo enfoque para construir software en la actualidad. Las técnicas orientadas a objetos proporcionan mejoras y metodologías para construir sistemas de software complejos a partir de unidades de software modularizado y reutilizable. La orientación a objetos trata de cumplir las necesidades de los usuarios finales. así como las propias de los desarrolladores de productos software. El soporte fundamental es el modelo objeto. Problemas del mundo real Transformación de Von Newmann Programa Codificación del programa Figura 1. cuando se compara con estilos de programación convencionales (procedimentales. las reducciones de código van desde un 40% hasta un orden de magnitud elevado cuando se adopta un estilo de programación orientado a objetos. no lo haremos aquí. de modo que el volumen de código del problema y la transformación se minimiza. el código generado para un problema del mundo real consta de una primera codificación del problema y. persistencia. jerarquía ). De hecho. Este nuevo enfoque debe ser capaz de manipular tanto sistemas grandes como pequeños y debe crear sistemas fiables que sean flexibles. mantenibles y capaces de evolucionar para cumplir las necesidades de cambio. Como algunos de estos temas ya han sido tratados (abstracción. genericidad. • Como sugiere Booch. modularidad. o por procedimientos). Utilizando técnicas convencionales.Fundamentos de Programación Orientada a Objetos • • La Figura 1. Página 25 Ing. Las propiedades más importantes de este modelo son: ‰ ‰ ‰ ‰ ‰ ‰ Abstracción Encapsulamiento Modularidad Jerarquía Polimorfismo Otras propiedades: concurrencia (multitarea). manejo de excepciones.15 ilustra el problema.

a un cuadrado o a un triángulo y el objeto ejecutará el código apropiado dependiendo del tipo específico. se puede enviar cualquier mensaje. son diferentes formas que utilizan los distintos mamíferos para realizar la misma función (comer). Las jerarquías de generalización/especialización se conocen como herencia. por ejemplo dibujar. según sea el objeto mamífero sobre el que se aplica. Así. No se debe confundir clases y objetos de la misma clase: un coche rojo y un coche azul no son objetos de clases diferentes. mediante la propiedad de derivación de clases o herencia. Por ejemplo. y ruedas. El polimorfismo requiere ligadura tardía o postergada (también llamada dinámica). borrar y mover. Los lenguajes no orientados a objetos soportan ligadura temprana o anterior. un camión se compone de ruedas. Isis Espinosa Salazar . un cuadrado o una elipse. En términos prácticos. Básicamente. Por otra parte. cuando se obtiene una clase a partir de una clase ya existente. es decir. Por ejemplo. camión es una agregación. Polimorfismo es la propiedad que indica. según sea el objeto que se referencia en ese momento. herencia y polimorfismo son aspectos claves en la programación orientada a objetos y se reconocen a estos elementos como esenciales en la misma. Polimorfismo • • • • La quinta propiedad significativa de los lenguajes de programación orientados a objetos es el polimorfismo. y esto sólo se puede producir en lenguajes de programación orientados a objetos. pero dada su importancia. Clases. que permite que una misma función se comporte de diferente forma según sea la clase sobre la que se aplica. El polimorfismo adquiere su máxima expresión en la derivación o extensión de clases. respectivamente). una clase figura puede aceptar los mensajes dibujar. Esta propiedad no suele ser considerada como fundamental en los diferentes modelos de objetos propuestos. por ejemplo) e indicarle que ejecute comer. esta tarea será distinta según que la clase sea un triángulo. si se dispone de una figura que represente figuras genéricas. de modo que cada tipo de mamífero debe poder realizar la operación o función comer. no tiene sentido considerar un modelo objeto que no soporte esta propiedad. sino objetos de la misma clase con un atributo diferente. etc. motor. el polimorfismo permite referirse a objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma operación de diferentes formas. un niño que se come un bombón o caramelo y un león que devora a otro animal.Fundamentos de Programación Orientada a Objetos Jerarquía • • • • • La jerarquía es una propiedad que permite una ordenación de las abstracciones. Cualquier tipo derivado de una figura es un tipo de figura y puede recibir el mismo mensaje. círculo. en donde una clase comparte la estructura o comportamiento definido en una o más clases (herencia simple y herencia múltiple. cuadrado. esto significa que el compilador genera una llamada a un nombre específico de función y el enlazador (linker) resuelve la llamada a la dirección absoluta del código que se ha de ejecutar. Cuando se envía un mensaje. • • • • • • • • Página 26 Ing. la posibilidad de que una entidad tome muchas formas. Así. una vaca o una cabra que pastan en un campo. esta acción se ejecutará de diferente forma. en consecuencia. El polimorfismo implica la posibilidad de tomar un objeto de un tipo (mamífero. Esta propiedad es el polimorfismo. literalmente. La agregación es el concepto que permite el agrupamiento físico de estructuras relacionadas lógicamente. la herencia define una relación entre clases. por ejemplo. Las dos jerarquías más importantes de un sistema complejo son: estructura de clases (jerarquía «es-un» (is-a): generalización/especialización) y estructura de objetos (jerarquía «parte-de» (part-of): agregación). transmisión y chasis son agregados de camión. cuando se describe la clase mamíferos se puede observar que la operación comer es una operación fundamental en la vida de los mamíferos. tanto a un tipo derivado (elipse. motor. La función dibujar se aplica igualmente a un círculo. sistema de transmisión y chasis.) como al tipo base.

se ensamblan una serie de piezas independientes. OLE 2. existen las bibliotecas de funciones. esta pregunta es continua. el programa no puede determinar la dirección del código hasta el momento de la ejecución. La persistencia o propiedad de que las variables -y por extensión los objetos. etc. la colección de clases de Objective-C. En los sistemas de programación tradicionales y en particular en los basados en lenguajes de programación estructuradas (tales como FORTRAN. los lenguajes orientados a objetos utilizan el concepto de ligadura tardía. éste sabe qué ha de hacer con ese mensaje. por ejemplo. estas otras propiedades: ‰ ‰ ‰ ‰ Concurrencia (multitarea). El programador orientado a objetos modifica una funcionalidad del programa sustituyendo elementos antiguos u objetos por nuevos objetos. Para realizar la ligadura tardía. Las técnicas orientadas a objetos ofrecen una alternativa de escribir el mismo programa una y otra vez. etc. ¿Por qué no se utilizan programas ya construidos para formar programas más grandes? Es decir.existan entre las invocaciones de un programa es posiblemente la propiedad menos implantada en los LPOO.Fundamentos de Programación Orientada a Objetos • • • • En POO. en vez de fabricarlos cada vez que se necesita construir un automóvil o un edificio. REUTILlZACIÓN DE SOFTWARE • • Cuando se construye un automóvil. como les ocurre a los ingenieros de hardware. aunque ya es posible considerar la persistencia en lenguajes tales como Smalltalk y C++. además. Este código calcula la dirección del cuerpo de la función para ejecutar en tiempo de ejecución utilizando información almacenada en el propio objeto. Cuando se envía un mensaje a un objeto. lo que facilitará el advenimiento de las bases de datos orientadas a objetos. jerarquía de clases Smalltalk. según el lenguaje) que pueden ser incorporados en diferentes programas. • • • • • • Página 27 Ing. Ada soporta concurrencia y Ada y C++ soportan genericidad y manejo de excepciones. cada objeto se puede comportar de modo diferente de acuerdo al contenido de ese puntero. Ejemplos de componentes reutilizables comercialmente disponibles son: Turbo Visión de Turbo Pascal. o bien conectando simplemente nuevos objetos en la aplicación. Cuando se envía un mensaje a un objeto. que contienen funciones (o procedimientos. Persistencia Genericidad Manejo de excepciones • • Algunos lenguajes soportan todas estas propiedades y otros sólo algunas de ellas. Otras propiedades • El modelo objeto ideal no sólo tiene las propiedades anteriormente citadas. de modo que estos componentes se reutilicen. pero no conoce el código exacto a ejecutar. C. un edificio o un dispositivo electrónico. al igual que sucede con los catálogos de circuitos integrados electrónicos. En el futuro inmediato. los ingenieros de software dispondrán de catálogos de paquetes de software reutilizable. normalmente denominados bibliotecas de software o paquetes de software reutilizables. para resolver este concepto. En sistemas orientados a objetos se pueden construir componentes de software reutilizables. Así.). al estilo de las bibliotecas de funciones. sino que es conveniente que soporte. El compilador asegura que la función existe y realiza verificación de tipos de los argumentos y del valor de retorno.0 de C++. como así está sucediendo. ¿existe algún método que permita realizar grandes programas a partir de la utilización de otros programas ya realizados? ¿Es posible reutilizar estos componentes de software? Las técnicas orientadas a objetos proporcionan un mecanismo para construir componentes de software reutilizables que posteriormente puedan ser interconectados entre sí y formar grandes proyectos de software. Por consiguiente. el compilador inserta un segmento especial de código en lugar de la llamada absoluta. clases MacApp para desarrollo de interfaces gráficos de usuario en Object Pascal. Isis Espinosa Salazar . el código que se llama no se determina hasta el momento de la ejecución. si en electrónica los computadores y sus periféricos se forman esencialmente con el ensamblado de circuitos integrados. disponibles en Apple. En la construcción de software.

Fundamentos de Programación Orientada a Objetos • • La reutilización de código en programación tradicional se puede realizar copiando y editando. Isis Espinosa Salazar . Muchos lenguajes orientados a objetos fomentan la reutilización mediante el uso de bibliotecas robustas de clases preconstruidas. creando automáticamente una subclase y anulando alguno de sus métodos. como hojeadores (browser). así como otras herramientas. mientras que en programación orientada a objetos se puede reutilizar el código. Página 28 Ing. para localizar clases de interés y depuradores interactivos para ayudar al programador.

Página 29 Ing. Fue un lenguaje de propósito general que ofrecía capacidad de simulación de sistemas. Las operaciones se llamaron métodos. En esencia. Simula era un lenguaje fuertemente tipificado. Simula-67 se derivaba de Algol 60. Verificación estática de tipos. Además. En esta figura se muestra que Simula-67 (Simula) inspiró el desarrollo de Smalltalk.2. que se utilizaron para describir la estructura y comportamiento de un conjunto de objetos. de modo que los errores que implican tipos se encuentran en esta etapa y no cuando el programa se ejecuta. Conceptualmente. como plantillas o patrones de objetos. tomó de Algol el concepto de bloque e introdujo el concepto de objeto. donde tiene sus raíces. que agrupan juntos atributos de datos y acciones (métodos) que procesen esos datos. Simula sentó la base de los lenguajes orientados a objetos y definió algunos de los conceptos clave de la orientación a objetos. Los objetos de Simula tenían su propia existencia y podían comunicarse entre sí durante un proceso de simulación. Ligadura dinámica (polimorfismo). Simula incorporaba también la noción de clases. que es el verdadero primer lenguaje de programación orientado a objetos. sus usuarios descubrieron pronto que Simula proporcionaba nuevas y poderosas posibilidades para fines distintos de la simulación. Clases. permitiendo compartir implementación y estructura. Las sucesivas versiones de Simula fueron mejorándose hasta llegar a Simula-67 (aparición en diciembre de 1966). Herencia. un lenguaje que soportaba modelado por simulación de procesos industriales y científicos.1 Los lenguajes orientados a objetos La evolución de los LPOO • Al principio de la década de los sesenta. Sin embargo.16 muestra la evolución (genealogía) de los lenguajes de programación orientados a objetos (LPOO). y se diseñó fundamentalmente como un lenguaje de programación de diseño. para permitir a las clases de objetos que tengan interfaces idénticos y propiedades que se puedan intercambiar. que se realiza durante el proceso de compilación para proporcionar seguridad en tiempo de ejecución para la manipulación externa de los atributos de los objetos. como medio de agrupar clases con propiedades comunes. como la elaboración de prototipos y el diseño de aplicaciones. La herencia de clases fue también soportada por Simula.Fundamentos de Programación Orientada a Objetos 1. Isis Espinosa Salazar . La herencia organiza las clases en jerarquías. Esto significa que el tipo de cada variable se conoce en tiempo de compilación. Kristen Nygaard y Ole-Johan Dhal desarrollaron Simula en el Norwegian Computer Center (NCC). Simula-67 fue el primer lenguaje de programación que incorporó mecanismos para soportar los conceptos orientados a objetos más sobresalientes: • • • • ‰ ‰ ‰ ‰ ‰ Encapsulamiento y objetos. • La Figura 1. un objeto contenía tanto datos como las operaciones que manipulaban esos datos.

Isis Espinosa Salazar .Fundamentos de Programación Orientada a Objetos Figura 16. Genealogía de los lenguajes de objetos según Sebesta Página 30 Ing.

en un entorno de oficina. Es también un lenguaje tipificado dinámicamente. al contrario que C++.Smalltalk/V de Digitalk. el inspirador de un gran número de lenguajes OO. cuyo éxito no pasó de unos años. Smalltalk es extraordinariamente rico en conceptos orientados a objetos. Existen varias versiones y dialectos de Smalltalk: Smalltalk. dirigió un equipo que implementó un subconjunto de Simula. el diseñador jefe de Ada-83. Este lenguaje fue diseñado por Bjarne Stroustrup en AT &T al principio de los ochenta [Stroustrup. Objective-C soportaba tipos abstractos de datos. etc. dialectos y versiones de Smalltalk. -80 y más recientemente -y seguramente la más popular. Uno de los lenguajes orientados a objetos más populares es C++. tales como Object Pascal. al contrario que Smalltalk. C++. identidad de objetos y concurrencia). Extensiones orientadas a objetos de lenguajes convencionales. Entre ellos destaquemos Eiffel. Página 31 Ing. Niklaus Wirth y un grupo de ingenieros informáticos de Apple Computer diseñaron Object Pascal [Schmucker. incluyendo clases base y tipo base. Smalltalk es un lenguaje orientado a objetos puro. Incluyó el concepto de tipo de objeto y definición de clases. y Bjarne Stroustrup. a principios de los ochenta. Otra característica fundamental que diferencia a Smalltalk es su capacidad de concurrencia. Por ejemplo. fue también un usuario de Simula. así como sobrecarga de funciones y operaciones. Las computadoras NEXT. las primeras versiones de C++ no comercializaban bibliotecas grandes de clases predefinidas. Sin embargo. gerentes y otros empleados funcionan simultánea e independientemente.Fundamentos de Programación Orientada a Objetos • Alan Kay creó Smalltalk-80 en Xerox PARC (Xerox Palo Alto Research Park) con Adele Goldberg. a través de conversaciones. que previamente había trabajado con una implementación de Simula. La primera implementación del lenguaje C++ se lanzó como un preprocesador a los compiladores C. correo electrónico. administrativos. Smalltalk afirmó el término «método» para describir las acciones realizadas por un objeto y el concepto de «paso de mensajes» como el medio para activar «métodos». es Objective-C [Cox 1987]. Object COBOL. el diseñador de C++. El desarrollo de lenguajes de orientación a objetos en esa década se muestra en la siguiente clasificación: • • • • • • • ‰ Extensiones. 1986]. Xerox y Textronix incorporaron en sus máquinas. Smalltalk no es un lenguaje tipificado. Sin embargo. Simula y otros lenguajes comenzaron a mezclarse y producir nuevos lenguajes orientados a objetos. «todos es un objeto» de una clase y todas las clases heredan de una única clase base denominada Object. C++ incorporó jerarquía de clases y permitía subclases que podían acceder a métodos y variables instancias de otras clases de su jerarquía. herencia y sobrecarga de operadores. Extendió el lenguaje Pascal con soporte para tipos abstractos de datos. con propiedades orientadas a objetos. Actor. que incorpora características orientadas a objetos de Smalltalk. En Smalltalk todo es un objeto. Smalltalk/V. Digitalk lanzó Smalltalk/V para computadoras personales IBM y compatibles. -76. Objective-C incluía una gran colección de clases predefinidas que permitía simplificar el proceso de desarrollo. Al igual que Smalltalk. como un entorno de programación completo. El lenguaje C++ permitía la ligadura dinámica y el polimorfismo. Se comunican entre sí. Bertran Meyer. informes. se fundamenta en el envío de mensajes a objetos. no ampliaba la definición de construcciones existentes en lenguajes. y diseñó nuevas construcciones y operadores para realizar tareas tales como definición de clases y paso de mensajes. que posteriormente se fue incorporando a otras muchas plataformas. Otro dialecto importante de C++. 1986]. herencia. a su vez. e incluso llegó a ser presidente de la Asociación de Usuarios de Simula. Durante la década de los ochenta. Smalltalk ha sido. así como extensiones y dialectos. Smalltalk. Esto significa que la potencia de Smalltalk. Jean Ichbiah. El primer método es una extensión de la construcción struct (estructura de C) y la otra nueva construcción class (clase). secretarias. -74.72. Los nuevos lenguajes Ada-95 y Java son totalmente orientados a objetos. el diseñador de Eiffel. -78. eligieron Objective-C como su principal lenguaje de desarrollo. Objective-C y CLOS. métodos y herencia. utilizó Simula y siempre ha agradecido su influencia en el diseño de C++. Smalltalk-80. C++ proporcionó dos construcciones para definiciones de clases. que liga (enlaza) un método a un mensaje en tiempo de ejecución. Isis Espinosa Salazar ‰ . Este lenguaje es un superconjunto de C. Smalltalk empleó la construcción denominada proceso para soportar concurrencia. etc. los conceptos orientados a objetos (tipos abstractos de datos. así como extensiones OO de lenguajes tradicionales. La concurrencia es un aspecto del mundo real. la versión Smalltalk-80.

Otros lenguajes de programación.. OOPSLA (ObjectOriented Programming Systems and LAnguages) han sido los detonantes de la explosión de la OO en la década de los noventa. técnicas. etc. Isis Espinosa Salazar . Tanto C++ como Smalltalk han sido implementados en diferentes plataformas: DOS. pero no se consideran orientados a objetos. Microsoft. en especial. Smalltalk. los lenguajes de programación orientados a objetos son: Eiffel. con características fuertemente tipificadas (con verificación estricta de tipos). Symantec y otras grandes compañías lanzaron productos orientados a objetos de modo continuo y progresivo. etc. CLOS es un lenguaje OO que introduce notables mejoras y tiene garantizada larga vida. Simula. junto con C++. Sin duda. especialmente desde la creación del comité X3J13 de ANSI para la estandarización del lenguaje. Estado de los lenguajes orientados a objetos en la década de los noventa • La década de los ochenta lanzó la orientación a objetos como base de la futura ingeniería de software orientada a objetos de la década de los noventa. Object Pascal (Turbo/Borland Pascal especialmente). tales como Ada. AT &T. UNIX. Aunque Ada (Ada-83) no cumple las propiedades importantes de un LPOO (por ejemplo herencia y ligadura dinámica). 87]. Se entienden por lenguajes orientados a objetos aquellos que soportan las características de orientación a objetos. Inc. ‰ Extensiones orientadas a objetos de LlSP. Sin duda. Object Pascal. La clasificación incluye los siguientes grupos: Página 32 Ing. La profecía se cumplió y la década de los ochenta se consagró como el origen de la explosión de la orientación a objetos que se produciría en la década de los noventa. sin lugar a dudas. aunque la versión Ada-83 presenta el inconveniente de no soportar herencia. especialmente empotrados. C++ es. Borland. utilizando ciertas técnicas de programación. Ada fue diseñado específicamente para la implementación de sistemas en tiempo real. los lenguajes. Eiffel incorpora muchas características orientadas a objetos. 1988] de Interactive Software Engineering. y Java como un híbrido propio de Sun su fabricante. Clasificación de lenguajes orientados a objetos • • • • • • Como ya se ha comentado anteriormente. C++. Otros lenguajes han emergido en la década de los ochenta. Ada-95. aunque Smalltalk está ganando adeptos día a día. En 1988 apareció la primera revista de prestigio: The Journal of Object-Oriented Programming. soporta herencia y ligadura dinámica. en consecuencia. Lisp.Fundamentos de Programación Orientada a Objetos ‰ Lenguajes orientados a objetos fuertemente tipificados. Ada-95. IBM. 1982). Además de encapsulamiento y herencia. su importancia reside en la gran cantidad de desarrolladores y vendedores que comercializan estos lenguajes. pueden implementar algunas características orientadas a objetos. interfaces gráficos y bases de datos se hicieron muy populares. Otros hechos que han influido considerablemente en el enorme desarrollo de los LPOO han sido la aparición de diferentes publicaciones periódicas exclusivamente dedicadas a orientación a objetos. objetos. Taxonomía de lenguajes orientados a objetos • • Una taxonomía de lenguajes de programación con propiedades de orientación a objetos fue creada por Wegner. aunque todavía con restricciones. C.que reúne propiedades de C++. Existen diferentes versiones de LISP. Los principales lenguajes de programación utilizados actualmente para sistemas de tiempo real son C y Ada. soporta un enfoque de diseño orientado a objetos y se le conoce usualmente como basado en objetos [Wegner. Otro lenguaje fuertemente tipificado que soporta conceptos orientados a objetos (abstracción. Los lenguajes más implantados en la actualidad son Smalltalk y Eiffel. Sun. Un lenguaje disponible comercialmente y muy interesante es Eiffel [Meyer. aunque la más conocida y notable es CLOS (Common List Object System). ya estandarizado por ISO y ANSI. En la década de los noventa. tales como tipos paramétricos y pre y post-condiciones para métodos. Simula fue uno de los lenguajes orientados a objetos que se desarrollaron en la década de los ochenta y que fueron implementados en diversas plataformas. Digitalk. Clipper. tipos paramétricos) es Ada. diseñado para Internet con propiedades de objetos. el desarrollo de conferencias internacionales sobre orientación a objetos y. En 1982 se predijo que la programación orientada a objetos sería en la década de los ochenta lo que la programación estructurada fue en los setenta (Rentsch. Smalltalk. Object Pascal. OS/2. el lenguaje más popular. se considera orientado a objetos. Windows e incluso en sistemas grandes. La primera conferencia se celebró en el año 1986. los noventa fué la década de la proliferación de tecnologías y lenguajes orientados a objetos. Visual BASIC y Object Visual como lenguajes híbridos. Prolog.

Smalltalk. y se puede considerar orientado a objetos. las características que se citan a continuación: Página 33 Ing. Ada-95. no es suficiente que un lenguaje soporte la creación de objetos. para ser considerado orientado a objetos. Basado en clases. es necesario que existan construcciones de creación de clases y que soporten herencia adecuadamente. Visual Basic 4/5/6. Java. Características de los lenguajes orientados a objetos • Además de las características citadas anteriormente de objetos. clases y herencia. Visual Object. Objective-C. Simula. Orientación a objetos. Ada-83 soporta la creación de objetos mediante paquetes (tipos abstractos de datos). ‰ ‰ Objetos Basado en objetos Ada-83 Actor Clipper 5. C++ soporta la creación de objetos y clases. se podría actualizar la clasificación de los lenguajes pensando en la segunda década de los noventa: • • ‰ ‰ ‰ Lenguajes basados en objetos Lenguajes basados en clases Lenguajes orientados a objetos Ada-83.Fundamentos de Programación Orientada a Objetos ‰ Basado en objetos. o todas.2. Un paquete en Ada no es una definición de tipos como la clase C++. Un lenguaje de programación orientado a objetos es un lenguaje basado en clases que soporta también herencia. Clu. Si un lenguaje de programación es basado en objetos y soporta además la creación de clases. De acuerdo a la taxonomía de Wegner. así como herencia. Taxonomía de lenguajes OO de Wegner • Esta taxonomía de orientación a objetos proporciona una definición estricta de los lenguajes de programación orientados a objetos. Un lenguaje de programación es basado en objetos si su sintaxis y semántica soportan la creación de objetos que tienen las propiedades descritas en temas anteriores. además de las propiedades de Ada-83. los LPOO deberán tener algunas. CLOS. Eiffel. se considera basado en clases. clases y herencia. Isis Espinosa Salazar .x Clu + clases Basado en clases + herencia Orientada a objetos C++ Eiffel Simula Smalltalk Turbo Borland Pascal Delphi Visual Object Object COBOL Ada-95 Figura 1. Object Pascal. Actor. Clipper 5. Según esta taxonomía. y en consecuencia Ada es un lenguaje basado en objetos. que ha prevalecido en la época actual. Delphi.17. y es por consiguiente totalmente orientado a objetos. Object COBOL. Oyeron. Prolog++. Ada-95 soporta. C++.

Esta característica complementa la característica de tipificación estricta. normalmente. Datos compartidos. en el que todo consta de objetos. En general. ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ • Los lenguajes de programación disponibles actualmente no cumplen todas las características citadas anteriormente. Página 34 Ing. Es deseable que el lenguaje soporte ocultamiento de la información. Un LPOO puro es un lenguaje diseñado para soportar únicamente el paradigma orientado a objetos. Los módulos se deben poder comunicar mediante memoria compartida. Es conveniente que el lenguaje soporte la creación de procesos paralelos independientes del sistema operativo. Asimismo. Se deben poder detectar.0 comienzan a incorporar propiedades de concurrencia e incluso persistencia. de los cuales se derivan. Isis Espinosa Salazar . por otra parte. que se utilicen para manejar objetos de tipos diferentes en tiempo de ejecución. Puros frente a híbridos • • Existe un profundo debate entre los usuarios y desarrolladores de OO sobre la decisión del lenguaje a emplear. El polimorfismo se implementa. clases y métodos. Genericidad. Polimorfismo.).Fundamentos de Programación Orientada a Objetos ‰ Tipificación estricta (fuerte). Los lenguajes deben permitir que existan operaciones con igual nombre. etapa a etapa). mediante partes independientes. en unión con la herencia. Los LPOO más populares son Smalltalk y Eiffel. tipos de parámetros e interfaces de módulos. Los objetos deben poder ser persistentes. los lenguajes orientados a objetos no soportan concurrencia. El lenguaje es conveniente que soporte paso bidimensional de mensajes entre módulos. etc. sin necesidad de tener que pasar realmente ningún dato. Persistencia. además del paradigma orientado a objetos. los objetos han de poder permanecer después de la ejecución del programa. Compilación incremental. Característica en el desarrollo de sistemas grandes. Los lenguajes híbridos se construyen a partir de otros lenguajes existentes. Un LPOO híbrido. que se instanciarán con parámetros reales. en los que las porciones del sistema se crean e implementan de un modo sistemático (poco a poco. este es el caso de C++. soporta ya herencia y polimorfismo. es posible utilizar el LPOO de un modo no orientado a objetos y también como orientado a objetos utilizando objetos. Concurrencia. es decir. se detectan durante las fases de diseño e implementación. Encapsulamiento. Excepciones. Paso de mensajes. que soporta partes independientes de implementación y específica. aunque las versiones de C++ que siguen el futuro estándar 4. para crear instancias de módulos que se compilan y enlazan.o unidades genéricas) sirven para soportar un alto grado de reusabilidad (reutilización). Los errores de programación relacionados con el número de parámetros. aunque sí es en la actualidad cuando este debate se ha acrecentado y ha comenzado a ser decisivo en el desarrollo de la OO. y ejecutan posteriormente. soporta otros paradigmas de programación (tales como el tradicional -estructurado-. Esta característica proporciona un diseño débilmente acoplado que cumple con rigor el principio básico de la inferencia de software: acoplamiento débil y fuerte cohesión entre los módulos de un programa. Ada-95. para la especificación y la implementación. Esta propiedad añadida al soporte de tolerancia a fallos del software permitirá una estrategia de diseño eficiente. Esta propiedad simplificará la transportabilidad de un sistema de tiempo real de una plataforma a otra. Estos elementos genéricos se diseñan con parámetros formales. funcional. en lugar de en tiempos de ejecución. informar y manejar condiciones excepcionales utilizando construcciones del lenguaje. Las clases parametrizadas (mediante plantillas -templates. además del paso de mensajes. lo que implicará módulos débilmente acoplados y diseños flexibles. además de concurrencia. tales como C o Pascal. métodos y clases. Este debate no es reciente. Esto significa que se deben poder pasar señales entre módulos. Tipificación es el proceso de declarar el tipo de información que puede contener una variable.

Por ejemplo. sin embargo. Los lenguajes puros. Esto les hace perder eficiencia en tiempo de ejecución. Proporcionan su máxima flexibilidad para cambiar los aspectos esenciales del lenguaje. El hecho de que en 1994 IBM lanzase versiones de Smalltalk para sus sistemas OS/2 y AIX hizo crecer el número de usuarios de este lenguaje. En contraste. si bien esta facilidad dependerá del nivel de cada persona. C++ es el lenguaje más popular y utilizado. permitiendo que las variables puedan tomar sus tipos adecuados en cualquier instante dado. sin embargo. El tipo de cada objeto se ha de determinar y comprobar antes que se ejecute el programa. pues entonces sólo necesita dominar las extensiones orientadas a objetos. Java se está configurando como un nuevo estándar para programación orientada a objetos. Existe un precio. UNIX y Windows. un número entero o un número de punto flotante. Isis Espinosa Salazar .Fundamentos de Programación Orientada a Objetos Lenguajes puros Objetos Mensajes Clases Lenguajes híbridos Objetos Mensajes Clases + Lenguajes base tradicional Figura 1. Smalltalk está ganando día a día en aceptación. Estas dos opciones se denominan tipificación fuerte. tales como Smalltalk o Eiffel. Sin embargo. para un programador experimentado. a la potencia y flexibilidad de los lenguajes puros. el movimiento o emigración hacia un lenguaje híbrido puede ser más fácil si está ya familiarizado con el lenguaje base. y el programa se puede ejecutar más eficientemente. La mayoría de los lenguajes puros no son tan rápidos como los híbridos y son difíciles de codificar en toda clase de operaciones fundamentales. se pueden realizar cambios profundos si son necesarios. los lenguajes híbridos pierden con frecuencia alguna de las características de los lenguajes puros y normalmente no permiten modificar características de construcción del lenguaje base. Otros lenguajes no requieren esos requisitos. aunque. Algunos lenguajes de objetos requieren que a todas las variables se les asigne un tipo antes de que se pueda utilizar. ya que utilizan todas las ventajas de la tecnología. dado que • • • Página 35 Ing. En la actualidad. Dado que todo en el lenguaje se construye sobre la base de los objetos. y tipificación débil. debido esencialmente a estar soportado por las plataformas DOS. son normalmente más rápidos para operaciones construidas en el lenguaje base. la variable está restringida a contener esa clase de datos. pueden ser más potentes. Las ventajas de un lenguaje tipificado estáticamente son que los errores relativos a tipos se capturan (detectan) durante la compilación. Tipificación estática frente a dinámica • • • • • Tipificación o tipado (typing) es el proceso de declarar cuál es el tipo de información que puede contener una variable. Lenguajes OO puros/híbridos • Cada tipo de lenguaje tiene sus ventajas e inconvenientes. una variable se puede tipificar para contener un único carácter. una cadena de caracteres. estricta o estática. de modo que el compilador del lenguaje puede verificar que los nombres y expresiones compuestas de estos nombres se refieren siempre a los objetos del tipo especificado. Cualquier intento de situar otra clase de datos en la variable producirá un mensaje de error. Así. antes de que se ejecute el programa. La tipificación fuerte es menos flexible pero más segura. La tipificación fuerte o sistemas de tipos estáticos exige que el programador asocie explícitamente un tipo con cada nombre declarado en un programa. como ya se ha comentado. COBOL y PASCAL. ya que es más sencillo: sólo ha de aprenderse un lenguaje y no dos.18. como en el caso de un lenguaje híbrido. Los lenguajes puros e híbridos difieren también en la facilidad de aprendizaje. para un programador la enseñanza de un lenguaje puro normalmente es más fácil. Por otra parte. Lenguajes con sistemas de tipos estáticos son los tradicionales FORTRAN. ya que el lenguaje puede realizar comprobaciones de rutinas para asegurar que los parámetros de los mensajes sean de tipo correcto. no estricta o dinámica. Una vez que se ha declarado el tipo (tipificado).

h> #include <iostream. La ligadura estática se conoce también como ligadura temprana o anticipada y se realiza en tiempo de compilación.h> / / . Página 36 Ing. Normalmente. enlaza dinámicamente una posición de almacenamiento a y y asigna a esa posición el valor de y. Los lenguajes de objetos puros normalmente utilizan tipificación débil. debido a la necesidad de mantener y comprobar el tipo de todos los objetos durante la ejecución. Por otra parte. funcl( ) . • Los lenguajes con un sistema de tipos dinámicos (lenguajes de tipificación débil) no exigen que el programador especifique el tipo de objeto que puedan contener las variables cuando se escribe el programa. Tipificación de un mensaje Ligadura estática frente a dinámica • • • Ligadura es el proceso de asociar un atributo a un nombre.Fundamentos de Programación Orientada a Objetos no hay necesidad de hacer ninguna verificación de tipos en tiempo de ejecución. mientras que el tipo de dato integer se enlaza al nombre x. pero esta tarea requiere esfuerzos especiales. que suelen presentar ligadura estática. Los lenguajes híbridos. . Las ventajas de los lenguajes con un sistema de tipos dinámicos son que los programas son más flexibles y puede disponer de nuevos tipos de objetos que no fueron previstos cuando se escribió el programa. En el caso de funciones. //. mientras que los compiladores realizan normalmente ligadura estática. Y la sentencia new( y ) .. se enlaza 3 dinámicamente a x cuando se ejecuta la sentencia de asignación. los lenguajes funcionales y orientados a objetos presentan ligadura dinámica. considere las declaraciones: • ‰ ‰ const n = 3. var x : integer. ya que este enfoque les proporciona máxima flexibilidad. al contrario que los lenguajes imperativos. Desde el punto de vista de la estructura del lenguaje. • *prueba = definir( int idPar ) Devuelve un apuntador al objeto prueba Método definir Requiere un parámetro entero Figura 1. Isis Espinosa Salazar . La ligadura se clasifica en dos categorías: ligadura estática y ligadura dinámica. en contraste. Ejemplo de ligadura estática • Se desea procesar una determinada función. Es posible especificar el tipo de un argumento. func2( ).19. el término ligadura (binding) se refiere a la conexión o enlace entre una llamada a la función y el código real ejecutado como resultado de la llamada. Esta flexibilidad se hace a costa de una pérdida de eficiencia durante la ejecución del programa. los intérpretes por definición realizan todos ligadura dinámica. Mediante una sentencia switch se podría realizar el programa correspondiente en C++: #include <ctype. tienden a construirse como lenguajes fuertemente tipificados. cuando se crean nuevos tipos objetos. de modo que haya flexibilidad en tiempo de ejecución. La ligadura dinámica se conoce también como ligadura retardada o postergada y se realiza en tiempo de ejecución. en este caso. Cada objeto conoce su propio tipo cuando se crea durante la ejecución. consideremos la sentencia de asignación x := 3. static void salir( ). según sea un determinado carácter (código). char car. • el valor 3 se enlaza estáticamente al nombre n. especialmente durante el desarrollo. Como ejemplo de ligadura estática.

debido esencialmente a que soporta el concepto de abstracción de datos mediante el paquete y la genericidad mediante unidades genéricas. case 'P' : funcl( ). La memoria se gestiona (administra) automáticamente. Por la importancia del lenguaje C++ y dado que es el lenguaje utilizado en este curso para la implementación de los conceptos orientados a objetos. se apoyó en dicho lenguaje en su primera versión del método. Revisión de lenguajes orientados a objetos • • • Los dos lenguajes más utilizados en el desarrollo OO y más introducidos en el mercado son Eiffel. default : cout << "Código desconocido: " << car << endl. recogemos en la Tabla 1 el cumplimiento de dichos criterios en los lenguajes OO y basados en objetos más populares. poscondiciones e invariantes mejoran significativamente la robustez y documentación de programas desarrollados en Eiffel. así como reglas y consejos para mejorar el estilo de programación y reglas y consejos para la depuración de programas. una nueva clasificación. Soportan polimorfismo y ligadura dinámica. La nueva versión Ada-95 ya es totalmente orientada a objetos. Isis Espinosa Salazar . Smalltalk. Las clases se pueden definir como extensiones o restricciones de otras clases ya existentes mediante herencia. Si un lenguaje soporta ligadura dinámica. la identidad del receptor se puede dejar indeterminada hasta que se envía realmente el mensaje en tiempo de ejecución. case '*' : func2( ). es el prototipo de lenguaje de programación orientado a objetos puro. ya que cada función se llama explícitamente por el nombre. break. creador del lenguaje Eiffel. cuyos complementos configuran. En lenguajes que requieren ligadura estática. Actor. la metodología HOOD también se apoya en Ada como lenguaje fundamental. Existe una correspondencia entre tipos de datos no elementales y clases. la función invocada en respuesta a cada orden se conoce cuando el programa se está compilando. C++. El lenguaje Ada se suele considerar por muchos autores como basado en objetos. Objective-C.Fundamentos de Programación Orientada a Objetos //car. proporciona unos criterios para considerar la bondad de un lenguaje orientado a objetos. Los objetos se describen como la implementación de tipos abstractos de datos. como heredero directo de Simula. Object Pascal (especialmente Turbo Pascal) y Visual BASIC. Existe herencia múltiple y repetida. Página 37 Ing. debido a que Grady Booch. los criterios recogidos son los siguientes: • • • • ‰ ‰ ‰ ‰ ‰ ‰ ‰ La modularización de los sistemas ha de realizarse mediante estructuras de datos apropiadas. El lenguaje Eiffel se examina brevemente. contiene el código de carácter int codigo = toupper( car ). En el caso de propiedades orientadas a objetos. Meyer. también es considerado basado en objetos. El uso de precondiciones. la ligadura se considera como el proceso mediante el cual se determina el receptor de un mensaje. CLOS. se dedicarán capítulos específicos para enseñar la escritura y sintaxis del lenguaje. de hecho. Smalltalk (en sus versiones 80 y V). De cualquier forma. } • • En este caso. • De acuerdo con los criterios de Meyer. La ligadura dinámica permite la implementación de una de las características más sobresalientes de la orientación a objetos: el polimorfismo. la identidad del receptor se debe especificar cuando se crea el programa. switch ( codigo ) { case ' S' : salir ( ) . debido a que fue diseñado para soportar totalmente la orientación a objetos y otras características de ingeniería de software. En este sentido. break. autor del famoso método de diseño Booch.

Criterios de Meyer en lenguajes OO y basados en objetos Criterios 1. Modularización 2. Tipos abstractos de datos 3. Isis Espinosa Salazar . Herencia múltiple y repetida Ada-83 Ada-95 Sí Sí Sí Sí No No No Sí Sí Sí Sí Sí Sí No C++ Sí Sí En parte En parte Sí Sí Sí Eiffel Smalltalk Java Sí Sí Sí Sí Sí Sí Sí Sí Sí Sí Sí Sí Sí No Sí Sí Sí Sí Sí Sí No Página 38 Ing. Sólo clases 5. Herencia 6.Fundamentos de Programación Orientada a Objetos Tabla 1. Gestión automática de memoria 4. Polimorfismo (y ligadura dinámica) 7.

otra puede estar medio llena y otra totalmente vacía) y otras características (como su color). Cada vez que se construye un objeto de una clase estamos creando lo que se llama una instancia (modelo o ejemplar) de una clase y la operación correspondiente se llama instanciación (creación de instancias). arreglos. consta de métodos y datos que resumen características comunes de un conjunto de objetos. una agenda. por el contrario. Esta característica simplifica la escritura. Por consiguiente.Fundamentos de Programación Orientada a Objetos 1. Pueden comunicarse con otros objetos pasando mensajes. No se puede acceder a los datos directamente. Dicho de otro modo. Los objetos tienen las siguientes características: • • ‰ ‰ ‰ ‰ ‰ ‰ Se agrupan en tipos llamados clases. Ninguna otra función puede acceder a los datos. cuando el televisor recibe el mensaje “cambió de canal” desde el control. Tienen datos internos que definen su estado actual. La encapsulación de datos y ocultamiento de datos son términos importantes en la descripción de lenguajes orientados a objetos. Java y C#) son el único medio de acceder a los datos privados de un objeto.3 Relación entre clases y objetos • Un objeto es un simple elemento. Una clase. se produce la ejecución de una acción o cambia una propiedad del objeto como consecuencia de dicho mensaje. Una nota musical tiene tono. Cada uno de estos objetos generalmente tendrá un estado particular propio (una pluma estilográfica puede estar llena. Los datos y las funciones (procedimientos en Object Pascal) asociados se dicen que están encapsulados en una única entidad o módulo. Las clases son similares a los tipos de datos y equivalen a modelos o plantillas que describen cómo se construyen ciertos tipos de objetos. Un balón. un archivero. Se puede definir muchos objetos de la misma clase. tales como números. una clase es la declaración de un tipo objeto. cambia de canal. ‰ ‰ ‰ Un objeto es una instancia de una clase. Los datos están ocultos. Tienen métodos que definen su comportamiento. Se lee el elemento y se devuelva el valor. Si se desea leer un elemento datos de un objeto se llama a la función miembro del objeto. Mensajes que puede entender. una palabra. los términos objeto e instancia de una clase se pueden utilizar indistintamente. una clase es como un molde o plantilla que se utiliza para definir o crear objetos. Una clase puede tener muchas instancias y cada una es un objeto independiente. • Cuando un objeto recibe un mensaje. Una clase es una plantilla que se utiliza para describir uno o más objetos de un mismo tipo. aunque compartan algunas operaciones comunes ( como escribir o llenar su depósito de tinta ). Tal unidad se denomina objeto. Isis Espinosa Salazar . ¿Qué pasa con cosas como un número. o atributos. se puede borrar o insertar en un documento. cadenas y registros. En el caso del control de un televisor. métodos en Object Pascal. Una clase es la descripción de un conjunto de objetos. En la práctica. Soportan ocultamiento de los datos. pero son objetos porque tienen propiedades. Si se desea modificar los datos de un objeto. Un número tiene un valor. Una palabra tiene longitud y si estamos hablando de un procesador de textos. duración y volumen. Cada vez que se construye un objeto a partir de una clase estamos creando lo que se llama • • • • • Página 39 Ing. y se pueden sumar dos números. una cuenta bancaria o una nota musical? No son objetos físicos. Las funciones dentro del objeto (funciones miembro en C++. algo es un objeto si tiene: ‰ ‰ ‰ Un nombre. depuración y mantenimiento del programa. las cosas físicas son objetos. Pueden heredar propiedades de otros objetos. En general. dentro de los objetos residen los datos de los lenguajes de programación tradicionales. describe una familia de elementos similares. los objetos no som más que instancias de clases. A partir de una clase se puede definir un número determinado de objetos. Casi siempre. así como funciones o subrutinas que operan sobre ellos. un árbol y una computadora son todos objetos. Por consiguiente. • Una clase es un tipo definido que determina las estructuras de datos y operaciones asociadas con ese tipo. • La idea fundamental en los lenguajes orientados a objetos es combinar en una sola unidad datos y funciones que operan sobre esos datos. y eso asegura que no se pueden modificar accidentalmente por funciones externas al objeto. Ciertamente. no importa lo complejo que pueda ser. se conoce exactamente cuáles son las funciones que interactúan con el mismo. y podemos llevar a cabo acciones sobre ellos. Las clases son como plantillas que describen cómo están construidos ciertos tipos de objetos. Propiedades asociadas al mismo.

cada uno de los cuales se diferencia por un estado específico y es capaz de realizar una serie de operaciones. por ejemplo. Los objetos y las clases se comparan a variables y tipos en lenguajes de programación convencional. rellenar si está vacía). En un lenguaje estructurado. ¿Cuál es la diferencia entre una clase y un objeto. define la estructura de una variable entera. por ejemplo. en lugar de en cada objeto. una clase es una plantilla para un tipo particular de objetos. La clase es la construcción del lenguaje utilizada más frecuentemente para definir los tipos abstractos de datos en lenguajes de programación orientada a objetos. en estos lenguajes de programación no es posible agrupar nuevos tipos y sus correspondientes nuevas funciones y procedimientos en una única unidad. En programación. Los objetos se crean cuando un mensaje de petición de creación se recibe por la clase. el tipo int será una clase. La clase contendrá algunas funciones que operan o utilizan esas variables. Dentro de un programa. Sin embargo. • • • • Cada vez que se construye un objeto de una clase se crea una instancia de esa clase. Si se tienen muchos objetos del mismo tipo. las clases tienen dos propósitos principales: definir abstracciones y favorecer la modularidad. solo se tienen que definir las características generales de ese tipo una vez. Una clase pluma estilográfica puede tener. por ejemplo. En resumen un objeto es una instancia de una clase. una variable que indica si está llena o vacía. Por ejemplo. • • • • • Página 40 Ing. poner/quitar la tapadera. una clase es una estructura que contiene datos y procedimientos (o funciones) que son capaces de operar sobre esos datos. Los objetos son miembros de una clase. En realidad. Expresa la estructura y todos los procedimientos y funciones que se pueden aplicar a una de sus instancias. Isis Espinosa Salazar . una secuencia de 16 bits y los procedimientos y funciones que se pueden realizar sobre enteros.Fundamentos de Programación Orientada a Objetos una instancia de esa clase. Una clase es una colección de objetos similares. escribir. Generalmente. sin embargo. un tipo int. una clase es más expresiva que un tipo. Una variable es una instancia de un tipo. Una instancia es una variable de tipo objeto. ‰ En Poo un objeto es una instancia de una clase. En un lenguaje orientado a objetos una clase proporciona este servicio. una clase se puede definir como una descripción abstracta de un grupo de objetos. una pluma estilográfica es un objeto que tiene un estado (llena de tinta o vacía) que puede realizar algunas operaciones (por ejemplo. con independencia de su complejidad? Una clase verdaderamente describe una familia de elementos similares. otra variable puede contener la cantidad de tinta cargada realmente. al igual que un objeto es una instancia de una clase. De acuerdo a nuestra definición de clase.

Los diagramas de secuencia hacen énfasis en cuándo ocurren las interacciones. Isis Espinosa Salazar . Nos centraremos en la metodología más utilizada. con gran similitud. aunque normalmente con independencia de ellos. médico. llamada a un servicio de asistencia técnica. Se continúa con este proceso hasta que Página 41 Ing. evento u ocurrencia: vuelo. Los estados describen la condición de un objeto (por ejemplo. Existen numerosos lenguajes de programación y metodologías que se han desarrollado en paralelo a los mismos. Lugares: sala de embarque. accidente. etc. Estos módulos se refieren a la fase de construcción de un programa. pero cada diagrama hace en información diferente. Si una de estas tareas es demasiado grande.4 El papel de clases y objetos en el análisis y el diseño • • Una de las tarea en el análisis y el diseño de sistemas es la identificación de las clases dentro del sistema. división. etc. Especificaciones que muestran aplicaciones de inventario o fabricación: refrigerador. etc. El modelo clásico del ciclo de vida del software no es el único modelo posible. • • • • • • Se modelan las clases del sistema y sus relaciones. Los diagramas de colaboración hacen énfasis en cuáles objetos participan en las interacciones y en las relaciones entre dichos objetos. Normalmente estos nombres o sustantivos y sus sinónimos se suelen escribir en una tabla de la que luego se deducirán los objetos reales. Se identifican las operaciones de una clase y con ella se elaboran los diagramas de secuencia. a la cual deben aplicarse criterios específicos de descomposición. ingeniero. nevera. más manejables. empleado. libro. El diagrama de actividad se centra en las acciones que realiza un objeto.Fundamentos de Programación Orientada a Objetos 1. paciente. por refinamiento y prototipos sucesivos. matrimonio – esposo – esposa – fecha de boda. Los objetos. los valores de los atributos de un objeto) en un determinado punto en el tiempo. los cuales se incluyen en metodologías de diseño. DESARROLLO TRADICIONAL FRENTE A ORIENTADO A OBJETOS • • El sistema tradicional del desarrollo del software para un determinado sistema es la subdivisión del mismo en módulos. Primero. equipo. Se identifican los atributos de las clases y se elabora un diagrama de estados. la participación de los objetos y las clases en la POO es de suma importancia. Incidentes que representan un suceso. revisamos el enunciado del problema y localizamos todos los sustantivos. el diagrama de actividad modela lo que hace un objeto durante su vida útil. las asociaciones son a las clases como los vínculos son a los objetos. suceso. automóvil. Se basan en la célebre ecuación de Wirth: • • • • Datos + Algoritmos = Programas • La idea clave del diseño descendente es romper un programa grande en tareas más pequeñas. se divide en tareas más pequeñas. Una colaboración consiste en una colección de objetos que trabajan juntos para llevar a cabo una tarea. que en el modelo clásico sigue a la definición de los requisitos (fase de análisis). pueden caer dentro de las siguientes categorías: ƒ ƒ ƒ ƒ ƒ ƒ ƒ Cosas tangibles: avión. etc. BASIC. Interacciones que implican generalmente una transacción o contrato y que relacionan dos o más objetos del modelo: compras – comprador. Se elaboran los diagramas de colaboración. Roles o papeles jugados o representados por personas: gerente. Los vínculos son relaciones sencillas entre los objetos. Las metodologías del diseño descendente (o descomposición funcional) se centran en operaciones y tienden a descuidar la importancia de las estructuras de datos. reactor nuclear. Los diagramas de colaboración y los diagramas de secuencia proporcionan información acerca de la manera en que interactúan los objetos. COBOL y recientemente C y C++. en otras palabras. mediante diagramas de clases. éstos representan a la mayoría de las clases (o instancias de las clases) necesarias para la implementación del sistema. Se modelan los objetos del sistema y sus vínculos. según Shlaer. muelle de carga. dado que es posible desarrollar código de un modo evolutivo. La programación estructurada es un estilo disciplinado de programación según los lenguajes procedimentales (por procedimientos). Dicho en pocas palabras. denominada desarrollo estructurado. Organizaciones: empresa. Se elabora el diagrama de actividad. El diagrama de secuencia se enfoca en la manera en que se envían los mensajes entre los objetos en el tiempo. vendedor – artículo. cliente. etc. Los diagramas de estado nos brindan una forma de expresar cómo y bajo que condiciones el objeto de un sistema cambia de estado. Mellor y Coad/Yourdon. que se apoya esencialmente en el diseño descendente y en la programación estructurada. fuente de alimentación. televisor. tales como FORTRAN.

con una relación de herencia. sino que están protegidos de modificaciones accidentales. Estos conceptos se aplican también con tecnologías de objetos. Las clases (tipos de objetos) son como los chips de hardware. Una metodología que se basa sólo en datos o sólo en procedimientos es similar a un lenguaje en el que sólo se utilizan nombres o verbos. Las técnicas de programación estructuradas reflejan. que se pueden utilizar repetidamente para diseñar y construir conjuntos mucho más grandes. Las estructuras de datos internos y métodos se pueden refinar sin afectar a otras partes de un sistema (Figura 1. Las clases de un sistema pueden tener entre sí. con una relación de cliente. Sólo enlazando nombres o verbos correctos (siguiendo las reglas semánticas). Página 42 Ing. se define el objeto mediante su especificación y su implementación. En programación orientada a objetos. son los beneficios de dichas TO: aumento de la fiabilidad y productividad del desarrollador. relaciones de uso (cliente). sino que también se pueden reutilizar (volver a utilizar). creando nuevas clases y ensamblándolas con otras ya existentes. sin lugar a dudas. que no sólo se pueden enlazar (ensamblar) entre sí. el diseño orientado a objetos es el método que conduce a arquitecturas de software basadas en objetos que cada sistema o subsistema evalúa. un modo de resolver un programa en términos de las acciones que realiza. La fiabilidad se puede mejorar. En lugar del enfoque funcional (invocar una función con unos datos). llamadas funciones. los desarrolladores experimentados gastan un porcentaje alto de su tiempo (20 al 40%) en crear nuevas clases y el tiempo restante en ensamblar componentes probados de sistemas. a veces es más fácil escribir nuevos sistemas que convertir los existentes. fácilmente legibles.» La construcción de un sistema se suele realizar mediante el ensamblado ascendente (abajo-arriba) de clases ya existentes. fundamentalmente. Los objetos. Normalmente.20). construyendo sistemas potentes y fiables. su comportamiento se define por las operaciones que puede realizar. las expresiones tomarán formas inteligibles y su proceso será más fácil. por ejemplo. por esta razón.Fundamentos de Programación Orientada a Objetos el programa se compartimentaliza en módulos más pequeños que se programan fácilmente. español o inglés). tiene una visibilidad limitada para otros objetos. se envía un mensaje a un objeto. como se verá en los siguientes temas. De acuerdo con Meyer. una clase puede utilizar los objetos de otra clase. tales como circuitos integrados (chips). • • • • • • • • • Beneficios de las Tecnologías de objetos (TO) • Una pregunta que hoy día se hacen muchos informáticos es: ¿ Cuál es la razón para introducir métodos de TO en los procesos de desarrollo? La principal razón. como ocurre en las técnicas estructuradas. El diseño orientado a objetos se apoya en lenguajes orientados a objetos que se sustentan. Así. es una instancia de una clase. estas unidades de programas. relaciones de derivación (herencia) o relaciones de agregación (composición) o incluso sólo relaciones de asociación. representan las citadas tareas o módulos individuales. los mensajes (en vez de los datos) se mueven por el sistema. Una definición muy elaborada se debe a Meyer: «Diseño orientado a objetos es la construcción de sistemas de software como colecciones estructuradas de implementaciones de tipos de datos abstractos. en un lenguaje orientado a objetos. Cox les llamó chips de software. permiten desarrollar aplicaciones. una clase puede heredar o derivar sus propiedades definidas en otra clase. Con más precisión. Los datos no fluyen abiertamente en un sistema. en su mayoría escrito normalmente para resolver problemas específicos. en los tipos de datos y operaciones que se pueden realizar sobre los tipos de datos. y en el caso de lenguajes como C. Las clases se agruparán normalmente en bibliotecas de clases. Recordemos ¿qué son los objetos? Un objeto es una entidad cuyo comportamiento se caracteriza por las acciones que realiza. en esencia. que son totalmente reutilizables. Isis Espinosa Salazar . al reflejar entidades del mundo real. La calidad de cada nivel de diseño se asegura mediante componentes del sistema que han sido probados previamente a su utilización. Los subprogramas facilitan el enfoque estructurado. que se compone de muchos elementos. debido a que cada objeto es simplemente «una caja negra» con respecto a objetos externos con los que debe comunicarse. pero que reflejará poca expresividad si sólo se utilizan nombres y verbos. se identifica por un nombre. En la actualidad existe gran cantidad de software convencional. Las metodologías tradicionales se vuelven poco prácticas cuando han de aplicarse a proyectos de gran tamaño. El hardware se ensambla a partir de componentes electrónicos. un objeto se define como una entidad caracterizada por un estado. • Para comprender mejor las relaciones entre los algoritmos (funciones) y los datos. El ensamblado de componentes electrónicos se garantiza mediante interfaces adecuados. consideremos una comparación con el lenguaje natural (por ejemplo. que son componentes reutilizables.

El objeto como caja negra • • Los sistemas tradicionales. esta productividad también aumenta. Sistemas más fiables. por otra parte. Mejor independencia e interoperatividad de la tecnología. Costo de conversión. Costo reducido. Proceso tradicional de datos • Taylor considera que los beneficios del modelado y desarrollo de objetos son: ‰ ‰ ‰ ‰ ‰ ‰ ‰ Desarrollo más rápido. Mantenimiento más fácil. Calidad más alta. Desarrollo más flexible. ‰ ‰ ‰ ‰ ‰ ‰ ‰ Inmadurez de la tecnología (hoy día ya no se puede considerar así). Disponibilidad de personal calificado. Mejores estructuras de información. Proceso de desarrollo más rápido.Fundamentos de Programación Orientada a Objetos Objeto Métodos Datos Figura 1. debido a que existe una asociación más natural entre objetos del sistema y objetos del mundo real. Necesidad de mejores herramientas. Incremento de adaptabilidad. Mejor informática distribuida y cliente-servidor. Página 43 Ing. Taylor también considera algunos inconvenientes.21. debido a que las clases de objetos se pueden hacer reutilizables de modo que cada subclase o instancia de un objeto puede utilizar el mismo código de programa para la clase. Las clases se construyen a partir de otras clases. Incremento en escalabilidad. • Sin embargo. La productividad del desarrollador se puede mejorar. aunque algunos de ellos ya han sido superados o al menos reducido su impacto. Soporte para modularidad a gran escala. Isis Espinosa Salazar • A continuación se muestran los beneficios genéricos de las tecnologías de objetos. Velocidad de ejecución. Por otra parte. Las tecnologías de objetos ayudan a los desarrolladores a tratar la complejidad en el desarrollo del sistema. Figura 1. Modelos que reflejan mejor la realidad. Reutilización. ‰ ‰ ‰ ‰ ‰ ‰ ‰ .20. Necesidades de estándares ( el grupo OMG es una realidad). presentan con frecuencia efectos laterales no deseados.

rendimiento. tomó el control. Toma el control. su abstracción mental del control implica que puede ir a casa de un amigo y ser capaz de usar su control y su televisor. idénticas. comprensibilidad y reutilidad. Esta forma de afrontar nuestro mundo puede ser aplicada al diseño y a la programación de software. son conscientes de que los objetos tienen propiedades y empiezan a pensar en ellos de forma abstracta. pero no pensar en términos de objetos.Fundamentos de Programación Orientada a Objetos ‰ ‰ ‰ Bibliotecas de clases comerciales disponibles. Objetos similares muestran un comportamiento similar. Sólo necesita saber cómo se oprimen los botones adecuados. Primero. oprime el botón y cambia al canal deseado. aprenden que si mueven un sonajero hará ruido. • • • • • • • Página 44 Ing. en su mayor parte. Creando cuidadosamente abstracciones de estos objetos y separando su implementación interna de su comportamiento externo. un enfoque: el diseño y la programación orientada a objetos. Algunos lenguajes orientados a objetos populares actualmente son Smalltalk y C++. aprendemos acerca de los objetos y de cómo se manipulan. incluso aunque tengan una marca de televisor distinta. Un paso clave en el desarrollo de un sistema complejo usando diseño orientado a objetos es determinar los objetos que constituyen el sistema. Ya que se puede usar un lenguaje orientado a objetos. Analicemos esta actividad. se han desarrollado distintas metodologías de diseño y programación. Difieren principalmente en la terminología usada para referirse a los objetos y en la sintaxis del lenguaje. Para ilustrar como la visión del mundo. Además. Los botones son la interfaz del control. Fue capaz de hacerlo así porque disponía de las abstracciones apropiadas para ambos objetos. A temprana edad. Isis Espinosa Salazar . que es un objeto físico. pero no es necesario saberlo. Si vamos a adoptar un enfoque orientado a objetos para desarrollar software. se puede usar dicho objeto para hacer algo. Observe que se ha tenido cuidado de incluir la frase implementar un diseño orientado a objetos. El diseño de software orientado a objetos elabora el software como un modelo muy próximo a la forma en que pensamos e interactuamos en el mundo real. consideremos una actividad que muchos de nosotros hacemos: ver la televisión. Cuando oprimió los botones adecuados hizo que el control enviase algunos mensajes al televisor. El bebé pronto se dará cuenta de que hacer ruido es una capacidad de todos los sonajeros. El televisor es también un objeto físico con varias propiedades. y además puede hacer algo: enviar mensajes a la televisión. adaptabilidad. tales como peso y tamaño. Estas interacciones son tan rutinarias que es fácil no darse cuenta de lo sorprendente de esta actividad. Al recibir el mensaje del control. Ha sido capaz de hacer que dos objetos interaccionen y ejecuten una actividad compleja sin comprender el funcionamiento interno de ninguno de ellos. DISEÑO ORIENTADO A OBJETOS • Para sustentar los principios descritos anteriormente. Dicho objeto tiene propiedades. tiene sentido usar un lenguaje de programación que sustente esta forma de pensar y permita implementar soluciones en términos de objetos. Un lenguaje que tiene esas características es un lenguaje de programación orientada a objetos. Las características que incluyen para manejar objetos son. facilita el manejo de su complejidad. se puede manejar la complejidad de un sistema de software de gran tamaño. el televisor cambió al canal deseado. Recientemente. Mirando la televisión recuerda que su programa favorito empezará pronto en un canal distinto. como un conjunto de objetos. Mejora la calidad del producto software terminado. Los bebés. A medida que desarrollan sus capacidades cognoscitivas. Si se conoce la interfaz de un objeto. No está claro de cómo lo hace o cómo están codificados los mensajes. por ejemplo. aunque no se sepa cómo funciona. se ha mostrado particularmente prometedor para ayudar a los desarrolladores de software a lograr los objetivos de fiabilidad. Mejores relaciones con los clientes.

El ocultamiento de información es crucial para una buena ingeniería de software. mediante el modelado de objetos reales. los datos son importantes en C. En realidad. ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ Página 45 Ing. La programación orientada a objetos proporciona una manera intuitiva de ver el proceso de programación. a saber. la programación tiende a ser orientada a acciones. sus atributos y sus comportamientos. La POO encapsula los datos (atributos) y las funciones (comportamiento) dentro de los objetos. La programación orientada a objetos (POO) modela objetos del mundo real con contrapartes en software. los objetos por lo general no están autorizados para saber los detalles de la implementación de otros objetos (para eliminar dependencias innecesarias). La POO también modela la comunicación entre objetos mediante mensajes. peso y aspecto) y exhiben un comportamiento. Cada clase contiene datos. color. Aunque los objetos pueden saber como comunicarse entre sí a través de interfaces bien definidas. Los componentes de datos de una clase se denominan datos miembro. Objetos distintos pueden tener muchos atributos iguales y exhibir un comportamiento similar. Los programadores en C++ se concentran en la creación de sus propios tipos definidos denominados clases. Los humanos aprendemos acerca de los objetos mediante el estudio de sus atributos y la observación de su comportamiento. Los objetos tienen atributos (como tamaño. aunque contiene características únicas propias. en donde las clases recién creadas se derivan mediante la herencia de las características de clases existentes. forma.Fundamentos de Programación Orientada a Objetos RESUMEN ‰ La orientación a objetos es una manera natural de pensar acerca del mundo y de escribir programas de computadora. En C y en otros lenguajes de programación por procedimientos. Toma ventaja de las relaciones entre clases. así como el conjunto de funciones que manipulan los datos. Aprovecha las relaciones de herencia e incluso las relaciones de herencia múltiple. Los componentes de función de una clase se denominan funciones miembro o métodos. Los objetos tienen la propiedad de ocultar información. pero la visión es que los datos existen primordialmente para permitir las acciones que realizan las funciones. Isis Espinosa Salazar . en donde los objetos de cierta clase tiene las mismas características y comportamientos.

modelado. Página 46 Ing. herencia (por ejemplo. éste es un ejemplo de una capacidad llamada __________________. Isis Espinosa Salazar . Por lo general. La mayor parte de los sistemas son modulares. a esta propiedad se le llama ______________________. información. Elija una organización a la que pertenezca y dibuje un diagrama que ilustre su jerarquía. Los objetos se comunican entre sí mediante el uso de __________________ bien definidas. comportamiento. Los componentes de datos de una clase se llaman ____________ y a los componentes de función de una clase se les llama _________________________. Los _______________ en una especificación de sistema ayuda al programador de C++ a determinar las clases que se requerirán para implementar el sistema. ocultamiento. dar vuelta a la izquierda o a la derecha. Televisor. 4) 5) 6) Dé un ejemplo de encapsulamiento en el funcionamiento de un contestador automático telefónico. encapsulado. o podemos retroceder y ver a tres personas sentadas en una mesa de conferencias. 7) La mayoría de las organizaciones tienen una estructura jerárquica. Considere un cajero automático en un banco. Bicicleta. abstracción. datos miembro y funciones miembro. Una persona de mantenimiento. ¿Cuáles son algunas de las propiedades relevantes del cajero para las siguientes persona? a) b) c) d) Un usuario. Explique cómo cada uno de los siguientes términos y conceptos se pueden aplicar a la noción de un reloj: objeto. clase. o ir hacia delante y hacia atrás es un ejemplo de _____________ del automóvil. mensajes. Video. ¿Qué tipos de interfaces presenta el radio de un automóvil (objeto) a su usuario (objeto persona)? 3) Probablemente porta en su muñeca uno de los objetos más comunes en el mundo. Si vemos un automóvil como un objeto. a esto se le denomina herencia _____________________.Fundamentos de Programación Orientada a Objetos EJERCICIOS 1) Llene el espacio vacío con el término de objetos correcto de cada una de las siguientes oraciones: a) b) c) d) e) f) g) h) i) j) Los humanos podemos ver hacia la pantalla del televisor y ver puntos de colores. Lavadora. antes de explicar a fondo la programación orientada a objetos? ¿Cuáles son los pasos típicos de un proceso de diseño orientado a objetos? ¿Cómo se puede mostrar la herencia múltiple en los seres humanos? ¿Qué tipo de mensajes se envía la gente entre sí? Los objetos se envían mensajes entre sí a través de interfaces bien definidas. 2) Responda de manera breve cada una de las siguientes preguntas pensando en objetos: a) b) c) d) e) ¿Por qué se prefiere explicar primero y con detalle la programación estructurada. un reloj. Los objetos se comunican entre sí enviándose ____________________. Un empleado del banco. a un objeto no se le permite saber cómo están implementados otros objetos. A una instancia de un tipo definido por el usuario se le llama _________________. Nombre algunos de los componentes/módulos de los siguientes sistemas: a) b) c) d) e) Equipo de música. considere un reloj de alarma). el hecho de que sea convertible es un atributo/comportamiento (elija uno) _________________ del automóvil El hecho de que un automóvil pueda acelerar o desacelerar. El presidente del banco. atributo. interfaz. Cuando una nueva clase hereda las características de distintas clases diferentes.

a) b) c) d) e) Belleza.Fundamentos de Programación Orientada a Objetos 8) ¿Son los siguientes elementos objetos? Justifique su respuesta. Teléfono. Equipo de música. Nombre los principales componentes de los siguientes dispositivos: a) b) c) d) e) f) Televisor. Bosque. Radio. Celos. Video. que hace que los dispositivos sean más fáciles de fabricar y reparar. Tiempo. Arbol. Isis Espinosa Salazar . 9) Casi todos los dispositivos electrónicos han sido diseñados siguiendo el principio de modularidad. 10) ¿Por qué se presta tanta atención hoy día a la programación orientada a objetos en general y a C++ en particular? Página 47 Ing. Horno de microondas.

una pulga lenta se mueve más despacio que una rápida. Cuando una pulga lenta llega al borde de la ventana. nos centraremos en el diseño de los dos objetos pulga. Cuando una pulga rápida alcanza el borde de la ventana. Para cada pulga. • • • De la definición del problema. cambia de dirección como si hubiera chocado con una pared. es necesario determinar las propiedades asociadas con ella y las acciones que pueden realizar. Hay dos tipos de pulgas: lentas y rápidas. es decir oprimiendo el botón del ratón cuando la pulga está debajo. Los objetos nombrados en la definición del problema son: ventana. se oprime el botón del ratón cuando la pulga no está debajo). Determinar los objetos que se definen en el problema. más que nada es ayudar a la gente a desarrollar su coordinación cuando usa un ratón de computadora. El juego funciona de la manera siguiente: ‰ ‰ El juego CAZA DE LA PULGA está formado por una ventana con la imagen de una pulga. se pueden extraer algunos objetos identificando los nombres. La pulga cambia de direcciones aleatoriamente dentro de la ventana (ver figura 1. el jugador pierde. Según el problema. ratón y pulga. Un jugador gana cuando elimina las pulgas lentas y rápidas sin fallar. Para cada objeto determinar sus atributos (propiedades) y sus acciones. Obviamente. se va a hacer un esbozo de diseño de un sencillo juego de computadora llamado CAZA DE LA PULGA. El diseño de los objetos ventana y ratón son similares. El objetivo del juego es eliminar a la pulga. Los dos tipos de pulgas se mueven de forma distinta. la atraviesa y aparece por el lado opuesto de la ventana. Paso 2. una pulga tiene las siguientes propiedades o atributos: Página 48 Ing. Isis Espinosa Salazar . Son pulgas duras y hay que aplastarlas varias veces hasta matarlas. una más rápida toma su lugar. Una pulga es eliminada aplastándola. El juego Caza de la pulga • Los pasos sugeridos en el diseño orientado a objetos son los siguientes: Paso 1.22. El propósito de este juego.Fundamentos de Programación Orientada a Objetos EJEMPLO DE DISEÑO ORIENTADA A OBJETOS • Para mostrar algunas características de un lenguaje orientado a objetos. Si se falla (es decir. Para mostrar las características disponibles en un lenguaje orientado a objetos. Cuando se elimina la primera pulga. ‰ ‰ ‰ ‰ Caza de la Pulga Movimientos posibles de la pulga PULGA Dirección actual Figura 1.22).

se puede pensar en una clase como una plantilla para un objeto. La diferencia entre clase y objeto es sutil. Resistencia (es decir. A partir de la clase. velocidad. • Página 49 Ing. Los lenguajes orientados a objetos proporcionan una forma de definir una abstracción mediante la encapsulación de sus propiedades y mensajes en un único concepto. Por ejemplo. Dirección. pero importante. En términos prácticos. actualizar su posición). cada una con su propia posición. dirección y resistencia. pero un Ford Taunus con interior de piel y motor V-6 es un objeto. Velocidad. se pueden crear o instanciar objetos con propiedades específicas. Isis Espinosa Salazar . un objeto es una entidad concreta. • • • • Estas propiedades y mensajes forman la abstracción de las pulgas del juego. Los mensajes que una clase puede manejar se denominan métodos o miembros de función. Mientras una clase es un concepto abstracto. Los miembros que definen las propiedades de una clase se denominan miembros de datos. Cuando un conjunto de propiedades y mensajes están encapsulados en una clase. En ella se instancian tres pulgas distintas. Golpear (es decir. En esencia. estaApuntandoA (pregunta a la pulga si el cursor del ratón está sobre ella). imagen. Mover (es decir.Fundamentos de Programación Orientada a Objetos ‰ ‰ ‰ ‰ ‰ Una Posición en la ventana. denominado clase. Una imagen. se dice que son miembros de la clase. La instanciación crea un objeto con valores específicos para cada una de las propiedades. • Una pulga debe ser capaz de manejar los siguientes mensajes o mandatos: ‰ ‰ ‰ ‰ ‰ ‰ Dibujar. a partir de la clase pulga. Cambiar la dirección en que se mueve. el número de golpes necesarios para eliminar la pulga).23. una clase define las propiedades y mensajes de un objeto. decir a la pulga que ha sido aplastada). La noción de instanciar un objeto concreto a partir de una clase abstracta se muestra en la figura 1. el concepto de automóvil es una clase. Matar (decir a la pulga que debe morir). porque contienen información.

Sin embargo. Tanto si una pulga es rápida como si es lenta. dirección y resistencia. velocidad. tiene posición. que se comportan de forma distinta cuando llegan al borde de la ventana. Si piensa acerca de ello. Isis Espinosa Salazar .Fundamentos de Programación Orientada a Objetos PULGA MENSAJES PROPIEDADES Posición Imagen Velocidad Dirección Resistencia Dibujar Mover FijarDireccion Golpear Matar estarApuntandoA La clase pulga Objetos pulga con propiedades particulares Posición: 1. Instanciación de tres objetos pulga a partir de la clase pulga • Se puede pensar en crear una clase por cada tipo de pulga (lenta y rápida) e instanciar tipos distintos de pulga según se requiriera.24. 3. 2 Imagen Velocidad: 3 Dirección: arriba Resistencia: 3 Pulga Posición: 12. una característica importante de los lenguajes orientados a objetos es que permiten al programador explotar la similitud de los objetos. imagen. una pulga rápida y una pulga lenta tienen muchas características en común.8 Imagen Velocidad: 2 Dirección: derecha Resistencia: 2 Dibujar Mover FijarDireccion Golpear Matar estarApuntandoA Dibujar Mover FijarDireccion Golpear Matar estarApuntandoA Pulga Dibujar Mover FijarDireccion Golpear Matar estarApuntandoA Figura 1.2 Imagen Velocidad: 4 Dirección: izquierda Resistencia: 4 Pulga Posición: 5. De hecho. la única característica que distingue a ambas pulgas es cómo se mueven. 2. pulgaLenta y pulgaRapida. Estas relaciones. se puede pensar en crear una pulga básica que capture los atributos y comportamientos que todas las pulgas tienen en común y usarla para crear dos tipos esenciales de pulgas. Así. ambas pulgas son tipos especiales de pulga. definen una jerarquía como se muestra en la figura 1. Una pulga lenta da la vuelta cuando llega al borde de la ventana. Por lo tanto. mientras que una rápida la atraviesa y reaparece por el borde opuesto de la ventana. Página 50 Ing.23.

24. Isis Espinosa Salazar . la más general.Fundamentos de Programación Orientada a Objetos Pulga PROPIEDADES Posición Imagen Velocidad Dirección Resistencia MENSAJES Dibujar Mover FijarDireccion Golpear Matar EstarApuntandoA Es una Es una PulgaLenta Propiedades Mensajes PulgaRapida Propiedades Mensajes Mover Mover Mensaje específico de pulgaLenta Mensaje específico de pulgaRapida Figura 1. una PulgaRapida y una PulgaLenta entienden los siguientes mensajes o mandatos: Dibujar. Golpear. Matar y EstaApuntandoA. Esta clase. • Página 51 Ing. Mover. De forma similar. Las clases derivadas heredan mensajes y propiedades de sus ancestros. Mover. Ambos tipos de pulgas comparten las funciones miembro para Dibujar. La habilidad de una clase para heredar propiedades y funciones miembro de un ancestro sustenta el principio de reutilización. Estas funciones sólo se implementan una vez. Matar y EstarApuntandoA. FijarDireccion. se denomina a veces clase base o superclase. Por lo tanto la PulgaRapida y la PulgaLenta tienen como propiedades su posición. La noción de herencia es una característica que define a los lenguajes orientados a objetos. Golpear. Imagen. FijarDireccion. Abstracción y herencia de pulgas con diferente comportamiento • • • En la parte alta del diagrama está la clase Pulga. Dirección y Resistencia. Debajo de la clase base están las subclases o clases derivadas. Velocidad.

ya que gran parte de la acción del juego se centra en las actividades del ratón. Raton. El raton envía un mensaje al ControladorDeJuego cada vez que se pulsa un botón. Los objetos son iconos que representan archivos. • • • • • Caza de la pulga Respuesta: si o no controladorDeJuego pulga ¿estaApuntandoA? PulsacionRaton pulsacionRaton raton Figura 1. los otros objetos mencionados fueron el ratón y la ventana. El mensaje Mover significa una cosa distinta si se envía a un objeto PulgaLenta o a una de tipo PulgaRapida. El polimorfismo es la capacidad de asumir diferentes formas. Página 52 Ing. Si lo piensa un momento. Sin embargo. responde no. el controlador crea una PulgaRapida y el juego continúa. se ignorará el objeto ventana. mientras que para un archivo de texto. en la descripción se menciona otro objeto muy importante: ¡el mismo juego! Es fácil de olvidar. que se envía al objeto colocando el ratón sobre su icono y pulsando el ratón dos veces. Si el ratón apunta a la pulga. de la descripción previa que se hizo del juego. Para un archivo ejecutable. se necesitan los objetos ventana y ratón. Este extrae la posición del ratón del mensaje y envía un mensaje EstaApuntandoA. el diseño y manejo del juego es bastante sencillo. es la de un objeto que envía mensajes al ControladorDeJuego. Sin embargo. Aunque es necesaria para la realización del juego. Ahora ya se puede completar el diseño de alto nivel del juego.25. Este uso del polimorfismo se ilustra en la figura 1. para demostrar completamente la potencia del diseño y la programación orientada a objetos. tiene sentido pensar en el juego como en un objeto. En un lenguaje orientado a objeto. el ControladorDeJuego mata a la pulga. Si el ControladorDeJuego recibe una respuesta afirmativa. ControladorDeJuego. considere la interfaz gráfica de una computadora. pero hacen cosas distintas. la pulga responde al mensaje diciendo que no tiene más resistencia. el polimorfismo es la propiedad que permite que un mensaje pueda significar distintas cosas dependiendo del objeto que lo reciba. El manejo global se ilustra en la figura 1.Fundamentos de Programación Orientada a Objetos • • La jerarquía para la clase Pulga ilustra otra característica de los lenguajes orientados a objetos: el polimorfismo. Objetos similares aceptan a menudo los mismos mensajes. es necesario desarrollar estos objetos. es necesario discutir cómo se puede crear un sistema completo a partir de un conjunto de objetos. Por ejemplo. Si la pulga era lenta. responde sí al mensaje. envía un mensaje de La pulga fue golpeada. ese mensaje significa que debe ejecutar el archivo. a la pulga de la pantalla.25.25. que incluye la posición del ratón. Con las abstracciones Raton y Pulga. Las interacciones entre el ControladorDeJuego y la Pulga se muestran en la figura 1. porque la definición del problema es una descripción de este objeto. El desarrollo de la jerarquía de Pulga ilustra mucha de las características disponibles en un lenguaje orientado a objetos. en caso contrario. Se hará mediante el diseño esquemático de alto nivel del juego CAZA DE LA PULGA. que es el juego. Una pulga lenta da la vuelta cuando llega al borde de la ventana. el Ratón envía el mensaje PulsacionRaton al ControladorDeJuego. la pulsación doble indica que debe arrancar el editor de texto y abrir el archivo para editarlo. la creación y el control de la ventana no tienen un papel fundamental en la operación del juego. mientras que una pulga rápida hace un túnel hasta el otro lado. Se llamará a este objeto. por otro lado. La pulga determina si la posición en el mensaje está dentro de ella. Desde un punto de vista abstracto. Un mensaje típico es una doble pulsación. Por ahora. El ratón. el objeto juego es el elemento que coordina las actividades de otros objetos y asegura el cumplimiento de las reglas del juego. El mensaje contiene la posición en la pantalla del cursor. Si se recibe esta respuesta. Isis Espinosa Salazar .18 mediante la inclusión del mensaje Mover para los objetos: PulgaLenta y PulgaRapida. Ciertamente. el ratón y la pulga. Si se ha sobrepasado la resistencia de la pulga. Recuerde que. El polimorfismo es un concepto natural que se aplica bien a los objetos. Como se mencionó. Se usa el ratón para enviar mensajes a estos objetos. es un componente fundamental del juego. La visión abstracta del ratón. Cuando se pulsa una tecla del ratón. Interacción entre el controlador del juego.

Esboce el diseño de la clase ControladorDeJuego para el juego CAZA DE LA PULGA. Asegúrese de incluir los atributos (es decir. ¿Cuáles son los objetos clave? ¿Cuáles son los atributos y comportamientos de los objetos? ¿Cómo interaccionan los objetos? El ejemplo herencia en la figura 1. en ese caso. Página 53 Ing. 4.24 para incluir una clase PulgaEspectro. ¿Es necesario cambiar las propiedades de Pulga? 2. Esboce un diseño orientado a objetos de una máquina despachadora de refrescos. 6. miembros de datos) y las acciones (es decir. Asegúrese de incluir los atributos (es decir. Por supuesto.Fundamentos de Programación Orientada a Objetos • Si la pulga responde que no. quedan muchos detalles que perfilar para completar la implementación del juego. el ControladorDeJuego crea una nueva ventana y muestra un mensaje diciendo al jugador que ha perdido el juego. Isis Espinosa Salazar . 7. Asegúrese de incluir los atributos (es decir. EJERCICIOS 1. Usando los diseños de los problemas 1 y 3. el controlador muestra un mensaje felicitando al jugador por su habilidad con el ratón. Extienda la jerarquía de la clase de la figura 1. ¿Cómo se podría especificar la posición? b) Trace las acciones que una pulga ejecuta cuando recibe un mensaje Matar. Si se ha eliminado a todas las pulgas sin errores. el ratón no está apuntando sobre ella. miembros de función) que la clase debe tener.24 ignora algunos detalles. miembros de datos) y las acciones (es decir. miembros de función) que la clase debe tener. dibuje un diagrama que muestre cómo podrían interactuar las distintas clases entre sí. Sin embargo. el diseño de alto nivel está resuelto. Considere los siguientes temas: a) La posición es una propiedad de todas las pulgas. 5. Esboce el diseño de la clase Ventana para el juego CAZA DE LA PULGA. Esboce el diseño de la clase Ratón para el juego CAZA DE LA PULGA. miembros de función) que la clase debe tener. miembros de datos) y las acciones (es decir. Una PulgaEspectro desaparece ocasionalmente y reaparece en una nueva posición. 3.

Sign up to vote on this title
UsefulNot useful