P. 1
Guia Ets Fund Prog Orienta Objetos

Guia Ets Fund Prog Orienta Objetos

|Views: 3|Likes:
Publicado porKirris Irisson

More info:

Published by: Kirris Irisson on Jul 12, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

12/03/2015

pdf

text

original

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

Página 6 Ing.2. Cualquier estado de acción se puede representar mediante cualquier estructura de control (secuencia.4). switch. Al aplicar de manera repetida la regla 3 al diagrama de actividad más sencillo.2.] Figura 1. Comience con el diagrama de actividad más sencillo (figura 1. [Nota: Las líneas verticales punteadas de la figura 1. if/else. 4. provoca un diagrama de actividad con estructuras de control anidadas más pulcras. la regla 3 se aplica de nuevo a los estados de acción en la estructura de selección doble. provoca un diagrama de actividad que contiene muchos estados de acción en secuencia (figura 1. Figura 1. 3. Figura 1. 2. Por ejemplo. Entonces.4. al aplicar de manera repetida la regla 2 al diagrama de actividad más sencillo.3. La regla 2 genera una pila de estructuras de control. do/while o for). • • • • Aplicando las reglas de la figura 1.2 se produce un diagrama de actividad con la apariencia de una cuidadosa construcción con bloques. Las reglas 2 y 3 se pueden aplicar con la frecuencia que usted desee. if. 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. Por ejemplo. en la figura 1. Las utilizamos para separar los cuatro diagramas de actividad que muestran la aplicación de la regla 2 de la figura 1. de manera que llamaremos a la regla 2 la regla del apilado. Cualquier estado de acción se puede reemplazar por dos estados de acción en secuencia. • • • • • La regla 3 se llama regla de anidamiento.2 al diagrama de actividad más sencillo. en cualquier orden. Isis Espinosa Salazar .3). Reglas para formar programas estructurados. while. Aplicación repetida de la regla 2 de la figura 1.4 no son parte del UML.Fundamentos de Programación Orientada a Objetos Reglas para formar programas estructurados 1. y reemplaza cada uno de estos estados de acción con una estructura de selección doble.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. por lo tanto. más involucradas y más profundas.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. Si se siguen las reglas de la figura 1.2. de lo contrario. Si no está seguro de si un diagrama en particular es correcto.2 a la inversa. Aplicación repetida de la regla 3 de la figura 1. no se puede escribir un diagrama de actividad con sintaxis incorrecta (tal como el de la figura 1. Página 7 Ing.5 no son parte del UML. Isis Espinosa Salazar . Si el diagrama se reduce al diagrama de actividad más sencillo. Los diagramas que surgen de la aplicación de las reglas de la figura 1.2 al diagrama de actividad más sencillo • • • • • La regla 4 genera estructuras anidadas más grandes. aplique las reglas de la figura 1.5. el original está estructurado. el conjunto de todos los posibles programas estructurados. para reducir el diagrama al diagrama de actividad más sencillo.6).2 constituyen un conjunto de todos los diagramas de actividad posibles y. Aquí los utilizamos como ayudas pedagógicas para mostrar que cualquier estado de acción se puede representar mediante una estructura de control]. no lo está. 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.

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

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

8. Un orden jerárquico basado en las relaciones de la naturaleza se denomina taxonomía. es el de abstracción. sino conocer cómo se utiliza correctamente la función y lo que hace. • Un programa estructurado se construye rompiendo el programa en funciones. La técnica top-down. • • • • 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. El cómo se realiza esta tarea no es importante. 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. Página 10 Ing. Isis Espinosa Salazar . subprogramas o procedimientos).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. en sistemas complejos compuestos de abstracciones.7. o refinamiento sucesivo comienza descomponiendo el programa en piezas manejables más pequeñas. 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. Esta división permite escribir código más claro y mantener el control sobre cada función. ya comentado anteriormente. descendente. conocidas como funciones (subrutinas. es ir del concepto más general al menos general. que realizan tareas menos complejas. 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. En un programa estructurado es suficiente conocer que un procedimiento dado realiza una tarea específica. Una forma de ordenar abstracciones similares. Programa estructurado.

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

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

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. hay complejidad!). Actualmente las nuevas herramientas para hojas de cálculo contienen sistemas expertos. los primeros sistemas gráficos necesitaban que los usuarios especificaran detalles de cómo debería verse el gráfico. Alta Complejidad total del software Complejidad Sencillez para el usuario Baja Figura 1. dando información tan variada como los puntos finales del gráfico. La incapacidad del código estructurado en base a procedimientos. pero esta facilidad tiene un precio. Esencialmente. para proporcionar su reutilización condujo a la búsqueda de otros enfoques de software. Tales sistemas de representación automática son mucho más fáciles de usar. PROGRAMACION ORIENTADA A OBJETOS • Para entender mejor la programación orientada a objetos. Aunque ha habido tremendos avances en el campo del hardware. • • Por ejemplo. 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. 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. A medida que el software es más fácil de usar. el incremento de la complejidad del software.11. La figura 1. 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. Quizá lo más importante es que se han vuelto parte de nuestra vida. haremos un breve estudio sobre las causas fundamentales que llevaron a cabo la creación de la misma.Fundamentos de Programación Orientada a Objetos pueda reutilizar sin realizar una revisión extensiva y sin volver a probarlo y evaluarlo. Parte del problema es que las expectativas para el software han crecido considerablemente. cómo y dónde habría que colocar las etiquetas. que analizan los datos y producen un gráfico de forma automática. la escala. se incrementa su complejidad interna. tener computadoras rápidas y baratas es sólo la mitad de la ecuación. Sin embargo. baratas y más potentes. no han existido avances de la misma magnitud en el diseño de software. Isis Espinosa Salazar . se han convertido en herramientas indispensables para científicos e ingenieros.

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

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

Los módulos se utilizan frecuentemente como una técnica de implementación para tipos abstractos de datos. Con la programación orientada a objetos. Por ejemplo. reducir los costos de desarrollo y mejorar el mantenimiento. Modularidad. e incluso con coordinación difícil entre ellos. los altavoces y la antena. Esencialmente. Es más fácil diseñar e implementar aplicaciones orientadas a objetos. se producen comunicaciones entre ellos mas complejas. 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. el radio puede verse como una caja negra con botones y cables. estos principios son: Principios de diseño en Ingeniería de Software • • • • ‰ ‰ ‰ Abstracción. El encapsulamiento u ocultamiento de la información. es el proceso de separar los aspectos de un objeto en externos e internos. 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. para otros objetos del sistema. sin embargo. Estos principios de diseño de la Ingeniería de Software ya han sido tratados en otra parte de estas notas. ya que los objetos en el dominio de la aplicación se corresponden directamente con los objetos en el dominio del software. • • • • • 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. particularmente si el equipo está disperso geográficamente. Permitir instancias múltiples del tipo. Los aspectos internos son los detalles del funcionamiento del radio. Esta estrategia es ciertamente una práctica frecuente en otros negocios.Fundamentos de Programación Orientada a Objetos un nuevo sistema. La reutilización puede mejorar la fiabilidad. Al igual que los tipos definidos por el 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. es conveniente comprender que los tipos abstractos de datos es uno de los conceptos más interesantes de la abstracción. • • Los módulos son mecanismos de ocultamiento de información y no cumplen básicamente más que los apartados 1 y 2. Hacer disponible un conjunto de operaciones que se puedan utilizar para manipular instancias de ese tipo. • La cantidad de trabajo que conlleva exige el uso de un equipo de desarrolladores. Para instalar y usar el radio en un coche. 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. Los aspectos externos de un objeto deben ser visibles o conocidos. a medida que hay mas desarrolladores. Encapsulamiento u ocultamiento de la información. Proteger los datos asociados con el tipo de modo que sólo se pueda actuar sobre ellos con las rutinas proporcionadas. no se necesita conocer nada de ingeniería eléctrica. El tipo abstracto de datos es un concepto más teórico. como suele ser el caso de proyectos grandes. este proceso de descomposición se extiende a la fase de implementación. Ocultar ciertos aspectos de un objeto permite modificarlos sin afectar a otras partes del sistema. Página 16 Ing. Ahora bien. aunque se trata por todos los medios de que este equipo sea lo más pequeño posible. Isis Espinosa Salazar . Para construir un tipo abstracto de datos se debe poder: ‰ ‰ ‰ ‰ Exponer una definición del tipo. 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. Los aspectos internos son detalles que no deberían afectar a otras partes del sistema. 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. 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. aclaremos un poco más estos conceptos. Por ejemplo.

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

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

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. en nuevas aplicaciones. en su totalidad o en parte. Extensibilidad Facilidad que tienen los productos de adaptarse a cambios en su especificación. Compatibilidad Facilidad de los productos para ser combinados con otros. Entre ellas se destacan las siguientes: • • • • • • • • Eficiencia La eficiencia del software es su capacidad para hacer un buen uso de los recursos que manipula. Fácil de utilizar Un software es fácil de utilizar si se puede comunicar con él de manera cómoda. Robustez Capacidad de los productos software de funcionar incluso en situaciones anormales. Integridad La integridad es la capacidad de un software para proteger sus propios componentes contra los procesos que no tengan derecho de acceso. es su capacidad para soportar los procedimientos de validación y de aceptar juegos de pruebas o ensayos de programas. Verificabilidad La verificabilidad es facilidad de verificación de un software. Isis Espinosa Salazar .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. 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.

Object Pascal. Como Rentsch predijo. 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. y cuyas clases son todas miembros de una jerarquía de clases unidas mediante relaciones de herencia. especialmente aquellas que desarrollaban proyectos a gran escala. creador de la empresa Racional – fabricante de la herramienta Rose para ingeniería de software orientada a objetos . Era difícil poner a punto este software. bases de datos. los módulos. los lenguajes de programación (tales como FORTRAN. • • La década de los noventa fué. en lugar de cosas u objetos (sustantivos). Basic y C) se basaban en acciones (verbos). etc. Antes de la aparición de los lenguajes orientados a objetos. Pascal.e impulsor del lenguaje unificado de modelado UML. los tipos abstractos de datos y los objetos ( este último concepto se verá más adelante ). los programadores siguen viviendo en un mundo orientado a objetos y pueden programar de una manera orientada a objetos. así. programan primordialmente mediante el uso de verbos. autor del méto Booch de diseño orientado a objetos muy popular en la década de los noventa. se hace necesario el desarrollo de una nueva forma de pensar y de desarrollar programas. sin lugar a dudas. • • • • • • • • Página 20 Ing. Los programadores. junto a compañías importantes en el campo del software. Mediante la tecnología de objetos. 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. el desarrollo de sistemas operativos con tiempo compartido y memoria virtual. la década de la programación orientada a objetos. que viven en un mundo de objetos. que los desarrolladores de software sintieron que tenían las herramientas necesarias para realizar mayores adelantos en el proceso de desarrollo de software. ¿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. Grady Booch. se dedican de modo continuo a producir compiladores de lenguajes. la programación orientada a objetos será en los ochenta lo que la programación estructurada fue en la década de los setenta. y 3) las clases se relacionan unas con otras por medio de relaciones de herencia. cómo se puede estructurar información en una computadora. 2) cada objeto es una instancia de una clase. estas unidades no son particularmente reutilizables. 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. En la actualidad la programación orientada a objetos se ha hecho enormemente popular. • • Existen tres importantes partes en la definición: la programación orientada a objeteos 1) utiliza objetos. 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. El software es un asunto complejo. Algunos autores de libros aún recuerdan la gran frustración que sentían las empresas de desarrollo de software. con la disponibilidad de los lenguajes orientados a objetos tales como Java y C++. C++. Se podría decir que este tipo de programación es un nuevo modo de pensar sobre lo que significa computar (computarizar). orientados a objetos. así como cumplir con los requerimientos de Ingeniería de sofware y los factores de calidad. etc. Isis Espinosa Salazar . 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. es decir. si se diseñan apropiadamente tienden a ser mucho más reutilizables en proyectos futuros.. ya que tiene que reinventar las cosas repetidamente. Éste es un proceso más natural de programación y ha dado como resultado un mayor grado de productividad.Fundamentos de Programación Orientada a Objetos Para poder enfrentar todos los problemas anteriores. las entidades de software creadas (llamadas clases). cada uno de los cuales representan una instancia de alguna clase. tales como Smalltalk. En un determinado sentido. Este cambio de paradigma complicó la escritura de programas. como bloques de construcción lógicos (jerarquía de objetos). Ahora. 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. pasando por las funciones o procedimientos. sistemas operativos. Escritores y diseñadores de software. esto se logra con la programación orientada a objetos. como por ejemplo. no algoritmos. 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.

y otras cosas. 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. mencionan que la programación orientada a objetos tiende a producir software que es más comprensible. un objeto es. elevadores. La orientación a objetos fuerza a reconsiderar nuestro pensamiento sobre la computación. herencia y persistencia. sobre lo que significa realizar computación y sobre cómo se estructura la información dentro de la computadora. El polimorfismo permite que un mismo mensaje pueda actuar sobre objetos diferentes y comportarse de modo distinto. Isis Espinosa Salazar . La persistencia se refiere a la permanencia de un objeto. y otros más. Página 21 Ing. de tiempo. La desventaja es el tiempo y esfuerzos que implica el diseño e implementación de nuevo código. Sólo mire a su alrededor. Una idea fundamental es la comunicación de los objetos a través de paso de mensajes. de hecho. esto es. 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. Además de esta idea se añaden los mecanismos de herencia y polimorfismo. La herencia permite diferentes tipos de datos para compartir el mismo código. gente. y por consiguiente tienen dificultad en ver la ventaja de elegir un estilo más apropiado al problema a manejar». De hecho. Más bien. modificar y corregir. vídeo. de cheques. clases e instancias.Fundamentos de Programación Orientada a Objetos • Con las bibliotecas de componentes reutilizables. Existen objetos de datos. casi cualquier sustantivo puede representarse razonablemente como un objeto. Algunas empresas indican que la reutilización de software no es. de facturas. Existen automóviles. Desde el enfoque de un TAD. ¿Qué son los objetos y por qué son tan especiales? • • • • • • • • • • En realidad. mejor organizado y fácil de mantener. es claro que ésta será la metodología clave de la programación para las siguientes décadas. edificios. Vivimos en un mundo de objetos. Cualesquiera que sean los beneficios que se perciban de la programación orientada a objetos. no se enfrentan a métodos alternativos de resolución de un problema. Jenkins y Glasgow observan que «la mayoría de los programadores trabajan en un lenguaje y utilizan sólo un estilo de programación. animales. la tecnología de objetos es un esquema de compactación que permite crear unidades útiles de software. de archivo. 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 registro. tales como la MFC (Microsoft Foundation Classes) y las creadas por Rogue Wave y muchas otras empresas desarrolladoras de software. aviones. mensajes y métodos. Ellos programan en un paradigma forzado por el lenguaje que utilizan. sencillamente. Con frecuencia. semáforos. la cantidad de tiempo para el cual se asigna espacio y permanece accesible en la memoria del computador. permitiendo una reducción en el tamaño del código y un incremento en la funcionalidad. están asociados con la continua evolución y mantenimiento de ese software durante su vida útil. 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». el principal beneficio que obtienen de la programación orientada a objetos. un tipo abstracto de dato al que se añaden importantes innovaciones en lo referente a compartir código y la reutilización. 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). La orientación a objetos se acopla a la simulación de situaciones del mundo real. Los mecanismos básicos de orientación a objetos son: objetos. de audio.

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

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

en otros lenguajes de programación orientados a objetos. en el diseño orientado a objetos de un banco. la programación tiende a ser orientada a objetos. En C++. las clases pueden tener relación con otras clases. Por ejemplo. A menudo. a los componentes de datos de una clase se les llama dato miembro. la unidad de programación es la clase. Página 24 Ing. la clase CajeroBanco necesita relacionarse con la clase CuentaBanco. a través de la cual se obtienen las instancias. Los programadores de C se concentran en escribir funciones. Además. En C++. para construir tipos definidos por el usuario (clases). El programador utiliza tipos predefinidos (y otros tipos definidos por el usuario) como bloques de construcción.Fundamentos de Programación Orientada a Objetos • • • • • • • • • • • • • • • • • • • • También. la programación tiende a ser orientada a acciones. En C. Veremos que el software empaquetado como clases puede reutilizarse en futuros sistemas de software. 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. la unidad de programación es la función. Ciertamente. Cada clase contiene datos. Isis Espinosa Salazar . Podemos construir muchas casas a partir de un plano. Los programadores agrupan acciones dentro de funciones que realizan alguna tarea común y agrupan funciones para formar programas. 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. grupos de clases relacionadas se empaquetan como componentes reutilizables. La más simple de estas relaciones se denomina asociación. Las clases son a los objetos lo que los planos son a las casas. se les denomina métodos). Las ventajas de la orientación a objetos son muchas en programación y modelado de datos. veremos por qué el ocultamiento de información es crucial para la buena ingeniería de software. a una instancia de un tipo definido por el usuario (es decir. una clase) se le llama objeto. En C y otros lenguajes de programación por procedimientos. pero la idea es que los datos existen primordialmente para apoyar las acciones que realizan las funciones. y podemos crear instancias de muchos objetos a partir de una clase. mientras que en C++. 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 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. En C++. así como un conjunto de funciones que manipulan esos datos. Tal como a una instancia de un tipo predefinido como int se le llama variable. las clases contienen funciones que implementan el comportamiento y datos que implementan los atributos de la clase. Los programadores en C++ se concentran en crear sus propios tipos definidos por el usuario llamados clases y componentes. En C++. como Java. 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. 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. los datos son importantes en C. a las funciones que componen una clase se les llama funciones miembro (por lo general. El foco de atención en C++ se centra en las clases (desde las que se crean los objetos) en vez de funciones.

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

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

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

Isis Espinosa Salazar . Muchos lenguajes orientados a objetos fomentan la reutilización mediante el uso de bibliotecas robustas de clases preconstruidas.Fundamentos de Programación Orientada a Objetos • • La reutilización de código en programación tradicional se puede realizar copiando y editando. para localizar clases de interés y depuradores interactivos para ayudar al programador. 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. creando automáticamente una subclase y anulando alguno de sus métodos.

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

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

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

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

Clipper 5.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.2. Objective-C. Ada-95. Orientación a objetos. Smalltalk. Java. Ada-95 soporta. Características de los lenguajes orientados a objetos • Además de las características citadas anteriormente de objetos. o todas. 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. Isis Espinosa Salazar . las características que se citan a continuación: Página 33 Ing. Oyeron. Prolog++. Según esta taxonomía. Visual Object. se considera basado en clases. CLOS. ‰ ‰ Objetos Basado en objetos Ada-83 Actor Clipper 5. y se puede considerar orientado a objetos. clases y herencia. Ada-83 soporta la creación de objetos mediante paquetes (tipos abstractos de datos). Object Pascal. clases y herencia. Simula. Un lenguaje de programación orientado a objetos es un lenguaje basado en clases que soporta también herencia. De acuerdo a la taxonomía de Wegner. no es suficiente que un lenguaje soporte la creación de objetos. Delphi. C++. para ser considerado orientado a objetos. Eiffel. Clu. y en consecuencia Ada es un lenguaje basado en objetos.Fundamentos de Programación Orientada a Objetos ‰ Basado en objetos. además de las propiedades de Ada-83. y es por consiguiente totalmente orientado a objetos. Basado en clases. Actor. C++ soporta la creación de objetos y clases. es necesario que existan construcciones de creación de clases y que soporten herencia adecuadamente. que ha prevalecido en la época actual. Object COBOL. los LPOO deberán tener algunas. 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. así como herencia. Un paquete en Ada no es una definición de tipos como la clase C++. Visual Basic 4/5/6. 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. Si un lenguaje de programación es basado en objetos y soporta además la creación de clases.17.

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

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

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

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

Polimorfismo (y ligadura dinámica) 7. Herencia 6. Sólo clases 5. 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. Criterios de Meyer en lenguajes OO y basados en objetos Criterios 1.Fundamentos de Programación Orientada a Objetos Tabla 1. Gestión automática de memoria 4. Modularización 2. Tipos abstractos de datos 3.

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

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

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

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

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

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

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

Televisor. un reloj. éste es un ejemplo de una capacidad llamada __________________. Elija una organización a la que pertenezca y dibuje un diagrama que ilustre su jerarquía. Considere un cajero automático en un banco. Los _______________ en una especificación de sistema ayuda al programador de C++ a determinar las clases que se requerirán para implementar el sistema. Bicicleta. información. o podemos retroceder y ver a tres personas sentadas en una mesa de conferencias. Nombre algunos de los componentes/módulos de los siguientes sistemas: a) b) c) d) e) Equipo de música. 4) 5) 6) Dé un ejemplo de encapsulamiento en el funcionamiento de un contestador automático telefónico. a esto se le denomina herencia _____________________. Una persona de mantenimiento. Explique cómo cada uno de los siguientes términos y conceptos se pueden aplicar a la noción de un reloj: objeto. dar vuelta a la izquierda o a la derecha. mensajes. 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. Cuando una nueva clase hereda las características de distintas clases diferentes. Si vemos un automóvil como un objeto.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. Los componentes de datos de una clase se llaman ____________ y a los componentes de función de una clase se les llama _________________________. a esta propiedad se le llama ______________________. 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. 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. ¿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. Por lo general. a un objeto no se le permite saber cómo están implementados otros objetos. 7) La mayoría de las organizaciones tienen una estructura jerárquica. La mayor parte de los sistemas son modulares. Isis Espinosa Salazar . Los objetos se comunican entre sí enviándose ____________________. Video. o ir hacia delante y hacia atrás es un ejemplo de _____________ del automóvil. clase. abstracción. datos miembro y funciones miembro. Los objetos se comunican entre sí mediante el uso de __________________ bien definidas. atributo. Página 46 Ing. ¿Cuáles son algunas de las propiedades relevantes del cajero para las siguientes persona? a) b) c) d) Un usuario. considere un reloj de alarma). ocultamiento. Un empleado del banco. El presidente del banco. herencia (por ejemplo. A una instancia de un tipo definido por el usuario se le llama _________________. comportamiento. interfaz. encapsulado. modelado.

Video. 9) Casi todos los dispositivos electrónicos han sido diseñados siguiendo el principio de modularidad. a) b) c) d) e) Belleza. 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. Nombre los principales componentes de los siguientes dispositivos: a) b) c) d) e) f) Televisor. Horno de microondas. Teléfono. Tiempo. Arbol. Radio. Celos. que hace que los dispositivos sean más fáciles de fabricar y reparar. Bosque. Equipo de música. Isis Espinosa Salazar .Fundamentos de Programación Orientada a Objetos 8) ¿Son los siguientes elementos objetos? Justifique su respuesta.

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

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

Tanto si una pulga es rápida como si es lenta. definen una jerarquía como se muestra en la figura 1. tiene posición. Por lo tanto. Estas relaciones. una característica importante de los lenguajes orientados a objetos es que permiten al programador explotar la similitud de los objetos. ambas pulgas son tipos especiales de pulga. Página 50 Ing. 3. Una pulga lenta da la vuelta cuando llega al borde de la ventana. 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. 2 Imagen Velocidad: 3 Dirección: arriba Resistencia: 3 Pulga Posición: 12. 2. mientras que una rápida la atraviesa y reaparece por el borde opuesto de la ventana. que se comportan de forma distinta cuando llegan al borde de la ventana. pulgaLenta y pulgaRapida. Si piensa acerca de ello. Isis Espinosa Salazar .23. la única característica que distingue a ambas pulgas es cómo se mueven. una pulga rápida y una pulga lenta tienen muchas características en común. Sin embargo. De hecho.24. velocidad. Así. dirección y resistencia.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. imagen. 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.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.

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

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

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

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->