Professional Documents
Culture Documents
AREA D E I N F O R M A T I C A Y C O M P U T A C I O N
McGraw-Hill
-
MADRID. BUENOS AIRES. CARACAS GUATEMALA LISBOA MEXICO
NUEVA YORK PANAMA. SAN JUAN SANTAFE DE BOGOTA SANTIAGO. SAO PAULO
.
AUCKLAND HAMBURGO LONDRES MllAN MONTREAL NUEVA DELHl PARIS
SAN FRANCISCO. SIDNEY SINGAPUR ST LOUlS TOKIO TORONTO
Prólogo xvii
Parte 1
EL MUNDO DE LA ORIENTACION A OBJETOS:
CONCEPTOS, RELACIONES, MODELADO Y LENGUAJES
DE PROGRAMACION
25 3 4 1 Definición de objetos
1 10 Desarrollo tiadicioiial frente a oiientado a objetos 3 4 2 Identificación de objetos
1 11 Beneficios de las tecnologías de objetos (TO) 27
29 3 4 3 Duración de los objetos . ..
Resumen 3 4 4 Objetos frente a clases Representación giáfica (Notación de Ege)
3 4 5 Datos internos
Capítulo 2 Modularidad: tipos abstractos de datos 3.4 6 Ocultación de datos
3 5 Herencia
21 Modularidad 31
3 5 1 Sintaxis
2 1 1 L.a estiuctura de un módulo 31 3.5 2 Tipos de herencia .
2.1 2 Reglas de modularización 32 3 6 Comunicaciones eiitie objetos: los mensajes
2 2 Diseno de módulos 35
3 6 1 Activación de objetos
2 2 1 Acoplamieiito de módulos 35 3 6 2 Mensajes .
2.2 2 Cohesión de módulos 35 3 6 3 Paso de mensajes
2 3 Tipos de daios 36 3 7 Estiuctura interna de un objeto
2 4 Abstiacción en lenguajes de progiaiiidción 38 3 7 1 Atributos
2 4 1 Abstracciones de control 38 3.7.2 Métodos
2.4 2 Abstraccióii de datos 19
.- 3 8 Clases . .
2 5 Tipos abstiactos de datos 3.8 1 Una comparación con tablas de datos
2 5 1 Veritajas de los tipos abstI%dctosde daios 3 9 Herencia y tipos
2.5 2 Iinplementación de los TAD . . 3 9 1 Herencia simple (he?eiicia ,jerdrquica)
2 6 Tipos abstractos de datos en 'Turbo Pascal . ,
3 9 2 Herencia múltiple (Iierei~iaeii malla)
2.6 1 Aplicacióii del tipo abstiacto de dato Pila 3 9 3 Clases abstractas
2 7 Tipos abstiactos de datos en Modula-2 3 10 Anulación/Sustitución
2 7 1 Módulos 3 11 Sobrecarga
2 '7 2 Módulos locales 3 12 Ligadura dinámica
2- 7 1
~ Tinos onacos 3 12 1 Funciones o métodos viituales
2 7 4 Tipos transpdientes ., 3.12 2 Polimorfismo
2 7 5 Una versión del tipo abstracto de dato Pila con datos opacos 3 13 Objetos compuestos
7 7. 6. Otra
-. .
~~
aolicacióii del TAD Pila 3 13 1 Un ejemplo de objetos compuestos
2 8 Tipos abstractos de datos en Ada 3 13 2 Niveles de prolundidad
2 8 1 Tipos piiuados 3 14 Reutilización con orientación a objetos
2.8 2 Tipos privados limitados 3 14 1 Objetos y ieutilizacióii
2 9 Tipos abstractos de datos en C . 3 15 Polimorfisino
2.9 1 Un ejemplo de un tipo abstracto de datos en C Resumen
2 10 Tipos abstractos de datos en C + + ..
2 10 1 Definición de una clase Pila en C + + Capítulo 4. Lenguajes de programación orientados a objetos
Resumen
Ejercicios 41 Evolución de los LPOOS . .
4 1 1 Estado actual de los leiiguajes orientados a objetos en la década de
los noventa
Capítulo 3 Conceptos fundamentales de programación orientada a ob- 42 Clasilicacióii de lenguajes orientados a objetos .
jetos 4 2 1 Taxonomía de lenguajes orieiitados a objetos .
4 2 2 Características de los lenguajes oiientddos a objetos
31 Piograiiiación estructuiada 4 2 3 Puros frente a híbridos . .
3 1 1 Desventajas de la piogramación estructuiada
&QuCes la piogramación otientada a objetos" 4 2 4 Tipificación estática freiite a diiiámica
12 4 2 5 Ligadura estática frente a dinámica
3 2 1 El objeto
4 2 6 Revisión de lenguajes orientados a objetos
3 2 2 Ejemplos de objetos 43 Ada , . . .
3 2 3 Métodos y mensajes
4 3 1 Abstracción de datos en Ada
33 Clases 4 3 2 Genericidad eii Ada ..
3 3 1 Irnplementación de clases en lenguajes 4 3 3 Sopoite de herencia en Ada-83
3 3 2 Sintaxis
4 3 4 Soporte Ada para orientación a objetos
34 Un mundo de objetos
Contenido
11 1 Mecanismos de reutilización , ,
126 1 Abstracción mediante plantillas
11 1 1 Herramientas tradicionales de reutilización 12'7 Una aplicación orieiitada a objetos
11 2 Reutilización por herencia . . 12 7 1 Identificar las clases
11 2 1 Ventajas de la reutilización a través de la herencia 12 7 2 Identificar relaciones . .
11 3 Las recompilaciones en C + + 12 7 3 Definir el interfaz de cada clase , ,
Y PUESTA A PUNTO DE PROGRAMAS 13 19 2 Evitar incluir archivos de cabecera más de una vez
Resumen
Ejercicios , , , , , ,
Capítulo 13. De C a C + + , , , , , , , , , , ,
13 15 Llamada a funciones C Programas mixtos C/C++ 15 6 1 Pasar un argumento por valor en lugar de por variable
13 16 El tipo ieferencia , , 15 6 2 Fallos en el valor de retorno de la función , , , ,
13 17 Sobrecarga 15 6 3 No incluir el archivo de cabecera de una función en tiempo de
13 17 1 Sobiecarga de funciones ejecución , ,
A 6 5 El operador rizeof , . , .
A 6 6 Prioridad y asociatividad de operadores
Apéndice C El lenguaje Delphi (Object Pascal) frente a C + + , , , 548
A 6 7 Sobrecarga de operadores C1 El nuevo inodelo de objetos , , , 548
A 7 Entradas y salidas básicas C2 Métodos de clases 549
A 7 1 Salida C3 Definición de métodos 550
A'7 2 Entrada C4 Tipos de m6todos . 550
A 7 3 Manipuladores C5 Anulación de un método 551
A 8 Sentencias . . C6 Self . , . . . . 551
A 8 1 Sentencias de declaración C7 Especificadores de visibilidad de clases 551
A 8 2 Sentencias de expresión C8 Construcción de un nuevo tipo derivado (Herencia) 552
A 8 3 Sentencias compuestas C9 Ligadura estática y dinámica 553
A 9 Sentencias condicionales i j . . C 10 Diseno de clases , , , , 554
A 9 1 Sentencias ij-else anidadas , . C 11 Reutilización 5 5'7
A 9 2 Sentencias de alternativa múltiple: sivitch , ,
E 6 Intertaces 584
E 7 Paquetes 585 PROLOGO
E 8 Excepciones 587 , , , , , ,
E 9. Bibliografía , , 58'7
E 10 Fuente de información en Internet 588
TIPOSABSTRACTOSDE DATOSYCLASES
ANALlSlS Y DISENO ORIENTADO A OBJETOS
Una clase es una caracterización abstracta de un conjunto de objetos; todos
los objetos similares pertenecen a una clase determinada Por ejemplo, un El problema fundamental que debe asumir un equipo de desarrollo de software
conjunto de objetos tales como cuadrados, triángulos, círculos, líneas, etc, es convertir el mundo real en un programa informática. En esencia, la tarea
pertenecen a una clasefigura De modo más formal, una clase define variables clave de la piogramación es describir las tareas de especificación del programa
(datos) y métodos (operaciones) comunes a un conjunto de objetos En realidad, que lesuelve el problema dado,
una clase es un prototipo o generador de un conjunto de objetos Un problema de programación se desciibe normalmente con un conjunto
Una clase bien diseñada especifica un tipo abstracto de dato (TAD) Un de especificaciones (detalles que constituyen el problema real) Las especifica-
tipo de dato es abstracto si las operaciones de alto nivel adecuadas a los tipos ciones son parte de lo que se denomina análisis orientado a objetos (AOO),
de datos están aisladas de los detalles de la implementación asociados con el que iesponde en realidad a la pregunta «¿Qué hace?» Durante la fase de
tipo de datos Así, por ejemplo, si diseñamos una clase cnculo que convierte análisis se piensa en las especificaciones en términos intuitivos y con indepen-
a un círculo en un tipo abstracto de dato, la clase nos proporciona métodos dencia del lenguaje y de la máquina La etapa crítica de esta actividad es
(funciones) tales como dibujar, mover, ampliar, contraer, borrar, etc Se pueden deducir los tipos de objetos del mundo real que están implicados y obtenei
utilizar estos métodos para manipular objetos cilculo de todas las formas los atributos de estos objetos deteiminando su comportamiento e interac-
esperadas Los métodos son todo lo que se necesita conocer sobre la clase ciones
circulo Una estructura de datos fundamental de un círculo puede ser un array, La siguiente fase del proceso de desarrollo de software es el diseño orientado
a objetos (DOO), que responde a la pregunta «j,Cómo lo hace?» Durante esta
un registro, una cadena de caracteres, etc. Los detalles de la representación
interna de un círculo se pueden ignorar mientras se crean, amplían o mueven fase se comienza a crear un modelo de computadora basado en el análisis que
círculos Un círculo como tipo abstracto de dato se centra exclusivamente en realice la tarea específica concreta En esta etapa se piensa en objetos del
operaciones (métodos) apropiadas a los círculos; un clículo como tipo abstrac- mundo real que pueden ser representados como objetos del mundo inforiná-
to de dato ignora totalmente la representación interna de un círculo tico Se deben especificar los objetos con mayor precisión especificando en
La clase es el bloque de constiucción fundamental de un lenguaje de detalle lo que los objetos conocen y lo que pueden hacer, y describe con
programación orientada a objetos Una clase es un tipo abstracto de datos prudencia sus interacciones Durante la fase de diseño se pueden encontrar
junto con un conjunto de transformaciones permitidas de dicho tipo abstracto atributos útiles adicionales y comportamiento de los objetos que no.aparecie-
de datos; puede definir también su interfaz a otras clases o funciones, descu- ron en la fase de análisis o no estaban definidos con claridad
briendo para ello que parte de su descripción interna de datos o conjunto de La diferencia entre A 0 0 y D O 0 no es clara, y es difícil definir la transición
transformaciones permitidas pueden hacerse públicos La regla por defecto es entre ambas etapas De hecho, ninguna de las metodologías de 00 clásicas,
que nada de una clase es pública, a menos que se declare explícitamente por como Yourdon/Coad, Booch o Rumbaugh (OMT) proporcionan reglas preci-
el desarrollador de software que definió la clase sas para pasar de una etapa a otra De hecho, las fases A 0 0 y D O 0 no
Aunque no es completamente una terminología estándar en POO, el tér- representan un proceso estricto de dos etapas, y a veces se funden en una sola
mino objeto se utiliza normalmente para repiesentar una instancia de una Normalmente, ocurrirá que el modelo inicial que se selecciona no es el apro-
xx Prologo Prólogo xxi
piado, y se necesita retroceder y volver a reiterar el proceso sucesivamente Se base, que se recogen en el momento oportuno y en la bibliografía, y que
pueden descubrir especificacioiles adicionales que no se conocían al comenzar recomendamos como lecturas notables y excelentes, así como referencia obli-
su trabajo iriicial y encontrar que los atributos o comportamiento de un objeto gada de todo buen estudioso de las tecnologías de objetos
sean diferentes de lo que se decidió en la etapa de análisis De cualquier forma,
el mejor medio para practicar desarrollo de software orientado a objetos es
realizar el análisis y diseño de ejemplos de todo tipo Por esta causa, en el PROGRAMACION ORIENTADA A OBJETOS
libro se incluyen numerosos ejemplos que tratan de ayudar al lector a fami-
liarizarse con la P O 0 La programación orientada a objetos es una extensión natural de la actual
L.a fase de diseño conduce a la fase de iinplementación, que consiste en tecnología de programación, y representa un enfoque nuevo y distinto al
traducir dicho diseño en un código real en un lenguaje de programación 00 tradicional Al igual que cualquier otro programa, el diseño de un programa
La fase de codificación del proceso de desarrollo 00 se llama programación orientado a objetos tiene lugar durante la fase de diseño del ciclo de vida de
orientada a objetos (POO). desarrollo de software El diseño de un programa 00 es único en el sentido
El proceso de desarrollo orientado a objetos supone, en síntesis, la cons- de que se organiza en función de los objetos que manipulará De hecho,
trucción de un modelo del mundo real que se pueda traducir posteriormente probablemente la parte más difícil de la creación de software orientado a
en un código real escrito en un lenguaje de programación 00 En realidad, objetos es identificar las clases necesarias y el modo en que interactúan entre sí
las tres fases, análisis, diseño y programación, interactúan entre sí L.as deci- Desgiaciadamente, no hay reglas fáciles para determinar las clases de un
siones de progiamación pueden cambiar algunos aspectos del modelo o pue- programa dado L.a identificación de clases puede ser tanto arte como ciencia
den refinar lealmente algunas decisiones anteriores El proceso es algo impreciso, y por esta causa han surgido numerosos métodos
Los objetos pueden cambiar, o incluso modificarse o deducirse de otros que propoicionan reglas para la identificación de clases y las relaciones que
objetos; atributos y comportamiento se pueden también modificar o añadir a existen entre ellas; estos métodos son los citados anteriormente
cada objeto En resumen, el análisis, diseño y programación no constituyen
un proceso único de tres etapas para la resolución de un problema, sino que
todas las etapas interactúan entre sí para resolver los problemas del mundo
real Sin embargo, como regla general, el análisis se debe hacer antes del EL LENGUAJE C++
diseño, y éste se ha de hacer antes de la programación o codificación
C + i todavía no es un lenguaje estándar, aunque ya se encuentra en la fase
final de estandarización C + + es sin duda el lenguaje del futuro, y marca las
NOTACIONES ORIENTADAS A OBJETOS pautas de desarrollo para nuevos lenguajes, como es el caso de Java, el
lenguaje de programación orientado a objetos para desarrollo en Internet, o
El mejor sistema para modelar el mundo real con objetos de un modo práctico Ada-95, el lenguaje de desarrollo para sistemas en tiempo leal también orien-
es disponer de una notacióii gráfica consistente y eficiente Cada metodología tado a objetos
L.as caracteristicas comunes más importantes a las nuevas veisiones de
de análisis y diseño orientado a objetos posee su propia notación
Nuestra experiencia en estos cinco últimos años impartiendo c u ~ s o sde C + + son:
A 0 0 y D O 0 a estudiantes de pregrado, postgrado y profesionales nos ha C + + es esencialmente un superconjunto de C ANSI,
llevado a seleccionar las notaciones que personalmente hemos comprobado C + + tiene las mismas características de tipificación que C ANSI para
que son las más idóneas, tanto desde el punto de vista pedagógico como propiedades no 00
profesional Pensando en un aprendizaje rápido y gradual, hemos seleccionado Los compiladores de C + + aceptan normalmente código escrito en la
tres metodologías de las más populares: versión original de K&R (Kernighan y Ritchie) Generalmente, los co111-
Coad/Yourdon piladores de C + + propoicionan mensajes de error o advertencia cuando
Booch'93 el código C no tiene prototipos
OMT (Rumbaugh et al) Desde el punto de vista específico de sintaxis, algunas caracteristicas de
C han sido mejoradas notablemente:
Junto con otras dos notaciones, que si bien no son tan conocidas, a
nosotros nos han resultado de gran valor y podemos considerarlas excelentes 1 Las funciones de entradalsalida printf y scanf se utilizan rara-
para el aprendizaje de objetos Son las notaciones de Raimund K Ege y David mente en C + + , y en su lugar se emplean cin y cout, que realizan
T'aylor, que hemos incluido en el texto y con ejemplos inspirados en sus textos un trabajo mejor y más eficiente
2 Las constantes #define y las macios han sido sustituidas por el dariración de la versión 3 0, actualmente en fase de estandarizacióii por el
calificador const y las funciones inline comité ANSI
3 Identificadores de tipos en tiempo de ejecución Como C + + es una extensión del C estándar, la mayoila de los progiamas
4 Espacios de nombre C se pueden compilar utilizando un compilador C + +
L.a versión actual estandarizada por ANSI -la citada actualización 3 0-
L.as piincipales diferencias entre los diversos compiladores de C + + son, es la que soportan la mayoría de los fabricantes mundiales: Borland, Micro-
adeinás del precio, entornos integrados de desarrollo (editores, depurado- soft, Watcom, AT&T, etc., en sus últimas actualizaciones tales como 4,515 de
res, etc ), velocidad de compilación, velocidad del código ejecutable, sistema en Borland, Visual C + + 4, la 10 de Watcom, etc
tiempo de ejecución, calidad de mensajes de error e interoperabilidad de
código con otro software: tales como sistemas operativos, sistemas de ventana,
enlazadores u otros programas de aplicación
Otras diferencias incluyen soporte para inanejadores de excepciones y OBJETIVOS DEL LIBRO
plantillas (templates) La mayoría de los compiladores actuales proporcionan
soporte para ambas propiedades Los manejadores (haizdleis) de excepciones Piogiaiizatión Oiieiztada a Objetos Coiiceptor, rizodelado, diseíio y codificacióiz
son construcciones que permiten a los programas recuperar su control ante eiz C + + , es una obra, como su nombre indica, esencialmente de objetos.. Trata
eirores en tiempo de ejecucióil no previstos Las plantillas permitirán a las fundamentalmente de enseñar a programar con tecnologías de objetos, pero
clases ser definidas mediante tipos genéricos de datos al contrario que otras obras -incluso algunas nuestras- centradas exclusi-
vamente en un lenguaje de programación orientada a objetos -casi siempre
C++-, hemos pensado que sería muy interesante -sin abandonar el estudio
de C++- dar mayor importancia a los conceptos teóricos y prácticos fun-
HISTORIA DEL LENGUAJE C++ damentales del mulido de objetos, que sólo son tratados por libros específicos
de las metodologías de A O O / D 0 0 e incluso ingenieria de software 00 y
Al principio de los ochenta, Bjarne Stroustrup diseñó una extensión del len- otros de caiácter avanzado
guaje C al que Ilainó C con clases, debido a que su característica fundamental Desde finales de los ochenta, en que decidimos adentiarnos en las emer-
eia añadirle clases a C El concepto de clase procedía de Simula 67 y servía gentes tecnologías de objetos, se ha producido un cambio radical en el mundo
para captuiar el comportamieilto del inundo real a la vez que oculta los de la ingenieria de software L,os objetos que los años 1988 a 1990 se centraban
detalles de su implementación en experiencias sobre el primitivo lenguaje C + + y Sinalltalk e incipientes
En 1983-84, C con clases fue rediseñado, extendido e implementado en un trabajos en Eiffel, comenzaron a pasar en los años 1990 a 1992 al campo
compilador El lenguaje se denominó C + + y fue descrito poi Stroustrup en profesional, y así nacieron las inetodologías de análisis y diseño orientadas a
Data Abst~actioiziiz C en el Iechnical Jouinal (vol 63, núm. 8, octubre 1984), objetos de primera generación y que han facilitado la transición al nuevo
de AT&T Be11 Laboratories L.a primera versión comercial de C + + estuvo paradigma Las metodologías pioneras se deben a Shlaer y Mellor, que, junto
disponible en 1985 y se documentó en el libio de Bjarne Stroustrup Ilze C + + con Rebeca WirkBrocks, se consideran como creadores del modelado de ob-
Prograi?ziizinqLanguage, editado por Addison-Wesley en 1986. jetos; Yourdon/Coad, autores consolidados de metodologías estrnctuiadas que
El nombre de C++ fue elegido coino variante del lenguaje de programa- se pasaion a metodologías de objetos, y lanzan en esos años dos excelentes
ci6n C Dado aue eia una extensión de C, se decidió elegir C + + debido a
~-~ libros sobre análisis y diseño 0 0 ; Grady Booch, uno de los pioneros del
que el opeiador ++
significa «añadir uno a la variable» y poi consiguiente mundo de ingeniería de software en tiempo real con Ada, que aprovecha su
el lenguaje C + + se supondría que era una ve~sióninmediatamente superior o experiencia para lanzar una metodología de diseño 00 que se ha hecho muy
siguiente a C popular y cuya última edición se publicó en 1993; Rumbaugh et al, autores
En realidad, Stroustrup creó C + + con dos objetivos principales: (1) hacer de la metodología OMT, seguramente la metodología más utilizada en el
compatible C + + con el C ordinario, y (2) ampliar C con construcciones de mundo del software en estos últimos años
P O 0 basadas en la construcción clase de Simula 67. El lenguaje en su forma La siguiente frontera se produce en 1995, cuando se publica el borrado1 0.8
actual ha sido descrito en 1990 por Stroustrup y Ellis en el Anizotated C + + del método unificado diseñado por la unión en una misma empresa (Rational),
Refereizce Maiiual (el ARM)', que sirve como documento base para la estan- de Grady Booch y James Rumbaugh, que han contado también con la cola-
boración de Ivar Jacobson, creador del use case -caso de uso-, concepto
MARGARET E ~ r r sy BJARNE
SrxousrRuP: Tiie Aniiotatud C + + Refefei.eiiie Ma~lual Reading,
teórico fundamental que se ha impuesto en todos los buenos desarrollos de
Mass, Addisoii-Wesiey, 1990 Existe versián en español con el título C + + Maiiual de refeieizcia 00 de los últimos años Desde el punto de vista del lenguaje se está estanda-
coi? ai~utacioizei editado por Addison-\l'esley/Díaz de Santos en 1994 rizando C + + con la versión 3 0 de AT&T y se ha estandarizado Ada con la
xxiv Prólogo Prólogo XXV
versión Ada-95, y se han lanzado al mercado otros lenguajes de objetos CONTENIDO DEL LIBRO
híbridos: Object Pascal, Object COBOL, Delphi, Visual BASIC 4 -con cier-
tas características de objetos-, Visual Object, etc Los lenguajes puros clásicos Este libro se apoya fundamentalmente en el emergente paradigma de la orien-
como Eiffel y Smalltalk luchan por hacerse un hueco en el mercado profesio- tación a objetos y trata de enseñarle sus conceptos básicos, así como las
nal, saliendo de los laboratorios de investigación y universitarios hacia el técnicas de programación de dicho paradigma. Supone que el lector tiene
mundo profesional Internet, el fenómeno social y tecnológico de la década de experiencia anterior en programación en algún lenguaje, tal como BASIC, C
los noventa y del futuro siglo XXI, ha traído el advenimiento de Java un o Pascal; también supone que el lector tiene experiencia en editar, compilar,
lenguaje 00 evolucionado de C + + que la empresa Sum lanzó el año pasado enlazar y ejecutar programas en su computadora De cualquier forma, pen-
y que promete conveitirse en un duro competidor de C + + sando en los lectores que no conocen C ni C + + , hemos incluido un apéndice
Teniendo presente el estado del arte de la ingeniería de software orientada que contiene una guía de referencia del lenguaje C + + , junto con una parte
a objetos y nuestra experiencia peisonal en el Departamento de Lenguajes y completa (Paite IV) que incluye tres capítulos que pretenden enseñar al lector
Sistemas Inf'ormáticos e Ingeniería de Software de la Universidad Pontificia la transición de C a C + +, o simplemente el lenguaje C + + , caso de no conocer
de Salamanca en Madrid, donde hemos impartido numerosos cursos de pro- C/C++, así como reglas piácticas para poner a punto programas en C + + ,
giamación, análisis y diseño orientados a objetos, así como otros cursos, con una amplia relación de errores típicos cometidos en piogramas,
seminarios y conferencias en otras universidades españolas y latinoamericanas El libro consta de cuatro partes que contienen quince capítulos, todos ellos
y en empresas informáticas inultinacionales y escuelas de la administración con una estructura muy similar: teoría y ejeilzplos prácticos desarrollados en la
pública española, hemos considerado los numerosos consejos, sugerencias y versión 1 0 de C + + de ANSI, de modo que prácticainente podrá utilizar con
críticas de alumnos y colegas, y como resultado hemos escrito un contenido cualquier compilador de los coinercializados en la actualidad de las empresas
para esta obra que contiene los conceptos vitales de las tecnologías de objetos Borland, Microsoft, Watcom, etc; un reyuiizeiz del capitulo y eje~ciciospropues-
que confiamos permitan una progresión y aprendizaje rápido y eficiente por tos al lector, de modo que pueda practicar los conceptos aprendidos en el
parte del lector en el inundo de la programación orientada a objetos Para capítulo correspondiente
cumplir estos objetivos, pensamos que sería muy interesante mezclar con el La Parte 1, «El mundo de la orientación a objetos», describe los conceptos
máximo de prudencia conceptos fundamentales tales como: fundamentales de objetos, relaciones, modelado y lenguajes de programación
orientada a objetos (LPOO) El Capitulo 1 ofrece una visión general del
Tipos abstractos de datos desarrollo del software, con una revisión de los conceptos clave del mismo,
Clases y objetos que abarcan desde los factores de calidad del software a la reutilizacióiz de
e Relaciones de objetos: generalizaci6n/especialización, software, pasando poi conceptos clave, como abstracción de datos, encapsu-
Herencia lamiento, jerarquía y polimorfismo, entre otros El Capítulo 2 es una revisión
Modelado de objetos, del iinportante concepto de modularidad y su pieza clave los tipos abstractos
Diseño orientado a objetos de datos Se han utilizado como herramientas de programación los lenguajes
Fundamentos de reutilización de software con objetos Modula-2, Ada, Turbo Pascal, C y C + + El Capítulo 3 es una descripción
Bibliotecas de clases, exhaustiva de los conceptos fundamei~talesde la programación orientada a
objetos (clases, objetos, lenguajes, herencia, sobrecarga, ligadura, objetos com-
Así pues, la obra considera los conceptos teórico-prácticos importantes puestos y reutilizacióii) El Capitulo 4 describe los lenguajes de POO, los
de la programación orientada a objetos, junto con los métodos correspondien- clasifica y realiza una síntesis de las propiedades orientadas a objetos de los
tes de codificación en C + + El contenido del libro se ha diseñado de modo lenguajes seleccionados, en este caso Ada, Eiff'el y Smalltalk El Capítulo 5
que pueda permitir al lectoi ya iniciado en objetos y/o C + + , y al no iniciado trata el importante concepto de ruodelado El proceso de desarrollo de un
adentrarse en el mundo de los objetos de un modo gradual y con la mayor sistema de software comienza con la construccióil de un modelo del mundo
eficacia posible, Para ello se ha pensado que el mejor método podría ser real Este modelo captura normalmente las características más significativas
enseñar al lectoi las técnicas de modelado del mundo real mediante objetos, del problema, y para ello se apoya en el concepto de relaciones entre clases
de modo que cuando se tuviera el modelo idóneo se pudiera pasar fácilmente Las diferentes relaciones junto con la importante propiedad de la herencia y
a la codificación de un programa que resolviera el problema en cuestión sus tipos, se describen también en el Capítulo 5
Para conseguir estos objetivos hemos creído conveniente hacer uso no sólo L.a Parte II incluye los Capítulos 6 al 11 y explica los fundamentos de la
de los conceptos teóricos ya mencionados, sino recurrir a una herramienta programación orientada a objetos (POO) con C + + El Capitulo 6 describe
gráfica que facilite al lector realizar el análisis y diseño previo a la progra- cómo declarar y construir clases, diseños y reglas prácticas para la construc-
mación que redunde en el mayor grado de eficiencia por parte del pro- ción de clases El Capítulo 7 examina las clases abstractas y la propiedad de
gr amador la herencia, junto con la sintaxis para su implementación y el problema de la
xxvi Prologo Prólogo xxvii
Iierencia repetida; el capítulo se termina con una aplicación práctica El E n particular, deseo expresa1 ini reconocimiento a mis colegas del Departa-
Capítulo 8 presenta la propiedad de polimorfismo, junto con el concepto de inento de Lenguajes y Sistemas Informáticos de la Facultad y Escuela Uni-
ligadura El Capitulo 9 describe las plantillas (te~nplater)y muestra el concepto versitaria de Informática de la Universidad Pontificia de Salamanca, en el
de genericidad; examina la sintaxis para declarar plantillas de funciones y de cuiiipus de Madrid, que han impartido e imparten conmigo Prvgramacióit
clases, así como la definición de sus funciones miembro y el modo de instanciai Orieittaúa a Objetos dentio de la asigiiatuia Metodología de la Programación,
las clases El Capítulo 10 presenta el concepto de excepción, junto con su así coino Análisis y Diseño Orientados a Objetos, cuyas sugerencias, consejos y
manejo o manipulación (eirores en tiempo de ejecución), y examina el método críticas han permitido los apuntes originales de la asignatura en este libro que
empleado por C + + para lanzar y capturar excepciones; se describe la sintaxis hoy ve la luz Estos profesores son: Ignacio Zahonero, Antonio Reus, Paloina
de C + + para implementar estas operaciones y muestra cómo manejar excep- Centeiiera, Rosa Hernández, Rafael Ojeda, Fernando Davara, M.TL.uisaDíez,
ciones El Capítulo 11 describe la reutilización de software con C + + y los Daniel Gaicía y L.uis Doieste De un modo especial han contribuido a esta
diferentes métodos einpleados para ello Asimismo, se describen las bibliotecas obra las profesoras Paloma Centenera, María Luisa Díez y Rosa Hernández,
y contenedores de clases que han volcado su experiencia docente personal en la revisión de las galeiadas
La Parte 111 incluye el transcendental Capitulo 12, que describe los prin- de esta obra; tras su lectura han detectado erratas y sobre todo me han dado
cipios para el desarrollo orientado a objetos y especialmente su diseño Se consejos, sugerencias y aportaciones personales que han permitido mejoiar la
describen las notaciones gráficas de las metodologías Booch, YourdonJCoad versión original de esta obra Gracias, amigas y colegas, por vnestia ayuda
y Ruinbaugh (OMT), junto con las reglas prácticas para la implementación También el piofesor Ignacio Zahoneio ha leido parte de las galeradas y me
con C + + de las diferentes relaciones entre clases; se incluye una pequeña ha sugerido ideas de mejora Aunque no han intervenido directamente en la
aplicación orientada a objetos L.a Parte IV «El lenguaje C + + : Sintaxis, obra hay nunierosísiinas peisonas que han contribuido eficientemeiite en la
construcción y puesta apunto de programas» contiene los Capítulos 13 a 15 redacción final de esta obra, sin su colaboiación esta obra no estaría ahora
El Capítulo 13 describe las características más sobresalientes de C + + que lo en la calle Son todos mis alumnos de los últimos cinco años a los que he
diferencian de C en el sentido de mejorarlo y ampliarlo. El Capítulo 14 explica impaitido cursos, seminarios y conferencias sobre tecnologías oiientadas a
un sistema piáctico para construir programas en C/C++ junto con el con- objetos (análisis, diseño, programación y bases de datos) en universidades
cepto de programas multiarchivos y el sistema para construir arcliivos proyec- españolas y latinoamericanas, así coino en centros de formación de empresas
to La puesta a punto de programas en C + + se explica en el Capítulo 14; en multinacionales y de la administración española Ellos me haii alentado eii
este capítulo se dan reglas piácticas para depurar programas con una extensa todo momento a difundir las teciiologías de objetos y de ellos he recibido todo
enumeración de errores típicos en el desarrollo de programas tipo de ciíticas, consejos y sugerencias que he volcado en muchos casos en el
Aunque el lenguaje base del texto es C + + se pretende que el lector pueda libro Por último, deseo expiesar de modo muy especial mi agiadecimiento a
codificar fácilmente los conceptos fundamentales de objetos y comenzar el Joige Piernavieja, mi antiguo editor -y, sin embargo, anzigo- que inició la
aprendizaje de la P O 0 con otros lenguajes Por esta causa los Apéndices A a edición de esta obra y que por sus nuevas iespousabilidades profesionales iio
E incluyen guías de referencias de sintaxis de los lenguajes C + + , Delphi, la ha podido terminar, pero su coiisejo y aliento al igual que tantas otras veces
TuiboJBorland Pascal, Ada-95 y lava -el nuevo lenguaje orientado a objetos nunca me faltaron. A mi nuevo editor y también amigo Pepe Doinínguez que
de Interrzet- El Apéndice F explica un concepto importante y específico de ha teiiiiinado la obra; mi agradecimiento por su paciencia y comprensión Al
C + i : la sobrecaiga de operadores L.a serie de apéndices se coinpleta con el lector que ha confiado en esta obra en la esperanza de que le sea lo más útil
Apéndice G, que contiene síntesis de las notaciones gráficas de las metodo- y eficaz posible en su formación en programación orientada a objetos
logía~de análisis y diseño oiieiitadas a objetos más populares y usadas en el
libro Estas iiotacioiies se han extraído de las fuentes originales de las meto- En Ca~chelejo(Andaluciu-Espaiia), verano de 1996
dología~utilizadas: Booch'93, OMT (Rumbaugh et al) y Coad/Yourdon Por El autor
último, se incluye un glosario de términos de objetos que facilitan la compren-
sión del lector La bibliografía contiene los libros consultados por el autor en
la escritura de la obra, incluyendo los libros base de las metodologías de A 0 0
y D O 0 utilizadas en el libio,
AGRADECIMIENTOS
Muchas son las peisonas que me han prestado ayuda de una u otra forma en
la elaboración de esta obia y a las que debo mi agradecimiento más sincero
PARTE 1
EL M U N D O DE LA ORlENTAClON
A OBJETOS: CONCEPTOS,
RELACIONES, MODELADO
Y LENGUAJES
DE PROGRAMACION
EL DESARROLLO DE SOFTWARE
CONTENIDO
1.1.. LA COMPLEJIDAD INHERENTE AL SOFTWARE incluso millones de líneas de código Esta característica se facilita descompo-
niendo nuestia implementación en centenales y a veces millones de módulos
independientes Esta cantidad de trabajo exige el uso de un equipo de desarro-
Como Brooks sugiere, «la coinplejidad del software es una propiedad esencial, Iladores, aunque se trata por todos los medios de que este equipo sea lo más
no accidental» Esta complejidad inherente al software, como dice Booch, se
pequeño posible Ahora bien, a medida que haya más desarrolladores, se pro-
deriva de cuatro elementos: la complejidad del dominio del problema, la dificul-
ducen comunicaciones entre ellos más complejas, e incluso con coordinación
tad de gestionar el proceso de desarrollo, la posible flexibilidad a través del
difícil entre ellos, particularmente si el equipo está disperso geográflcamente,
software y los problemas de caracterización del comportamiento de sistemas
como suele ser el caso de proyectos grandes
discretos
La rotura de una aplicación en entidades y relaciones que son significativas
a los usuarios es un análisis convencional y técnicas de diseño Con la progra-
mación orientada a objetos, este pioceso de descomposición se extiende a la
1.1.1. La complejidad del dominio del problema fase de implementación. Es más fácil diseñar e implementar aplicaciones orien-
tadas a objetos, ya que los objetos en el dominio de la aplicación se correspon-
Los pioblemas que se intentan resolver con software implican normalmente den directamente con los objetos en el dominio del software
elementos de ineludible coinplejidad, en los que se encueiitran una gran cauti-
dad de requisitos, en muchas ocasiones contiadictorios Esta complejidad se
produce por las dificiles interacciones entre los usuarios de un sistema y sus
desarrolladores: los usuarios encuentran generalmente muy difícil dar precisión
1.1.,3.. La flexibilidad a través del software
sobre sus necesidades de forma que los desarrolladores puedan comprender En
casos extremos, los usuarios pueden tener sólo ideas vagas de lo que se desea en El software ofrece flexibilidad, de modo que es posible para un desarrollador
un sistema software expresar prácticamente cualquier clase de abstracción.
Por otra parte, los usuarios y desarrolladores tienen diferentes perspectivas Los sistemas orientados a objetos proporcionan el rendimiento, la flexibi-
de la naturaleza del problema y hacen suposiciones diferentes sobre la natnrale- lidad y funcioualidad requerida para implementaciones prácticas La progra-
za de la solución El medio común de expresar los requisitos hoy día es utilizar mación se puede hacer con extensiones de lenguajes comerciales, tales como
un giaii volumen de textos, en ocasiones acompañados por esquemas y dibujos Object-Pascal (Turbo Pascal, Borland Pascal, Mac Pascal, etc) y C + + , que
Tales documentos son difíciles de comprender, están abiertos a diferentes inter- incorporan a sus típicas propiedades las propiedades oiientadas a objetos, y
pretaciones y con frecuencia contienen elementos que son diseños en lugar de lenguajes 00 puros, como Smalltalk y Eiffel Por otra parte, las ayudas de
requisitos esenciales programación actual mejoran la capacidad del programador para administrar
Otra complicación frecuente es que los requisitos de un sistema software y modificar sistemas mientras se desarrollan
cambian durante su desariollo Esto supone que un sistema grande tiende a La programación orientada a objetos expande también la variedad de apli-
evolucionar con el tiempo y el mantenimieiito del software en ocasiones es un caciones que se pueden programar, debido a que se Iiberan las restricciones de
término que no siempre está bien acuiíado los tipos de datos predefinidos
Para ser más preciso, existen diferentes términos a definii: el mantenimiento L.a programación orientada a objetos acomoda estructuras de datos hetero-
busca errores; la evolución responde a cambios de requisitos, y la conservación, géneo~y complejos Se pueden añadir nuevos tipos de datos sin modificar
cuando se utilizan medios para mantener piezas de software en funcionamiento código existente
Desgraciadamente, la realidad sugiere que un porcentaje alto de los recursos de
desarrollo de software se gastan en la conservación del software
1.,2..
LA CRISIS DEL SOFTWARE
1..1.2. La dificultad de gestionar el proceso de desarrollo En 1968 una conferencia sobre software, patrocinada por la OTAN, asumió los
términos iizgenieiia del roftware y ciisis del software Con estos términos se
El tamaño de un piograma no es una gran virtud en un sistema de software Sin quería expresar que el software era caro, poco fiable y escaso
embargo, la esciitura de un gran programa requiere la escritura de grandes Las metodologías y técnicas estructurales que han reinado en la década de
cantidades de nuevo software y la rentilizacióu del software existente Recorde- los setenta y ochenta no han eliminado el problema, y de hecho la crisis del
mas que hace dos o tres décadas los progiamas en lenguaje emsamblador se software continúa hoy en día Pese a las muchas herramientas y métodos utili-
construían a base de centenares de líneas Sin embargo, hoy es usual encontrar zados, los problemas del diseño descendentes permanecen igual, posiblemente
sistemas en funcionamiento cuyo tamaño se mide en centenares de millares, o debido a que la complejidad del problema ha crecido considerablemente
6 Programaoon orientada a objetos
El desarrollo de soitware 7
Entre las diferentes fases del ciclo de vida del software (Fig 1 l), el mante-
nimiento, aunque en tiempos fue despreciada su importancia, se considera ac- Los cambios iealizados en la evolución de un progiama son el punto débil
tualmente como u110 de los problemas más rigurosos en el desarrollo del soft- de los métodos tradicionales de desarrollo de software, siendo paradójicamente
ware uno de los puntos fuertes de los métodos de desarrollo de software orientado a
objetos
En 1986, Fredrick P Brooks', en un famoso artículo, apuntaba que en los
Análisis últimos diez años no se había pioducido ningún progreso significativo en el
desarrollo de software, y analizaba ciiticamente todas las tecnologías más pio-
metedoras Aunque él confesaba que tenía más confianza en la prograiilación
Diseño orientada a objetos que en cualquiei otra tecnología, mantenía dudas sobre sus
ventajas efectivas
Recientemente, las propuestas de reusubilidud o i eulilización, «reusability»,de
Implementación coinponeilles soJtiva~e,se considera11 como bloques iniciales para la construc-
ción del prograina, de modo siinilar a la conslrucción de cualquier objeto
complejo (tal como un automóvil) que se construye ensamblando sus partes
En respuesta al artículo de Brooks, Brad Cox2, el inventor de Objective-C,
publicó un artículo en el que esencialmente rebatía las tesis de Biooks:
Eficiencia
La eficiencia del software es su capacidad pala hacer u11 buen uso de los recui-
Mantenimiento sos que manipula
67 %
Figura 1 2 Costes de las diferentes fases del ciclo de vida
de un proyecto software. Bnoo~s,Fredeiik P li : « N o Silvei Bullet~,Coiiipurei 10-19, abril 1986
Cox, Biad J : «Thei-e is a Silver Bulleta, Bi,te 209-218, octubre 1987
8 Prograrnacion orientada a objetos El desarrolio de software 9
alienta el uso de abstracciones de contiol, tales como bucles o sentencias if-then, otros piopósitos En Pascal existe el ámbito local y global Cualquier ámbito
que se han incorporado en lenguajes de alto nivel Estas sentencias de control que permite acceso a los cuatro procedimientos debe permitir también el acceso
permitieron a los programadores abstraer las condiciones comunes para cam- a sus datos comunes Para iesolver este problema se ha desarrollado un meca-
biar la secuencia de ejecución nismo de estructuración diferente
El proceso de abstracción fue evolucionando desde la aparición de los pri-
meros lenguajes de programación El método más idóneo para controlar la
complejidad fue aumentar los niveles de abstracción En esencia, la abstracción 1.,5..4. Módulos
supone la capacidad de encapsular y aislar la información del diseño y ejecu-
ción En un determinado sentido, las técnicas orientadas a objetos pueden verse Un módulo es una técnica que proporciona la posibilidad de dividir sus datos y
como un producto natural de una larga progresión histórica, que va desde las procedimientos en una parte privada -sólo accesible dentro del módulo- y
estructuras de control, pasando por los procedimientos, los módulos, los tipos pai te pública -accesible fuera del módulo- Los tipos, datos (variables) y
abstractos de datos y los objetos procedimientos se pueden definir en cualquier parte,
En las siguientes secciones describiremos los mecanismos de abstracción El criterio a seguii en la construcción de un inódulo es que si iio se necesita
que han conducido al desarrollo profundo de los objetos: procedimientos, mó- algún tipo de información, no se debe tener acceso a ella Este criterio es la
dulos, tipos abstractos de datos y objetos ocultacióiz de infornzacióiz
Los módulos resuelven algunos problemas, pero no todos los problemas del
desarrollo de software Por ejemplo, los módulos permitirán a nuestros progra-
1.5..3. Procedimientos madores 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 programa-
Los procedimientos y funciones fueron uno de los primeros mecanismos de dor ha desarrollado un tipo de dato Complejo (representación de un número
abstraccióu que se utilizaron ampliamente en lenguajes de programación Los complejo) y ha definido las operaciones aritméticas sobre números complejos
procedimientos permitían tareas que se ejecutaban rápidamente, o eran ejecu- -suma, resta, multiplicación y división; asimismo ha definido rutinas para
tadas sólo con ligeras variaciones, que se reunían en una entidad y se reutiliza- convertir números convencionales a complejos Se presenta un problema: sólo
ban, en lugar de duplica1 el código varias veces Por otra parte, el procedimien- puede manipular un número complejo El sistema de números complejos no
to proporcionó la primera posibilidad de ocultación de ilzfolmación Un será útil con esta restricción, pero es la situación en que se encuentra el progra-
programador podía escribii un procedimiento o conjunto de procedimientos mador con módulos simples
que se utilizaban por otros programadores Estos otros programadores no Los módulos pioporcionan un método efectivo de ocultación de la informa-
necesitaban conoce1 con exactitud los detalles de la implementación; sólo nece- ción, pero no permiten realizar irzstaizciación, que es la capacidad de hacer
sitaban el interfaz necesaiio. Sin embargo, los procedimientos no resolvían múltiples copias de las zonas de datos
todos los problemas En particular, no era un inecanismo efectivo para ocultar
la información y pala resolver el problema que se producía al trabajar múlti-
ples piogramadores con nombres idénticos 1.5.5.. Tipos abstractos de datos
Para ilustra1 el problema, consideremos un programador que debe escribir
un conjunto de rutinas para implementar una pila Siguiendo los criterios clási- Un tipo abstiacto de datos (TAD) es un tipo de dato definido poi el programa-
cos de diseno de software, nuestro programador establece en primer lugar el dor que se puede manipular de un modo similai a los tipos de datos definidos
interfaz visible a su trabajo, es decir cuatio rutinas: meter,sacar,pilavacía por el sistema Al igual que los tipos definidos por el sistema, un tipo de dato
y pilallena A continuación iinplementa los datos mediante arrays, listas abstr.acto corresponde a un conjunto (puede ser de tamaño indefinido) de valo-
enlazadas, etc Naturalmente, los datos contenidos en la pila no se pueden res legales de datos y un número de operaciones primitivas que se pueden
hacer locales a cualquiera de las cuatro rutinas, ya que se deben compartir por realizar sobre esos valores Los usuarios pueden crear variables con valores que
todos. Siil embargo, si las únicas elecciones posibles son variables locales o están en el rango de valores legales y pueda operar sobre esos valores utilizan-
globales, entonces la pila se debe mantener en variables globales: por el contra- do las operaciones definidas Por ejemplo, en el caso de la pila ya citada se
rio, al se1 las variables globales, no existe un método para limitar la accesibili- puede definir dicha pila como un tipo abstracto de datos y las operaciones
dad o visibilidad de dichas variables Por ejemplo, si la pila se representa sobre la pila como las únicas operaciones legales que están permitidas para ser
mediante un array denominado datospila,este dato debe ser conocido por realizadas sobre instancias de la pila
otros programadores, que puedan desear crear variables utilizando el mismo Los módulos se utilizan frecuentemente como una técnica de implementa-
nombre pero relativo a las referidas rutinas De modo similar, las rutinas cita- ción para tipos abstractos de datos, y el tipo abstracto de datos es un concepto
das están reservadas y no se pueden utilizar en otras paites del programa para más teórico Para construir un tipo abstracto de datos se debe poder:
El desarrollo de software 15
14 Programacion orrentada a objetos
L.a pei ti~teizciase refiere a la permanencia de un objeto, esto es, la cantidad
1 Exponei una definición del tipo de tiempo para el cual se asigna espacio y permanece accesible en la memoiia
2 Hacer disponible un conjunto de operaciones que se puedan utilizar del computador
para manipular instancias de ese tipo
3 Protegei los datos asociados con el tipo de modo que sólo se pueda
actuar sobre ellas con las rutinas proporcionadas 1.6. U N NUEVO PARADIGMA DE PROGRAMACION
4 Hacei instancias múltiples del tipo
Los módulos son mecanisinos de ocultación de información y no cumplen La piogiaiizacióiz oiientada a objetos (POO)* se suele conocer como un nuevo
básicamente más que los apartados 2 y 1 Los tipos abstractos de datos se paradigiiza de programación Otros paradigmas conocidos son: el paiadigiiza de
implementan con iiiódulos en Modula-2 y paquetes en CL.U o Ada la prog~aiizacióiziiizpeiativa (con lenguajes tales como Pascal o C), el paiadigiiia
de la prograiilación lógica (PROLOG) y el paiadigiiza de la progiaiiiacióiz fuizcio-
iza1 (Lisp) El significado de paiadigiizu3 (paradigiiza en latín; paradeigiiza e11
griego) en su oiigen significaba un ejemplo ilustrativo, en particular enunciado
1.,5..6. Objetos modelo que mostraba todas las inflexiones de una palabra En el libro Tlie
St~u(tu1eo j Scieiztzfic Revolutioizs, el historiador Thomas Kuhn4 describía un
Uii objeto es sencillamente un tipo abstracto de datos al que se añaden impor- paradigma como un conjunto de teorías, estándar y métodos que juntos repre-
tantes innovaciones en compartición de código y reutilización L.os mecanismos sentan un medio de organización del conocimiento: es decir, u11 medio de
básicos de orientación a objetos son: objetos, ineizsujes y iizétodos, clases e iizs- visualizar el mundo En este sentido, la piogramación orientada a objetos es un
taizcias y heieiiciu nuevo paradigma La orientación a objetos íberza a reconsideiar nuestro peii-
samiento sobre la computación, sobre lo que significa realizar computación y
sobre cómo se estructura la información dentio del computador5
Conceptos clave Jenkins y Glasgow observan que «la mayoiía de los programadores traba-
jan en un lenguaje y utilizan sólo un estilo de programación Ellos programan
I
I Abstracción Encapsulación
u
Persistencia
en un paradigma forzado por el lenguaje que utilizan Con frecuencia, no se
enfrentan a métodos alternativos de resolución de un problema, y por consi-
guiente tienen dificultad en ver la ventaja de elegir un estilo más apropiado al
problema a manejai» Bobrow y Stefik definen un estilo de programación como
«un medio de organización de piogramas sobre la base de algún modelocon-
Polimotiismo Genericidad ceptual de programación y un lenguaje apiopiado pala hacer programas en un
estilo claro» Sugieren que existen cuatro clases de estilos de programación:
Orientados a procedimientos Algoritmos
Orientados a objetos Clases 11 objetos
Entidades básicas Oiientados a lógica Expre~adoeiz cúlculo de piedicadf~r
Orientados a reglas Reglas if-then
No existe ningún estilo de progiainación idóneo para todas las clases de
Métodos Instancias Jerarquía programación La orientación a objetos se acopla a la simulación de situacio-
nes del mundo real
En POO, las entidades centrales son los objetos, que son tipos de datos que
Figura 1 . 3 Principios básicos de la orientación a objetos encapsulan con el mismo nombie estructuras de datos y las opeiaciones o
algoritmos que maiiipulan esos datos
Una idea fundamental es la coinunicación de los objetos a través de paso de
iizeizsajes Además de esta idea, se añaden los mecanismos de heienciu. 11 polimor- ' Un ejemplo que sirve como modelo o patrón: Dicrioiiai.)i o/ S<ieitce aiid leiliizoloq> Acadeinic
fisiizo L.a herencia peimite diferentes tipos de datos para compartir el mismo Press, 1992
código, peimitiendo una reducción en el tamaño del código y un incremento en ' KUHIV,Thomas S : The Stiucfure o/ S<icizt$i Reooiuiioii 2 " e d , Uiiiversity of Cliicaga Press
la funcionalidad El polimorfismo permite que un mismo mensaje pueda actuar Chicago, 19'70.
Object-Oriented Programming (OOP)
sobre objetos diferentes y comportarse de modo distinto
16 Programacion orientada a objetos El desarrollo de software 17
1.7.. ORlENTAClON A OBJETOS natural L.as técnicas orientadas a objetos proporcionan mejoras y metodo-
logía~para construir sistemas de software complejos a partir de unidades de
L.a orientación a objetos puede describiise como el conjunto de dircipliizas (in- software modularizado y reutilizable
geizielia) que derari,ollail y iizodelizaiz softivare que facilitan la construcción de Se necesita un nuevo enfoque para construir software en la actualidad Este
sisteiizay cori~plejosa pal tii de coinpoizeiztes nuevo enfoque debe ser capaz de manipular tanto sistemas grandes como pe-
El atractivo intuitivo de la orientación a objetos es que proporciona concep- queños y debe crear sistemas fiables que sean flexibles, mantenibles y capaces
tos y herramientas con las cuales se modela y representa el mundo real tan fiel- de evolucionar para cumplir las necesidades de cambio
mente como sea posible Las ventajas de la orientación a objetos son muchas en L.a tecnología orientada a objetos puede cubrir estos cambios y algunos
programación y modelación de datos Como apuntaban Ledbetter y Cox (1985): otros más en el futuro
La orientación a objetos trata de cumplir las necesidades de los usuarios
La programación orientada a objetos permite una representación más directa finales, así como las propias de los desarrolladores de pioductos software. Estas
del modelo de inundo tea1 en el código El resultado es que la transformación tareas se iealizan mediante la modelización del mundo real El soporte funda-
radical noimal de los requisitos del sistema (definido en términos de usuario) a la mental es el modelo objeto Los cuatro elementos (propiedades) más importan-
especificación del sistema (definido en términos de coinputador) se reduce consi- tes de este modelo6 son:
deiablemente
Abstracción
La Figura 1 4 ilustra el problema Utilizando técnicas convencionales, el Encapsulación
código generado para un problema de mundo real consta de una primera Modularidad
codificación del problema y a continuación la transformación del problema en Jerarquía
términos de un lenguaje de coinputador Von Newmann Las disciplinas y técni-
cas orientadas a objetos manipulan la transformación autornáticamente, de Como sugiere Booch, si alguno de estos elementos no existe, se dice que el
inodo que el volumeil de código codifica el problema y la transformación se modelo no es orientado a objetos
minimiza. De hecho, cuando se compara con estilos de programación conven-
cionales (plocediiizerztales por procedinzie~ztor),las reducciones de código van 1..7.1. Abstracción
desde un 40 por 100 hasta un orden de magnitud elevado cuando se adopta un
estilo de piogiamación orientado a objetos. La abstracción es uno de los medios más importantes, mediante el cual nos
Los conceptos y herramientas orientados a objetos son tecnologías que enfrentamos con la complejidad inherente al software La abstracción es la
permiten que los problemas del inundo real sean expresados de modo fácil y propiedad que permite representar las caracteiísticas esenciales de un objeto,
sin preocupaise de las restantes caracteiísticas (no esenciales)
Una abstiacción se centia en la vista externa de un objeto, de modo que
sirva para separar el comportamiento esencial de un objeto de su implementa-
ció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
El elemento clave de la programación orientada a objetos es la clase Una
f1-- Transformación de "017 Newrnan clase se puede definir como una descripción abstracta de un grupo de objetos,
cada uno de los cuales se diferencia por su estado especifico y por la posibilidad
de realizar una serie de operacioizer Por ejemplo, una pluma estilográfica es un
obieto que tiene un estado (llena de tinta o vacia) v sobre la cual se vueden
realizar algunas ~ ~ e r a c i o n e s ' ( ~ejemplo
or escribir, piner o quitar el capuchón,
llenar de tinta si está vacía)
La idea de escribir programas definiendo una serie de abstracciones no es
nueva, pero el uso de clases para gestionar dichas abstracciones en lenguajes de
1.,7..2. Encapsulación
por ejemplo dibujar, esta tarea será distinta según que la clase sea un triángulo, 1.8. REUTlLlZAClON DE SOFTWARE
un cuadrado o una elipse Esta propiedad es el polimorfismo, que permite que
una misma función se comporte de diferente forma según sea la clase sobre la Cuando se construye un automóvil, un edificio o uii dispositivo electiónico, se
que se aplica La función dibujar se aplica igualmente a un círculo, a un cuadra- ensamblan una serie de piezas independientes, de modo que estos componentes
do o a un triángulo, y el objeto ejecutará el código apropiado dependiendo del se reutilicen, en vez de fabricarlos cada vez que se necesita construir un automó-
tipo especifico vil o un edificio En la construcción de software, esta pregunta es continua ¿Por
El polimorfismo requiere ligadura tardia o postergada (también llamada qué no se utilizan programas ya construidos para formar programas más gran-
dinámica), y esto sólo se puede producir en lenguajes de programación orienta- des? Es decir, si en electrónica los computadores y sus periféricos se forman
dos a objetos Los lenguajes no orientados a objetos soportan ligadura tempra- esencialmente con el ensamblado de circuitos integrados, jexiste algún método
na o anterior; esto significa que el compilador genera una llamada a un nombre que permita realizar grandes programas a partir de la utilización de otros
específico de función y el enlazador (linker) resuelve la llamada a la dirección programas ya realizados? ¿Es posible reutilizar estos componentes de software?
absoluta del código que se ha de ejecutar En POO, el programa no puede L.as técnicas orientadas a objetos proporcioiian un mecanismo para cons-
determinar la dirección del código hasta el momento de la ejecución; para truir cornporzentes de rofrware reutilizables que posterioimente puedan ser intei-
resolver este concepto, los lenguajes orientados a objetos utilizan el concepto conectados entre sí y formar grandes proyectos de software8
de ligadura tardia Cuando se envfa un mensaje a un objeto, el código que se En los sistemas de programación tradicionales, y en particular en los basa-
llama no se determina hasta el momento de la ejecución El compilador asegura dos en lenguajes de programación estructuiadas (tales como FORTRAN,
que la función existe y realiza ve~ificaciónde tipos de los argumentos y del C, etc ), existen las bibliotecas de funciones, que contienen funciones (o procedi-
valor de retorno, pero no conoce el código exacto a ejecutar mientos, según el lenguaje) que pueden ser incorporados en diferentes progra-
Para realizar la ligadura tardia, el compilador inserta un segmento especial mas En sistemas orientados a objetos se pueden constiuir componentes de
de código en lugar de la llamada absoluta Este código calcula la dirección del software reutilizables, al estilo de las bibliotecas de funciones, normalmente
cuerpo de la función para ejecutar en tiempo de ejecución utilizando informa- denominados bibliotecas de softivare o paquetes de softivare reutilizables Ejem-
ción almacenada en el propio objeto Por consiguiente, cada objeto se puede plos de componentes reutilizables comercialmente disponibles son: 'Turbo Vi-
comportar de modo diferente de acuerdo al contenido de ese puntero Cuando sión de Turbo Pascal 0L.E 2.0 de C + + , jerarquía de clases Smalltalk, clases
se envía un mensaje a un objeto, éste sabe qué ha de hacer con ese mensaje MacApp para desarrollo de interfaces gráficos de usuario en Object Pascal,
disponibles en Apple, la colección de clases de Objective-C, etc.
En el futuro inmediato, los ingenieros de software dispondrán de catálogos
1.7.6.. Otras propiedades de paquetes de software reutilizable, al igual que sucede con los catálogos de
circuitos integrados electrónicos, como les ocurie a los ingenieros de hardware
El modelo objeto ideal no sólo tiene las propiedades anteriormente citadas al Las técnicas orientadas a objetos ofrecen una alternativa de escribir el mis-
principio del apartado, sino que es conveniente que soporte, además, estas otras mo programa una y otra vez El programador orientado a objetos modifica una
propiedades: funcionalidad del programa sustituyendo elementos antiguos u objetos por
nuevos objetos, o bien conectando simplemente nuevos obietos en la apli-
Concurrencia (multitarea)
cación
Per sistencia
La reutilización de código en reprogramación tradicional se puede realiza1
Geizer icidad
copiando y editando, mientras que en programación orientada a objetos se
Manejo de excepciones
puede reutilizar el código, creando automáticamente una subclase y anulando
Muchos lenguajes soportan todas estas propiedades y otros sólo algunas de alguno de sus métodos
ellas Así, por ejemplo, Ada soporta concurrencia y Ada y C + + soportan Muchos lenguajes orientados a objetos fomentan la reutilización mediante
genericidad y manejo de excepciones La persistencia o propiedad de que las el uso de bibliotecas iobustas de clases preconstruidas, así como otias herra-
variables -y por extensión a los objetos- existan entre las invocaciones de un mientas, como hojeadores («broivse~»),para localizar clases de intesks y depu-
programa es posiblemente la propiedad menos implantada en los L P O 0 7 , radores interactivos para ayudar al programador
aunque ya es posible considerar la persistencia en lenguajes tales como Smalltalk
y C i , lo que facilitará el advenimiento de las bases de datos orientadas a obje-
BRADCOX, en su ya clásico libro Objecr-Oiieilted Piograi>irniiig An Eoo1utioiiai.v Approa~lf
tos, como así está sucediendo en esta segunda mitad de la década de los noventa, [Con, Novobilski, 911, acuñá el término chip de rqftiuaie (Software-IC), o ioinpoiienter de software
para definir las clases de objetos como componentes de software reutilizables Existe versión en
español de Addisoii-Wesley/Díaz de Santos, 1993, con el título Prograrnacibri oiiei~tadaa objetor
' Lenguaje de Programación Orientado a Objetos Uii eif<,yue evolurivo
El desarrollo de software 23
22 Programacion orientada a objetos
Eii los últinios años han aparecido lenguajes con soporte de objetos que
1..9.. LENGUAJES DE PROGRAMACION ORIENTADOS cada vez se están popularizando más: Clipper 5-2, Visual BASIC, etc,
A OBJETOS De cualquier forma, existe un Yey actual en los lenguajes oiientados a obje-
tos: C + + La normalización por ANSI y AT&T de la versión 3 O y las numero-
El priinei lenguaje de progiamación que introdujo el concepto de clase fue sas versiones de difeientes fabricantes, tales como Borland C + + 4 014 5, Turbo
Simula-67, como entidad que contenía datos y las operaciones que maiiipula- C + + 3 011 1 y 4 5, Microsoft C/C+ + 7 0, Visual C + + 1 512, Symantec 6 017 0,
ban los datos Asimisino, introdujo también el concepto de herencia etcétera, hacen que en la seguilda mitad de los noventa será el lenguaje orienta-
El siguiente lenguaje orientado a objetos, y seguramente el más popular do a objetos más popular y utilizado en el mundo de la programación
desde un enfoque conceptual exclusivamente de objetos, es Sinalltalk, cuya L.a evolución de los lenguajes orientados a objetos se han mostrado en la
primera versión comercial se desarrolló en 1976, y en 1980 se popularizó con la Figura 15, en la que se aprecia el tronco común a todos los lenguajes modeinos
aparición de Smalltalk-80. Posteiiormente se ha populaiizado gracias al des- Algol y las tres líneas fundamentales: enfoque en Pascal (Ada, Object Pascal),
arrollo de Smalltalk/V de la casa Digital Y, que iecientemente se lid implemen- enfoque pulo de orientación a objetos (Simula/Smalltalk/Eiffel) y enfoque en C
tado bajo entorno Windows El lenguaje se caracteriza por soportar todas las (Objective-C, C + f , .Talla)
propiedades fundamentales de la orientación a objetos, dentro de un entorno
integrado de desarrollo, con interfaz interactivo de usuario basado en menús
Entre los lenguajes orientados a objetos que se han desarrollado a partir de 1.9.1. Clasificación de los lenguajes orientados a objetos
los ochenta destacan extensiones de lenguajes tradicionales tales como C + + y
Objective-C (extensiones de C), Modula-2 y Object Pascal (extensión de Pascal) Existen varias clasificaciones de lenguajes de programación orientados a obje-
y recientemente Object Cobol, que a lo largo de 1994 han aparecido sus primeras tos, atendiendo a criterios de construcción o características específicas de los
veisiones comeiciales, y lava, el nuevo lenguaje para programacióii en Internet. mismos Una clasificaciói~ampliamente aceptada y difundida e s la dada poi
Otro lenguaje orientado a objetos puros es Eiffel, creado por Bertrand Wegner y que se ilustra en la Figura 1 69
Meyer y que soporta todas las propiedades fundamentales de objetos Hasta
ahora no ha adquirido popularidad más que eii ambientes universitarios y de
investigación Sin embargo, la prevista aparición para el año 1995 de la ver-
sión 3, que coirerá bajo Windows, segurameilte aumentará su difusión en objetos +clases
Ada ha sido también un lenguaje -en este caso basado en objetos- que \
1 "---
CLU
\/
'
X
Pascal /Smalltalk
Objet Pascal /
\\\
Simula
1
1
Y
C BASlC Figura 1 6
Orientados
a objetos
Ada Actor objective.c c++ Visual BASlC 3 1 Lenguajes basados en objetos que soportan objetos Es decir, disponen
4
Ada-95 v
'E~i:!a~dPascal
/ i 4
Visual BASlC 2
de componentes caracterizados por un coi~juntode operaciones (coin-
portamiento) y un estado
Lenguajes basados en clases que implican objetos y clases Es decir,
disponen de componentes tipo clase con operaciones y estado coinúii
Java
J
WEGNEK,Petel [1987]: Di~iieiisioiiso j Objecr-Baied Laiiguajer Desigii Número especial de
SIGPLAN Noti~ev
Figura 1 5 Evolución de los lenguajes orientados a objetos,
24 Programación orientada a objetos El desarrollo de soffware 25
Una clase de un objeto se construye con un «iizte?faz» que especifica las cuyos complementos configuran, de liecho, una nueva clasificación En este
operaciones posibles y unecuerpo» que implementa dichas operaciones sentido, los criterios recogidos por este autor son los siguientes:
3 Lenguajes orientados a objetos que además de objetos y clases ofrecen
1L.a modularización de los sistemas ha de realizarse mediante estructuras
mecanismos de herencia entre clases Esto es, la posibilidad de derivar
de datos apropiadas.
operaciones y atributos de una clase (superclase) a sus subclases
2 Los objetos se describen como la implementación de tipos abstractos de
La definición anterior, pese a su antigüedad, sigue teniendo vigencia Existen datos
otias clasificaciones similares, pero con la inclusión de la propiedad de polinzor- 3 La memoria se gestiona (administra) automáticamente
fisino en la categoría 1, como requisito para ser lenguaje orientado a objetos 4 Existe una correspondencia entre tipos de datos no elementales y clases
De cualquier forma, hoy en día es posible ampliar esa clasificación de acuer- 5 Las clases se pueden definir como extensiones o restricciones de otras
do a criterios puramente téciiicos y hacer una nueva clasificación de la cate- clases ya existentes mediante herencia
goría 3: 6 Soportan polimorfismo y ligadura dinámica
7 Existe herencia múltiple y repetida
31 Lenguajes orieiztados a objetos puros Soportan en su totalidad el para-
digma de orientación a objetos: De acuerdo con los criteiios de Meyer, recogemos en IaTabla 1 1 el cumpli-
Smalltalk Eiffel Simula miento de dichos criterios en los lenguajes 00 y basados en objetos más
populares
32 Lenguajes oiientados a objetos hibridos Soportan en su totalidad el
paradigma de orientación a objetos s o b ~ eun núcleo de lenguaje
híbrido: 1..lo. DESARROLLO TRADICIONAL FRENTE A
C + + (exteizsióiz de C: Borland C + + , Microsoft C + + , Turbo C + + , ORIENTADO A OBJETOS
Visual C + i , Symantec,Watcom )
Objective-C (exteizsióiz de C) El sistema tradicional del desarrollo del software para un determinado sistema
Object COBOL. (exteizsión de COBOL). es la subdivisión del mismo en módulos, a la cual deben aplicarse criterios
Object Pascal (extensión de Pascal: Turbo/Borland Pascal) específicos de descomposición, los cuales se incluyen en metodologías de dise-
Visual Object (extensión de Clipper). ño Estos módulos se refieren a la fase de construcción de un programa, que en
Delphi (extensióiz de Turbo Pascal 70) el modelo clásico sigue a la definición de los requisitos (fase de análisis),que se
Java (extensióiz de C + + y Ada-95) muestra en la Figura 3 1
El modelo clásico del ciclo de vida del software n o es el único modelo
Tabla 1 . , 1 Criterios de Meyer en lenguajes 00 y basados en objetos,, posible, dado que es posible desarrolla1 código de un modo evolutivo, por
refinamiento y prototipos sucesivos Existen numerosos lenguajes de programa-
ción y metodologías que se han desarrollado en paralelo a los mismos, aunque
1 Modularización Sí Sí Sí Sí Sí Sí
normalmente con independencia de ellos
2 Tipos abstractos de datos Sí Sí Sí Sí Si Sí En esta sección nos centraremos en la metodología más utilizada, denomi-
3 Gestión automática de me- nada desarrollo estructurado, que se apoya esencialmente en el diseño desceiz-
moria Sí Sí E n parte Sí Sí Sí dente y en la progiamación estructul.ada
4 Sólo clases Sí Sí En paile Sí Sí Sí La progiamación estructurada es un estilo disciplinado de programa-
5 Herencia No Sí Sí Sí Sí Sí ción según los lenguajes procedimentales (por procedimientos), tales como
6 Polirnoifismo (y ligadura di- FORTRAN, BASIC, COBOL y recientemente C y C++
námica ) No Si Sí Sí Sí Sí Las metodologias disetio descendente (o descomposición funcional) se cen-
'7 Herencia múltiole v reoetida No No Sí Sí No No tran en operaciones y tienden a descuidar la importancia de las esrtructuras de
datos Se basan en la dlebre ecuación de Wirth:
De cualquier forma, Meyei, cieadoi del lenguaje Eiffel, proporciona unos Datos + Algoritnzos = Programar
criterios para considerar la «bondad»" de un lenguaje orientado a objetos,
La idea clave del diseño descendente es rompe1 un programa grande en
'O MEYER,
Bertrand: Objrct Oriei~tedSqfti4:aie Coitrtiuriioii Englewood Clifls NI, Prentice- tareas más pequeñas, más manejables Si una de estas tareas es demasiado
Hall, 1988 grande, se divide en tareas más pequeñas Se continúa con este proceso hasta
26 Programacion or~entadaa obletos
El desarrollo de software 27
que el programa se compartimentaliza en módulos más pequeños y que se
programan fácilmente Los subprogramas facilitan el enfoque estructurado, y que han sido probados pieviamente a su utilización El ensamblado de compo-
en el caso de lenguajes como C, estas unidades de programas, llamadasfuncio- nentes electiónicos se garantiza mediante interfaces adecuados
nes, representan las citadas tareas o módulos individuales Las técnicas de Estos conceptos se aplican también con tecnologías de objetos Las clases
progiamación estructuradas reflejan, en esencia, un modo de resolver un pro- (tipos de objetos) son como los clzips de hu~divaie,Cox les llamó chips de
graina en términos de las acciones que realiza softwuie, que no sólo se pueden enlazar (ensamblar) entre sí, sino que también
Para comprender mejor las relaciones entre los algoritmos (funcioiles) y los se pueden reutilizar (volver a utilizar), L.as clases se agiuparán normalmente
datos, consideremos una comparación con el lenguaje natural (por ejemplo en bibliotecas de clases, que son componentes reutilizables, fácilmente legibles
español o inglés), que se compone de muchos elementos pero que ieflejará poca En la actualidad existe gran cantidad de software convencional, en su
expresividad si sólo se utilizan nombres y verbos Una metodología que se basa mayoría escrito normalmente para resolver problemas específicos; por esta ra-
sólo en datos o sólo eiz pi.ocedi~izieiztoses similar a un lenguaje (idónea) en el que zón, a veces es más fácil escribir nuevos sistemas que conveitir los existentes.
sólo se utilizan nombres o veibos. Sólo enlazando nombres o verbos correctos L.os objetos, al reflejar entidades del mundo real, permiten desarrollar apli-
(siguiendo las reglas sen~ánticas),las expresiones tomarán formas inteligibles y caciones, creando nuevas clases y eiisamblándolas con otras ya existentes
su proceso será más fácil Normalmente, los desarrolladores experimentados gastan un porcentaje alto
L.as metodologias tradicionales se vuelven poco prácticas cuando han de de su tiempo (20 al 40 por 100) en cieai nuevas clases y el tiempo restante en
aplicaise a proyectos de gran tamaño El diseño orientado a objetos se apoya ensamblar componentes probados de sistemas, construyendo sistemas potentes
en lenguajes orientados a objetos que se sustentan fundamentalmente en los y fiables
tipos de datos y opeiaciones que se pueden realizar sobre los tipos de datos
Los datos no fluyen abiertamente en un sistema, coino ocurre en las técnicas 1.11. BENEFICIOS DE LAS TECNOLOGIAS
estructuradas, sino que están piotegidos de n~odificacionesaccidentales En
piogramación orientada a objetos, los mensajes (en vez de los datos) se mueven -- DE OBJETOS (TO)
por el sisteina En lugai del enfoque funcional (invocar una función con unos
datos), en un lenguaje orientado a objetos, «se envía un mensaje a un objeto* Una pregunta que hoy día se hacen muchos informáticos es: Cuál es la ~ a z ó n
De acuerdo con Meyer, el diseño orientado a objetos es el método que pura introducir métodos de TO en los procesos de desariollo? L.a principal razón,
conduce a arquitecturas de software basadas en objetos que cada sistema o sin lugar a dudas, son los beneficios de dichas TO: aumento de la fiabilidad y
subsistema evalúa productividad del desarrollador La fiabilidad se puede mejorar, debido a que
Recordemos ¿qué son los objetos? Un objeto es una entidad cuyo comporta- cada objeto es simplemente «una caja negra» con respecto a objetos externos
miento se caracteriza por las acciones que realiza Con más precisión, un objeto con los que debe comuiiicarse L.as estructuras de datos internos y métodos se
se define como una entidad caracterizada por un estado; su comportamiento se pueden refina1 sin afecta1 a otras partes de un sistema (Fig 1 7 )
define por las operaciones que puede realizar; es una instancia de una clase; se
identifica por un nombre; tiene una visibilidad limitada para otros objetos; se Objeto
define el objeto mediante su especificación y su implementación // Métodos
Una definición muy elaborada se debe a Meyer: «Diseño orientado a obje-
tos es la construcción de sistemas de software como colecciones estructuradas
de impleinentaciones de tipos de datos abstractos n
La construcción de un sistema se suele realizar mediante el ensamblado
ascendente (abajo-ariiba) de clases preexistentes Las clases de un sistema pue-
den tener entie si, como se verá en los siguientes capítulos, relaciones de uso
(cliente), relaciones de deiivación (herencia) o relaciones de agregación (conzpo- Figura 1 7 El objeto como cala negra
sición) o iiicluso sólo relaciones de asociación Así, por ejemplo, con una iela-
ción de cliente, una clase puede utilizar los objetos de otra clase; con una L.os sistemas tradicionales, por otia parte, presentan con frecuencia efectos
ielación de herencia, una clu~epuede heredai. o derivar. sus propiedades defini- laterales no deseados Las tecnologías de objetos ayudan a los desarrolladores
das en otra clase a trata1 la complejidad en el desariollo del sistema
El haidwaie se ensambla a partii de componentes electrónicos, tales como La productividad del desairollador se puede mejorar, debido a que las clases
ciicuitos integrados (clips), que se pueden utilizar repetidamente para diseñar y de objetos se pueden hacer reutilizables de modo que cada subclase o instancia
construir conjuntos mucho más grandes, que son totalmente reutilizables La de un objeto puede utilizar el mismo código de piograma para la clase Por
calidad de cada nivel de diseño se asegura mediante componentes del sistema otra parte, esta productividad también aumenta, debido a que existe una aso-
ciación más natural entie objetos del sistema y objetos del mundo real
w
28 Programación orientada a objetos Ei desarrollo de soitware 29
RESUMEN
Programa Programa
Este capítulo es una introducción a los métodos de desarrollo orientados a
objetos Se comienza con una bieve revisión de los problemas encontrados en el
desarrollo tradicional de software que condujeron a la crisis del software y que
se han mantenido hasta los años actuales El nuevo modelo de programación se
Datos apoya esencialmente en el concepto de objetos
La orientación a objetos modela el mundo real de un modo más fácil a la
perspectiva del usuario que el modelo tradicional La orientación a objetos
Figura 1 8 Proceso tradicional de datos, proporciona mejores técnicas y paradigmas para consttuir componentes de
software reutilizables y bibliotecas ampliables de módulos de software Esta
Taylor " considera que los beneficios del modelado y desarrollo de objetos son: característica mejora la extensibilidad de los programas desarrollados a través
1 Desarrollo más rápido de metodologías de orientación orientada a objetos Los usuarios finales, pro-
2 Calidad más alta gramadores de sistemas y desarrolladores de aplicaciones se benefician de las
1 Mantenimiento más fácil tecnologías de modelado y piogramación orientadas a objetos
4 Coste reducido L.os conceptos fundamentales de orientación a objetos son tipos abstractos
5 Incremento en escalabilidad de datos, herencia e identidad de los objetos U n tipo abstracto de datos descri-
6 Mejores estructuras de información be una colección con la misma estructura y comportamiento Los tipos abstrac-
7 Incremento de adaptabilidad tos de datos extienden la noción de tipos de datos, ocultando la implementa-
Sin embargo, TaylorL2también considera algunos inconvenientes, aunque ción de operaciones definidas por el usuario (mensajes) asociados con los tipos
algunos de ellos ya han sido superados o al menos reducido su impacto de datos Los tipos abstractos de datos se implementan a través de clases Las
clases pueden heredar unas de otras Mediante la herencia se pueden construir
1 Inmadurez de la tecnología (hoy día ya no se puede considerar aso nuevos módulos de software (tales como clases) en la parte superior de una
2 Necesidades de estándares (el giupo OMG es una realidad), jerarquía existente de módulos La herencia permite la compartición de código
3 Necesidad de mejores herramientas (y por consiguiente reutilización) entre módulos de software La identidad es la
4 Velocidad de ejecución propiedad de un objeto que diferencia cada objeto de los restantes Con la
5 Disponibilidad de personal cualificado, identidad de un objeto, los objetos pueden contener o referirse a otros objetos
6 Coste de conversión, La identidad del objeto organiza los objetos del espacio del objeto inanipulado
7 Soporte para modularidad a gran escala por un programa orientado a objetos.
L.a Figura 19 muestra los beneficios genéricos de las tecnologías de objetos Este capítulo examina el impacto de las tecnologías orientadas a objetos en
lenguajes de programación, así como los beneficios que producen en el desario-
110 de software
Reutilización Las clases se construyen a partir de otras clases Los conceptos claves de la programación orientada a objetos se examina en
- Sistemas más fiables,
Proceso de desarrollo más rápido
Desarrollo más flexible
el capítulo; si no ha leído hasta ahora nada sobre tecnologías de objetos, deberá
examinar con detenimiento todos los elementos conceptuales del capítulo, que
Modelos que reflejanmejor la realidad se ampliarán en detalle en capítulos posteriores; si ya tiene conocimientos bási-
.. Mejor independencia e interoperatividad de la tecnoiogia cos de la orientación a objetos, este capítulo debe consolidarlos y prepararle
para una eficiente lectura de los siguientes capítulos
- Mejor informáticadfstribuiday cliente-servidor,
Bibliotecas de clases comerciales disponibles
Mejor relaciones con los clientes
- Mejora la calidad del producto software terminado
" IAYLOR, David A : Objet-Oriented Trchiioioqy Readirlg MA: Addison-Wesley, 1992, pági-
nas 101-107
" Ibid págs 108-113
Modularidad tipos abstractos de datos 31
2.1.. MODULARIDAD
La ptogramación inodular trata de descomponer un progiama en un pequeiio
númeio de abstracciones cohereiites que pertenecen al dominio del problema y
cuya complejidad interna es susceptible de ser enmascarada por la descripción
de un interfaz
MODULARIDAD: Si las abstracciones que se desean representar pueden en ciertos casos corres-
ponder a una única acción abstracta y se implen~entanen geneial con la nocióii
TIPOSABSTRACTOSDEDATOS de objeto abstiacto ( o tipo abstracto) caracterizado en todo instante por:
Un estado actual, definido por un cieito número de atributos
Un coijuizto de occioiles posibles,
En consecuencia, la i~zodularidades la posibilidad de subdividir una aplica-
CONTENIDO ción en piezas más pequeñas (denominadas iiz<ídulos),cada una de las cuales
2 , l Modularidad debe ser tan independiente como sea posible, coiisiderando la aplicación como
2 2 Diseño de módulos un todo, así como de las otras piezas de las cuales es una paIte Este piincipio
2 3 Tipos de datos básico desemboca en el principio básico de construi~programas inodula~esEsto
2 4 Abstracción en lenguajes de programación significa que, aproximadamente, ha de subdividir un pr.ograma en piezas más
2 5 Tipos abstractos de datos pequeñas, o módulos, que son generalmente iiidependientes de cada una de las
2 6 Tipos abstractos de datos en Turbo Pascal
restantes y se pueden eizsainblar fácilmente para construir la aplicación completa
2.7, Tipos abstractos de datos en Modula-2
2.8, Tipos abstractos de datos en Ada E,n esencia, las abstracciones se impleinentan en módulos, conocidos en la
2.9. Tipos abstractos de datos en C terminología de Booch como objetos, que agrupan eii una sola entidad:
210. Tioos abstractos de datos en C++
RESUMEN Un conjunto de datos
EJERCICIOS Un conjunto de operaciones que actúan sobie los datos
L.iskov define la rnodulariración como «el proceso de dividir un progranla
En este capitulo se examinarán los conceptos de modularidad y en nlódulos que se pueden compilar separadamente, pero que tienen conexio-
abstracción de datos La modularidad es la posibilidad de dividir nes con otros módulos» Painas va más lejos y dice que «las conexiones entre
una aplicación en piezas más pequeñas llamadas módulos Abs- módulos deben seguir el criterio de ocultación de la iuform.ación: un sistema se
tracción de datos es la técnica de inventar nuevos tipos de datos
que sean más adecuados a una aplicación y, por consiguiente,
debe descomponer de acuerdo al criterio general, de que cada módulo oculta
facilitar la escritura del programa La técnica de abstracción de alguna decisión de diseño del resto del sistema; en otras palabias, cada módulo
datos es una técnica potente de propósito general, que cuando se oculta un secreto»
utiliza adecuadamente puede producir programas más cortos, Si un piograma se descoinpoiie (o subdivide en módulos) de modo consisten-
más legibles y flexibles, te con el criterio de Pariias 4 s decir, aplicando el piincipio de ocultación de la
Los lenguajes de programación soportan en sus compiladores inrormación-, se reduce la complejidad de cada módulo que compone la solu-
tipos de datos fundamentales o básicos (predefinidosl, tales co-
m o int, char y float en C y C++, o bien integer, real o
ción Estos se constituyen en cierto modo independientes de los restantes, con lo
boolean en Pascal Algunos lenguajes de programación tienen que se reduce la necesidad de toinar decisiones globales, operaciones y datos
características que permiten ampliar el lenguaje añadiendo sus
propios tipos de datos,,
Un tipo de dato definido por el programador se denomina 2.1.1. La estructura de un módulo
tipo abstracto de dato, TAD(Abstract Data Type, ADTl El término
abstracto se refiere al medio en que un programador abstrae al- Un módulo se caiacteriza fundaiiientalmente por su iiztelfaz y por su iinpleirieiz-
gunos conceptos de programación creando un nuevo tipo de dato tación Parnas define el módulo como «un conjunto de acciones denominadas,
. -
La modularización de un oroarama utiliza la noción de tipo abs-
luiiciones o submódulos que coiresponden a una abstracción coherente, que
tracto de dato (TAL4 siempre que sea posible Si el TAD soporta los
tioos oue desea el usuario v el coniunto de o~eracionessobre cada compartan un conjunto de datos comunes implantadas estáticamente llamadas
, ,
tipo, se obtiene un nuevo tipo de dato denominado objeto atributos, eventualmente asociadas a definiciones lógicas de tipos Las acciones
o funciones de un módulo que son susceptibles de ser llamadas desde el exterior
32 Programación orientada a objetos Modularldad tipos abstractos de datos 33
se denominan p i ~ i n ~ t ~ uoupuntos
s de entiada del módulo Los tipos lógicos un archivo cuyo nombre tiene el sufijo . c Las dependencias entre archivos se
eventualmente definidos en el interfaz permiten iepresentar los parámetros de pueden declarar utilizando la macro #include En Turbo Pascal, los ~nódulos
estas primitivas» se denominan unidades La sintaxis de las unidades dif'eiencia entre el iritetfaz y
la implementación del módulo Las dependencias entre unidades se pueden
declarar sólo en un interfaz del módulo Ada va más lejos y define el paquete en
l
dos partes: la especificación del paquete y el cuerpo del paquete Al contrario
Primitivas de acceso
lnteríaz que Object Pascal, Ada permite que la conexión entre módulos se declaren
Descripción de propiedades de los datos independientemente en la especificación y en el cuerpo de un paquete,
Unidades modulares
dentro de un módulo software Este criterio sugiere que un sistema bien modu- función de un tipo de datos; ocultan la implementación de las operaciones
larizado es aquel en el cual los interfaces de los módulos son claros y simples, definidas por el usuario asociadas con el tipo de datos Esta capacidad de
Un módulo cohesivo ejecuta una tarea sencilla de un procedimiento de softwa- ocultar la información permite el desarrollo de componentes de software reuti-
re y requiere poca interacción con procedimientos que ejecutan otras partes de lizables y extensibles
un programa En otras palabras, un módulo cohesivo sólo hace (idealmente) Un tipo de dato es un conjunto de valores, y un conjunto de operaciones
una cosa defiizidas por esos valores
La cohesión y el acoplamieiito se miden como un «espectro» que muestra Un valor depende de su representación y de la interpretación de la represen-
las escalas que siguen los módulos L.a T'abla 2 1 muestra la clasificación de tación, por lo que una definición informal de un tipo de dato es:
acoplamientos de módulos y su grado de acoplamiento
1 1
De control realizar aritmética sobre tipos de datos enteros y reales, concatenar cadenas o
Por sellado (estampado) recuperar o modificar el valor de un elemento
La mayoría de los lenguajes tratan las variables y constantes de un progra-
Datos ma como instancias de un tipo de dato Un tipo de dato proporciona una
Sin acoplamiento Bajo (débil) Alto descripción de sus instancias que indican al compilador cosas como cuánta
memoria se debe asignar para una instancia, cómo interpretar los datos en
memoria y qué operaciones son permisibles sobre esos datos Por ejemplo,
La Tabla 2 2 muestra los grados de cohesión: baja cohesión (no deseable) y cuando se escribe una declaración tal como f l o a t z en C o C++, se está
alta cohesión (deseable), así como los diferentes tipos de cohesión declarando una instancia denominada z del tipo de dato f l o a t El tipo de
datos f l o a t indica al compilador que reserve, por ejemplo, 32 bits de memo-
Tabla 2 2 Clasificación de cohesión de módulos ria, y que operaciones tales como «suiliar» y «multiplicar» están permitidas,
mientras que operaciones tales como el «el resto» (módulo) y «desplazamiento
'1 ipo de cohesiiin <;rddo de cnhesión tirado dc manteniniiento de bits» no lo son Sin embargo, no se necesita escribir la declaración del tipo
Por coincidencia Bajo Bajo f l o a t - e l autor de compilador lo hizo por nosotros y se construyen en el
Lógica compilador- L.os tipos de datos que se construyen en un compilador de este
1
Temporal modo se conocen como tipos de datos fulzdamentales (predefinidos), y por ejem-
Po1 procedimientos plo en C y C++ son, entre otros: i n t , c h a r y f l o a t
Por comunicacioiies Cada lenguaje de programación incorpora una colección de tipos de datos
Secuencia1 fundamentales, que incluyen normalmente enteros, reales, carácter, etc Los
Funcional lenguajes de programación soportan también un número de constructores de
Info~macional Alto Alto tipos incorporados que permiten general tipos más complejos Por ejemplo,
Pascal soporta registros y arrays,
En lenguajes convencionales tales como C, Pascal, etc, las operaciones
Idealmente, se burcalz rnódulor altarnerzte cohesivos y débilmente acoplados sobre un tipo de dato son composiciones de constructores de tipo y operacio-
nes de tipos bases
2.3. TIPOS DE DATOS
Operaciones = Operaciones constructor + Operaciones base
Todos los lenguajes de piogramación soportan algún tipo de datos Por ejem-
plo, el lenguaje de programación convencional Pascal soporta tipos base tales
como enteros, reales y caracteres, así como tipos compuestos tales como arrays Algunos tipos de constructores incluyen registros, arrays, listas, conjuntos,
(vectores y matrices) y registros Los tipos abstractos de datos extienden la etcétera
38 Programación orientada a objetos Modularidad tipos abstractos de datos 39
2.4.. ABSTRACCION EN LENGUAJES Con el nombre de los subprograinas, un programador puede asigna1 una
DE PROGRAMACION descripción abstracta que captura el significado global del subprograma,
Utilizando el nombre en lugar de escribir el código, permite al programa-
Los lenguajes de programación son las herramientas mediante las cuales los dor aplicar la acción en términos de su descripción de alto nivel, en lugar
diseñadores de lenguajes pueden implementar los modelos abstractos La abs- de sus detalles de bajo nivel.
tracción ofiecida por los lenguajes de programacióu se puede dividir en dos L.os subprogramas en Pascal proporcionan ocultación de la información.
categorías: abstraccióil de datos (perteneciente a los datos) y abstracción de Las variables locales y cualquier otra definición local se encapsulan en el
coiztrol (perteneciente a las estructuras de control), subprograma, ocultándolos realmente, de fbrma que no se pueden utilizar
Desde comienzo del decenio de los sesenta, en que se desarrollaron los fuera del subprograma Por consiguiente, el programador no tiene que
primeros lenguajes de programación de alto nivel, ha sido posible utilizar las preocuparse sobre las definiciones locales; sin embargo, pueden utilizarse
abstiacciones más primitivas de ambas categorías (variables, tipos de datos, los componentes sin conoce1 nada sobre sus detalles
procedimientos, control de bucles, etc) Ambas categorías de abstracciones han L.os parámetros de los subprogramas, junto con la ocultación de la infor-
producido una gran cantidad de lenguajes de programación no siempre bien mación anterior, permite crear subprogramas que constituyen entidades
definidos de software propias Los detalles locales de la implementación pueden
estar ocultos, mientras que los parámetros se pueden utilizar para estable-
cer el interfaz público
2..4.1. Abstracciones de control
Otros mecanismos de abstracción de control
Los microprocesado~esofrecen directamente sólo dos mecanismos para con-
trolar el flujo y ejecución de las instrucciones: secuencia y salto Los primeros L.a evolución de los lenguajes de programación ha permitido la aparición de
lenguajes de programación de alto nivel introdujeron las estructuras de control: otros mecanismos para la abstracción de control, tales como inanejo de excep-
sentencias de bifurcación ( i f ) y bucles ( f o r , while, do-loop, etc). ciones, coirutinac. unidades coizcurrentes, plantillas (templales) Estas constiuc-
L.as estructuras de control describen el orden en que se ejecutan las senten- ciones son soportadas por los lenguajes de programación basados y orientados
cias o grupos de sentencia (unidades de progi ama) Las unidades de programa se a objetos, tales como Modula-2, Ada, C + + , Smalltalk o Eiffel
utilizan coino bloques básicos de la clásica descomposición «descendente» En
todos los casos, los subprogramas constituyen una herramienta potente de
abstracción, ya que durante su implementación el programador describe en
detalle cómo funcionan los subprogramas Cuando el subprograma se llama, 2..4.2. Abstracción de datos
basta con conocer lo que hace y no cómo lo hace De este modo, los subprogra-
mas se convierten en cajas negras que amplían el lenguaje de progiamación a Los primeros pasos hacia la abstracción de datos se crearon con lenguajes tales
utilizar En general, los subprogramas son los mecanismos más ampliamente como FORTRAN, COBOL y AL.GOL 60, con la introducción de tipos de
utilizados para reutilizar código, a través de colecciones de subprogramas en variables diferentes, que manipulan enteros, números reales, caracteres, valores
bibliotecas, lógicos, etc Sin embargo, estos tipos de datos no podían ser modificados y no
Las abstracciones y estructuras de control se clasifican en estructuras de siempre se ajustaban al tipo de uno para el que se necesitaban Por ejemplo, el
control a nivel de sentencia y a nivel de unidades Las abstracciones de control tratamiento de cadenas es una deficiencia en FORTRAN, mientras que la pre-
a nivel de unidad se conoce coino abstracción procedinzental cisión y fiabilidad para cálculos matemáticos es muy alta
La siguiente generación de lenguajes, incluyendo Pascal, SIMULA-67 y
ALGOL 68, ofreció una ainplia selección de tipos de datos y permitió al pio-
Abstracción procedimental (por procedimientos) gramador modificar y ampliar los tipos de datos existentes mediante construc-
ciones específicas (por ejemplo arrays y registros) Además, SIMULA-67 fue el
Es esencial para diseñar software modular y fiable La abstraccióiz procedimen- primer lenguaje que mezcló datos y procedimientos mediante la construcción
tal se basa en la utilización de procedimientos o funciones, sin preocuparse de de clases, que eventualmente se convirtió en la base del desarrollo de programa-
cómo se implementan Esto es posible sólo si conocemos qué hace el procedi- ción orientada a objetos
miento; esto es, conocemos la sintaxis y semántica que utiliza el procedimiento La abstiaccióil de datos es la técnica de programacióu que permite inventar
o función El único mecanismo en Pascal estándar para establecer abstracción o definir nuevos tipos de datos (tipos de datos definidos por el usuario) adecua-
procedimental es el subprograma (procedimientos y funciones) La abstracción dos a la aplicación que se desea realizar La abstracción de datos es una técnica
aparece en los subprogramas debido a las siguientes causas: muy potente que permite diseñar programas más cortos, legibles y flexibles La
40 Programación orientada a objetos Modularidad tipos abstractos de datos 41
esencia de la abstracción es similar a la utilización de un tipo de dato, cuyo uso Un IAD se compone de estructuras de dator y los procedimientos o funcio-
se realiza sin tener en cuenta cómo está representado o implementado nes que manipulan esas estructuras de datos,
Los tipos de datos son abstracciones y el proceso de construir nuevos tipos
se llaman abstracciones de datos Los nuevos tipos de datos definidos por el
usuario se llaman tipos abstractos de datos,
El concepto de tipo, tal como se definió eii Pascal y ALGOL 68, ha consti- TAD = Representación (datos) + Opetaciones (funciones y p~ocedimientos)
tuido un hito importante hacia la realización de un lenguaje capaz de soportar
programación estructurada Sin embargo, estos lenguajes no soportan total-
mente una metodología La abstracción de datos útil para este propósito no
sólo clasifica objetos de acuerdo a su estructura de representación, sino que se Las opetaciones desde un enfoque orientado a objetos se suelen denominar
clasifican de acuerdo al comportamiento esperado Tal comportamiento es ex- métodos
presable en términos de operaciones que son significativas sobre esos datos, y La estructura de un tipo abstracto de dato (clase), desde un punto de vista
las operaciones son el único medio para crear, modificar y acceder a los objetos. global, se compone del interfaz y de la implementación (Fig 2 4)
En términos más precisos, Ghezzi indica que un tipo de dato definible poi el
usuario se denomina tipo abstracto de dato (TAD) si:
Existe una construcción del lenguaje que le permite asociar la representa-
ción de los datos con las operaciones que lo manipulan Método 3 Método 4
L.a reptesentación del nuevo tipo de dato está oculta de las unidades de
programa que lo utilizan [Ghezzi 871 I I
Interfaz público
Las clases en SIMULA sólo cumplían la primeia de las dos condiciones,
mientras que otros lenguajes actuales cumplen las dos condiciones: Ada, Mo-
dula-2 y C+ +
Los tipos abstractos de datos proporcionan un mecanismo adicional me-
diante el cual se realiza una separación clara entre el interfaz y la implernetzta- estructuras de datos
ción del tipo de dato La implementación de un tipo abstracto de dato consta de:
1 La representación: elección de las estructuras de datos
2 Las operaciones: elección de los algoritmos,
Implementación de métodos:
El interfaz del tipo abstracto de dato se asocia con las operaciones y datos Código del método 1
visibles al exterior del TAD Código del método 2
Código del metodo 3
Código del método 4
2.5. TIPOS ABSTRACTOS DE DATOS l l
Implementación privada
Algunos lenguajes de programación tienen características que nos permiten
ampliar el lenguaje, añadiendo sus propios tipos de datos Un tipo de dato Figura 2 4 , Estructura de un tipo abstracto de datos (TAD),
definido por el p~ogramadorse denomina tipo abstracto de datos (TAD) para
diferenciarlo del tipo fundamental (predefinido) de datos Por ejemplo, en Tur-
bo Pascal un tipo Punto, que representa a las coordenadas x e y de un sistema Las estructuras de datos reales elegidas para almacenar la representación
de coordenadas rectangulares, no existe Sin embargo, es posible implementar de un tipo abstracto de datos son invisibles a los usuarios o clientes. Los
el tipo abstracto de datos considerando los valores que se almacenan en las algoritmos utilizados para implementar cada una de las operaciones de los
variables y qué operaciones están disponibles para manipular estas variables TAD están encapsuladas dentio de los propios TAD La característica de ocul-
En esencia, un tipo abstracto de datos es un tipo de datos que consta de datos tamiento de la información del TAD significa que los objetos tienen interfaces
(estructuras de datos propias) y operaciones que se pueden realizar sobre esos públicos Sin embargo, las representaciones e implementaciones de esos interfa-
datos ces son privados
42 Programación orientada a obletos Modolaridad tipos abstractos de datos 43
La implementación de una pila con capacidad para 1000 elementos del Una vez que se ha implementado el tipo de dato Pila, éste puede ser utiliza-
tipo entero es: do en cualquier programa con tal de invocar en la cláusula uses a dicho tipo
de dato Pila
unit Pila;
interface
const
MaxPila = 1000; 2..6.1. Aplicación del tipo abstracto de dato Pila
type
TipoElemento = integer;
ListaElementos = array [l MaxPilal of TipoElernento;
El siguiente programa lee una secuencia de enteros, uno por línea, tales como
tipo = record estos:
Elernc : LictaElementoc;
Cima : integer;
2nd;
procedure Crear jvar S:tipo);
( * S se inicializa y se limpia o vacía *)
y genera la misma secuencia de números en orden inveiso (los saca de la pila)
procedure Destruir (var S:tipo);
( * Se libera memoria asignada a S * )
( * S no está inicializada *
procedure Meter (var S:tipo; Item: tipoElemento);
( * Se añade un elemento a la cima de la pila * )
procedure Sacar (var S:tipo; 1tem:tipoElemento); Esta tarea se consigue metiendo números en la pila y a continuación vacian-
( * quitar un elemento de la pila * )
do dicha pila
procedure PilaVacia (var S:tipo):boolean;
( * devuelve true si S es vacia; false en caco contrario *) program Nmeros;
implementation uses
procedure Crear (var S:tipo); Pila;
begin var
SCima : = O ; S:Pila Tipo;
end;
procedure Destruir (var S:tipo); procedure LeeryAlmacenarNumerocjvar NumPi1a:PilaTipo);
begin var
S ( * no hace nada * ) Aux:Pila Ti~oElemento:
begin
end;
while not eof do
procedure Meter (var S:tipo; 1tem:lipoElemento); beain
.
begin readln (Aux);
S Cima : = S.cima + 1; Pila Meter (NumPila, Aux) ;
S ElemsIS Cima1 : = Item; end;
end; 2nd;
procedure Sacar (var S:tipo; var 1tem:TipoElemento); procedure VerNumeros(var NumPila: Pila Tipo);
begin var
Item : = S Elernscs Cima]; AUX: Pila TipoElemento;
end ; begin
while not Pila Pilavacia(NumPi1a) do
roced dure PilaVacia (var S:ti~o):boolean; begin
begin Pila Sacar(NumPila, Aux);
PilaVacia : = (S Cima=O); WriteLn (Aux);
end; end; ( * while * )
end end; ( * VerNumeros * )
46 Programación orientada a objetos Modulandad t ~ p o sabstractos de datos 47
begin ( * programa p r i n c i p a l * ) TAD: los tipos de datos y las definiciones de las operacioiies asociadas (que
P i l a Crear ( S )
LeeryAlmacenarNumeros(S);
manipulan) con esos datos se agrupan en una parte (módulo de definición:
P i l a Destruir (S); DEFINITION MODULE) y el cuerpo de las operaciones asociadas en otra parte
end ( * f i n de p r i n c i p a l * ) (módulo de impkmentación: IMPLEMENTATION MODULE)
Cuando la parte de definición de un módulo biblioteca define un tipo opa- PROCEDURE Sacar(Vm S : PilaCar; VAR ch: C m ) ;
( * almacena elemento superior de la pila s en ch. a
co, la parte de implementación del módulo debe incluir una declaración com- continuación saca S ; termina programa si pila está
pleta del tipo La declaración completa de un tipo opaco se debe especificar vacia * )
como un tipo abstracto de dato Pila,y es el siguiente: PROCEDURE EsVacia(s: PilarCar): BOOLEAN;
( * devuelve TRUE si s ectá vacía * )
END Pilacaracteres
DEFINICION MODULE PILA:
TYPE Pila; ( * Tipo opaco * )
PROCEDURE Inicializar(vAR S: Pila); Este módulo tiene algunos inconvenientes Si se decide incrementat el tama-
PROCEDURE Meter(VAR S: Pila) : INTEGER; ño máximo de la pila, se deben recompilar todos los módulos que importan
PROCEDURE Sacar( S : Pila) : INTEGER; Piiacaracteres,incluso cuando cambie la representación de Piiacar Es-
PROCEDURE Pilavacia(s: Pila) : BOOLEAN; tos inconvenientes y otros más no citados se pueden mejorar haciendo Pila-
PROCEDURE Pilallena(s: Pila) : BOOLEAN;
END PILA
car de tipo opaco, permitiendo que Piiacaracteres exporte Pilarcar sin
proporcionar ninguna información a los módulos cliente sobre la estructura
La declaración de un tipo opaco se hace en el módulo de implementación real de la variable Piiacar Este enfoque resuelve nuestros problemas: se
puede cambiar la representación de PilaCar en cualquier momento sin cam-
IMPLEMENTATION MODULE PILA; biar los módulos cliente y se asegura que los clientes no pueden modificar
variable Pilacar,excepto a través de procedimiento exportados por Pilaca-
CONST racteres
LongPila = 100;
TYPE Registropila = RECORD
PilaArray : ARRAY 11 .LangPila] OF Char;
CimaDePila: [O LongPila + 11
2.7.5. Una versión del tipo abstracto de dato Pila
END : con datos opacos
Pila = POINTER TO Registrapila;
Una versión mejorada del módulo de definición de Pilacaracteres con
Piiacar definida como un tipo opaco es:
2.7.4. Tipos transparentes
DEFINITION MODULE PilaCaracterec;
Un módulo de definición puede contener la declaración de -estructura- un ( * exporta tipo PilaCar (pila de caracteres)
tipo de dato, en cuyo caso el tipo se denomina transparente o público, y se y procedimientos para manipulación de variables de tipo
PilaCar * )
puede acceder a él y a sus campos desde cualquier módulo cliente
Veamos cómo se escriben los módulos de definición y de implementación de TYPE PilaCar; ( * exportación opaca * )
un tipo abstracto de datos pilacaracteres.Se puede definir el tipo de dato PROCEDURE InicializariVAR S : PilaCar);
mediante arrays o punteros; en este caso consideremos la implementación me- ( * crea una pila s y la hace vacia * )
diante arrays El módulo Pilacaracteres permite la exportación del tipo de PROCEDURE Meter(VAR S: PilaCar; ch: C m ) ;
( * empuja ch en pila S ; termina programa si pila está
dato Piiacar,que tiene carácter transparente llena * )
PROCEDURE Sacar(VAR S: PilaCar; VAR ch: C H A R ;
DEFINITION MODULE PilaCaracterec; ( * almacena elemento superior de pila s en ch, a
( * exporta tipo PilaCar (pila de caracteres) continuación saca S ; termina programa si pila está
- -orocedimientos vara rnani~ulaciónde variables de tioo
v vacia * )
PROCEDURE EsVacia(s: PilaCar) : BOOLEAN;
PilaCar * )
CONST TamanyoPila = 100: ( * devuelve TRUE si s es vacia, FALSE en caso
( * máximo tamaño de un tipo PilarCar * ) contrario * )
TYPE PilaCar = RECORD END Pilacaracteres
ArrayPila : ARBAY [1 TamanyoPilal OF CHAR;
Cimapila : [O TamanyoPila + 11 Los módulos que importan PilaCar pueden declarar variables de tipo
END; Piiacar,pero el único medio para manipular estas variables es a través de los
( * exportación transparentes de PilaCar * )
PROCEDURE Meter(VAR S : PilaCar; ch: CHAR);
procedimientos Inicializar,Meter, Sacar y EsVacia
( * empuja ch en la pila S ; termina programa si pila La especificación completa del tipo Pilacar debe aparecer en la sección de
ectá llena * ) implementación de Piiacaracteres Dado que PilaCar debe ser un tipo
50 Programacion orientada a objetos Modularidad: tinos abstractos de datos 51
puntero, se declara como un puntero a un registro que contiene los campos Una aplicación Inversa utiliza un módulo programa que lee una cadena
ArrayPila y CimaPila.El procedimiento Inicializar asigna espacio para de caracteres y visualiza su inversa Este programa es fácil de escribir si se
estos registros y después fija el campo Cimapila a O E
l módulo de implemen- utiliza una pila para almacenar la cadena A medida que lee caracteres, se van
tación es: empujando a la pila, deteniéndose cuando se alcanza el final de la cadena
Inversa saca los caracteres de la pila hasta que se vacíe, escribiendo a conti-
IMPLEMENTAIION MODULE PilaCaracteres; nuación cada carácter a medida que se saca el carácter
FROM Storage IMPORT ALLOCATE
FROM 10 IMPORT WrStr, WrLn; MODULE Inversa;
CONST TamanyoPila = 100; ( * invierte una cadena escrita por el usuario * l
( * tamaño máximo de una PilaCar * )
TYPE PilaRea- = FROM IO IMPORT RdKey, WrChar, WrStr, WrLn;
RECORD FROM Pilacaracteres IMPORT PilaCar, Inicializar, Meter,
ArrayPila : Array[l TamanyoPila] OF CHAR; Sacar, EsVacia;
CimaPila : 10 Timanvo~ila-+11
END ; CONST rc = 15c; (* retorno de carro *)
PilaCar = POINTER TO PilaReg;
VAR s : PilaCar;
PROCEDURE Inicializar(VAR S : PilaCar); car: CHAR
( * crea una pila y la hace vacía * )
EEGIN BEGIN
ALLOCATE ( s . SIZE (PilaREg); Inicializar(s); (* vacia pila s *)
sA.CimaPila : = O
END Inicializar;
WrStr ("Introduzca cadena: " ) ;
car : = RdKeyO;
PROCEDURE Meter(VAR S : PilaCar; ch: CHAR); WHILE car # rc Do
( * empuja ch en la pila S ; termina programa si pila llena *) WrChar (car);
BEGIN Meter(s,car);
INC (sA.cimaPila); car : = RdKey
IF S" cimaPila c tamanyoPila THEN END ;
Wrstr ( Desbordamiento Pila'') ; WrLn;
WrLn;
HALT WrStr("Cadena inversa es: ) ;
END; WHILE NOT EsVacia ( S ) DO
SA.UrayPila [ S " cimapila] : = ch Sacar(s,car);
END Meter; WrChar(car1
END;
PROCEDURE Sacar(VAR S : PilaCar; VAR ch: CII4R); WrLn;
( * almacena elemento superior de la pila s en ch. END Inversa
después saca S ; termina programa si pila está vacía *)
BEGIN
SF S^ cimapila = O THEN
Wrstr( Desbordamiento negativo pila"): 2.7..6. Otra aplicación del TAD Pila
WrLn;
H?.LT
END ;
Diseñar un TAD pila que disponga de un tipo opaco (su representación sólo
ch : = sA.ArrayPila[cA cimapila]; será visible en el módulo de implementación; no serán visibles a los módulos
DEC ( S ^ cimapila) clientes) L.os tipos opacos se restringen a punteros y, en consecuencia, es preci-
END Meter; so asignar memoria dinámicamente antes de utilizarlos Por consiguiente, hay
que incluir un procedimiento de inicialización de modo que el usuario pueda
PROCEDURE EsVacia(5: PilaCar) : BOOLEAN: crear una pila para su uso
( * devuelve TRUE si s está vacía * )
BEGIN
RETURN s A cimapila = O definition module pilamod:
END EsVacia; type pilatipo;
END Pilacaracteres procedure vacía (stk:pilatipo):boolean;
52 Programación orientada a objetos
Modolaridad tipos abstractos de datos 53
procedure meter (var stk:pilatipo; e1emento:integer); El siguiente código crea e inicializa una pila, mete dos valores, 4 2 y 2 7 ,
procedure quitar (var ctk:pilatipo); luego saca el 2 7 y deja el valor 4 2
roce dure cima (stk:pilatipo):integer;
end pilamod
module usodepila;
implementation module pilamod; from InOut import WriteLn, Writelnt, WriteString;
from InOut import WriteString, WriteLn; frompilamodimportpilatipo vacia,meter,quitar,cimacrear;
from Starage import allocate
const max = 100; var pi1a:pilatipo;
var aux:integer;
type pilatipo = pointer to
record begin
lista: arrayil maxlof integer;
cimasub: [ O maxl crear (pila);
end; meter (pila, 4 2 ) ;
procedure vacia (stk:pilatipoi :boolean; meter (pila, 2 7 ) :
begin quitar (pila!;
return stkA cimasub = 0 aux : = cima (pila);
end vacia;
end usodepila
procedure meter (var stk:piiatipo; e1emento:integer);
begin
if stkA.cimapila = max then
WriteString ( "error - desbordamiento pila") ; 2.8. Tipos abstractos de datos en Ada
WriteLn;
else
Inc (stkA licta[stkA cimapilal : = elemento Ada proporciona unidades de programa: construcciones que están definidas
end con un nombre y son autónomas en el diseño de un programa Las unidades en
end meter; Ada son:
procedure quitar 1stk:piiatipo) :integer:
begin Subprogramas: procedimientos y funciones análogos a sus homónimos en
if vacia (stk) then Pascal
WriteString("Err0r - desbordamiento negativo"); Tareas: unidades de programa diseñadas para ejecutarse concurrente-
WriteLn mente, que se identifican como colecciones estáticas de código y procesos
elce
dec (stkA.cimasub)
Paquetes: construcciones que soportan abstracción de datos y son la base
end ( * fin de if vacia * ) de componentes software
end auitar; Unidades genéricas: unidades que permiten la creación de tipos genéricos
o parametrizados Son plantillas que sirven para construir subprogramas
roced dure cima (stk:pilatipo):integer; y paquetes y que constituye el mecanismo principal para construir com-
begin ponentes de software reutilizable
if vacia (stk) then
WriteString ("Error - desbordamiento negativo") ;
WriteLn; Ada es un lenguaje que soporta el tipo abstracto de datos identificado como
else módulo en una entidad denominada paquete Un paquete representa en Ada la
return stkA cimasublstkA cimasubl idea de la encapsulación, que es la clave para la abstracción de datos
end El paquete en Ada representa el nivel más alto de abstracción del programa
end cima;
y actúa como un módulo La ocultación de datos se iealiza a través del uso de
procedure crear (var stk:pilatipoi; tipos private (privado) o limited private (privado limitado) L.as opera-
begin ciones de asignación y verificación de igualdad son las únicas operaciones que
new (ctk); están definidas en el lenguaje para tipos privados Para tipos privados limita-
stkA cimasub := O dos no existen operaciones predefinidas proporcionadas por el lenguaje El
end crear;
programador debe prever todas las operaciones soportadas, incluyendo asigna-
end pilamod ción y verificación de igualdad
54 Programación orientada a objetos Modularidad tipos abstractos de datos 55
ocultas a los clientes del paquete Uii cuerpo del paquete se puede definir en un Las características adicionales en la especificación de un paquete que expoi-
módulo separado de la especificación del paquete La sintaxis es: ta un tipo privado son:
#endi£ Una vez definido el tipo de dato coinplejo, se puede invocar a los mismos
dentro de un programa principal
Los cuerpos de las funciones se implementan en el archivo c o m p l e x c:
/ * FICHERO: principa c * /
/ * FICHERO: complex c * /
#include '"complexh"
#include "complex h"
int main() {
complejo nuevo_complejo(float x , float y) ( complejo x , y, z ;
complejo c;
C r = x;
c i = y;
return C ;
)
60 Programación onentada a objetos Modularidad tipos abstractos de datos 61
printf('y = (%f. %f)\n' really), imag(y)l; La implementación de la clase (los cuerpos de la función) se pueden declarar
dentro de una definición de la clase, pero es más frecuente incluir los prototipos
de la función en la especificación y declarar los cuerpos de la función separada-
mente, aprovechando la propiedad de compilación separada que posee el len-
guaje C + + Además, cada parte se compila en un archivo: la especificación con
return O;
1 !
la extensión , h y la implementación con la extensión , cpp
En el caso de la citada clase P i l a , los cuerpos de las funciones se declaran y
+
C no permite definir los signos y - para trabajar con tipos definidos por compilan por separado mediante el operador de resolución de ámbito (: :), que
permite asociar los nombres de las funciones miembro con la clase correspon-
el usuario, cosa que sí podrá realizarse con C + + mediante la propiedad de
sobrecarga de operadores diente Así, los códigos fuente serían:
void pi1a~carac::meterlcharx )
ilista[++cima-de-lasilal = x;)
2.10. TIPOS ABSTRACTOS DE DATOS EN C++
void pila-carac::sacar(char * x )
{ * x = lista[cimode-lasila--];)
En C + + el equivalente del paquete o módulo se denomina clase, y es el tipo de
dato que soporta la abstracción de datos Una clase es un tipo de dato que char pila-carac::cima()
incluye datos y operaciones que manipulan esos datos La clase es la entidad lreturn l i s t a L c i m a ~ d e _ l a ~ i l ;}
a]
principal de los lenguajes de programación orientados a objetos (C++, Small-
talk, Eiffel, etc), Los usuarios de la información declarada en una clase se conocen como
Una definición de una clase en C + + consta de miembros dato y funciones clientes Las variables de la clase pila-carac se pueden declarar y manipula1
miembro, a través de las cuales se puede acceder a los detalles internos de la por un cliente de la forma siguiente:
clase Una clase se define como una estructura en C ( s t r u c t ) , con la diferencia
de que puede contener tres secciones: pública, privada y protegida, y que puede main ( )
1
definir se con las palabras reservadas s t r u c t y c l a s s
pila-carac a , b; / / se crean dos objetos de la clase
Así, la definición de una clase (TAD) pila de caracteres (pila-carac) en char ch;
C + + es su especificación, y su sintaxis es:
a meter('£'); b rneter('g');
class pilocarac l ch = a cima O ;
char lista[1001;
int cima-de-lasila;
public :
pila-carac(1 {cima-de-lasila = -1);
void meter (char);
void sacar (char * ) ;
2..10.1. Definición de una clase Pila en C+ +
char cima ( ) ;
);
La clase P i l a se define en el archivo de cabecera p i l a h, de modo que podrá
ser utilizado por otros programas La implementación de la pila utiliza un
La nueva clase pila-carac contiene las operaciones m e t e r , s a c a r Y array i t e m s , que contiene los elementos de la pila, y un índice c u e n t a s , que
c i m a Las clases pueden incluir otras funciones miembro con igual nombre que contiene cuantos elementos existen realmente en la pila. Las funciones que
la clase y que se denominan constructores y destructores, cuya utilidad se verá manipulan la pila son m e t e r , s a c a r , c i m a y v a c í a Estas operaciones se
posteriormente (Capítulo 6). desea que estén disponibles a los usuarios de la pila y, por consiguiente, se
El encapsulamiento en C + + se consigue declarando todos los datos como deben definir públicas (mediante la palabra reservada p u b l i c ) , lo que significa
privados (en la sección privada, por defecto las sentencias que vienen a con- que cualquier usuario de la pila puede llamar a las diferentes funciones miem-
tinuación de la llave de apertura hasta la primera cláusula p u b l i c O bro que implementan las opeiaciones de la pila
p r o t e c t e d ) . A la sección privada sólo se puede acceder mediante las funciones Con el tipo s t r u c t , el acceso por omisión en público ( p u b l i c ) para todos
miembro de la clase sus miembros. En la definición de p i l a existe un prototipo especial denomina-
La sección pública es accesible (visible) a cualquier otra clase y sus datos do p i l a ( ) Cualquier función miembro con el mismo nombre que el tipo dato
pueden ser modificados por funciones miembros externas a la clase es un constructor Un constructor se llama automáticamente siempre que crea-
Modu1ar;dad tipos abstractos de datos 63
mos una instancia de un tipo de dato particular Su trabajo es inicializar los Un programa que invieite un flujo de enteros:
campos dato dentro de un objeto, ahorrando al programador la molestia de
llamar a una rutina de inicialización específica De modo similar, se puede //utilizar pila para invertir un flujo de enteros
//archivo inver cpp
especificar un destructor, una función miembro con el mismo nombre que la
clase, con un símbolo - delante #include iioctream h>
#include "pila h"
//archivo pila h
//definición de una pila, con operaciones main ( )
i
pila S ; //crear una pila
conct int MAXPILA = 100; //tamaño por defecto de la pila int i;
struct pila while (cin >> i)
i c meter(i) ; //meter entrada en la pila
private: for ( ; ! S vacia0; s sacar()) //vicualizar pila
int cuenta; //número de elementos de la pila cout < c s cima0 c c '\n";
int itemsIMAXPILA1; //definición de la pila return 0;
public: 1
pila(); //inicializar pila, constructor
void met.er(int item); //meter elementos en la pila El ejercicio anterior se puede implementar mediante el tipo ciass La
void sacar ( ) ; //quitar elementos de la pila
int cima ( ) ; //devuelve elemento cima de la pila compilación separada se consigue con el archivo de cabeceia pila h, el archi-
int vacía ( ) ; //¿la pila está vacía? vo de implementación de funciones pila cpp y el programa principal que
hace uso del archivo pila.h
Los programas basados en funciones son difíciles de diseñar El problema es Existen tres importantes partes en la definición: la programación orientada
que sus componentes principales -funciones y estructuras de datos- no mo- a objetos 1) utiliza objetos, no algorítmicos, como bloques de construcción
delan bien el mundo real Por ejemplo, supongamos que se está escribiendo un lógicos (jerarquia de objetos); 2) cada objeto es una instancia de una clase, y 3)
programa para crear los elementos de un interfaz gráfico de usuario: menús, las clases se relacionan unas con otras por medio de relaciones de herencia
ventanas, cuadros de diálogo, etc ¿Qué funciones se necesitarán? ¿Qué estruc-
turas de datos? La solución sería más aproximada si hubiera una correspon-
dencia lo más estrecha posible entre los menús y ventanas y sus correspondien- ' Booc~,Giady: Análisis y diseño orientado a objetos coii aplicacioi~es 2' edicidn Addison-
tes elementos de programa Wesleypíaz de Santos, 1995
70 Programanon orientada a objetos 1l Conceptos fundamentales de programación orientada a objetos 71
Un programa puede parecer orientado a objetos, pero si cualquiera de estos L.os datos y las funciones (procedimientos en Object-Pascal) asociados se dicen
elementos no existe, no es un programa orientado a objetos Especificamente, la que están eizcapsulados en una única entidad o módulo La encapsulación de
programación sin herencia es distinta de la programación orientada a objetos; datos y ocultación de datos son términos importantes en la descripción de
se denomina programación con tipos abstractos de datos o piograrnación basada lenguajes orientados a objetos
en objetos Si se desea modificar los datos de un objeto, se conoce exactamente cuáles
El concepto de objeto, al igual que los tipos abstractos de datos o tipos son las funciones que interactúan con el mismo Ninguna otra fuiición puede
definidos por el usuario, es una colección de elementos de datos, junto con las acceder a los datos Esta caiacteristica simplifica la escritura, depuración y
funciones asociadas utilizadas para operar sobre esos datos Sin embargo, la mantenimiento del programa
potencia real de los objetos reside en el modo en que los objetos pueden definir
otros objetos Este proceso, ya comentado en el Capítulo 1: se denomina heren-
cia y es el mecanismo que ayuda a construir programas que se modifican 3.2.2. Ejemplos de objetos
fácilmente y se adaptan a aplicaciones diferentes
Los conceptos fundamentales de programación son: objetos, clases, heren- ¿Qué clase de cosas pueden ser objetos en un progiama oiientado a objetos?
cia, rnensajes y polimorfisino L.a respuesta está sólo limitada a su imaginación Algunos ejemplos típicos
pueden ser:
Objetos fisicos
Aviones en un sistema de control de tráfico aéreo
Automóviles en un sistema de control de tráfico terrestre
Casas
3.2.,1.. El objeto Eleineiztos de irzterfaces gráficos de usuario
La idea fundamental en los lenguajes orientados a objetos es combinar en una Ventanas
sola unidad datos v funciones que operan sobre esos datos Tal unidad se deno- Menús
mina objeto Por consiguiente, dentro de los objetos residen los datos de los Objetos gráficos (cuadrados, triángulos, etc),
lenguajes de programación tradicionales, tales como números, ariays, cadenas Teclado,
y registros, así como funciones o subrutinas que operan sobre ellos Cuadros de diálogo
Las funciones dentro del objeto (funciones miembro en C + + , nz4todos en Ratón
Object-Pascal y Smalltalk) son el único medio de acceder a los datos privados Aizirnales
de un objeto Si se desea leer un elemento datos de un objeto se llama a la Animales veitebrados
función miembro del objeto Se lee el elemento y se devuelve el valor No se Animales invertebrados
puede acceder a los datos directamente Los datos están ocultos, y eso asegura Pescados
que no se pueden modificar accidentalmente por funciones externas al objeto Tipos de datos defirzidos poi el usuario
Datos con~plejos
Funciones externas Procedimientos externos Datos Puntos de un sistema de coordenadas
Alimerztos
Función Datos Carnes
Frutas,
Pescados
Verduras
Pasteles
Función
Un objeto es una entidad que contiene los atributos que describen el estado
de un objeto del mundo real y las acciones que se asocian con el objeto del
1 1 1 mundo real Se designa por un nombie o identificado1 del objeto.
Público Privado Dentro del contexto de un lenguaje orientado a objetos (LOO), un objeto
encapsula datos y los procedimientos/funciones (nz4todos.l que manejan esos
Figura 3 4 El modelo objeto,
datos La notación gráfica de un objeto varía de unas metodologías a otras
72 Programación orientada a objetos
Atributos
Nombre
del objeto
rq
Nombre del objeto
Atiibutos
Métodos
Conceptos fundamentales de programación onentada a objetos
entidad (el módulo u objeto) la iifoimacióiz (los datos o atributos) y las opeia-
ciones (los métodos o funciones) que operan sobre esa info~mación
Sección
privada
Figura 3 7
Información
operaciones
Y
Encapsulamiento de datos
Métodos
1
lntertaz público
y operaciones
(c) (d)
Figura 3 5 . Notaciones gráficas de objetos: (a) Taylor; (b) Yourdon/Coad;
(c) OMT; (d) Booch,,
i . ; . . ._ Representación
I 3..2.3.Métodos y mensajes
c l a s e Punto
Cool denadas
Métodos
Fijar
Leer x
Objeto 3 Objeto 2 Leer y
tme
inomóre-clase, = object
<lista de campos de datos,
<lista de cadenas de funciones y procedimientos>
end;
En realidad, una clase es un tipo de dato definido por el usuario que deter- y el elemplo de un objeto P u n t o
mina las estructuras de datos y operaciones asociadas con ese tipo. Dicho de
otro modo, una clase es urza colección de objetos similares La definición de una type Punto = object
clase no crea ningún objeto, de igual modo que la declaración de variables X,Y . Integer,
tampoco crea variables procedure operar,
end;
3.3.,2.Sintaxis
3.,4.. U N MUNDO DE OBJETOS
En C++ se puede declarar una clase de la siguiente forma:
Una de las ventajas ineludibles de la orientación a objetos es la posibilidad de
class Punto reflejar sucesos del mundo real mediante tipos abstractos de datos extensibles a
objetos Así pues, supongamos el fenómeno corriente de la conducción de una
int x - bicicleta, un automóvil, una motocicleta o un avión: usted conoce que esos
int v: vehículos comparten muchas características, mientras que difieren en otros
public: Por ejemplo, cualquier vehículo puede ser conducido: aunque los mecanismos
void fijarXY (int a , ~ n t
b)
(
de conducción difieren de unos a otros, se puede generalizar el fenómeno de la
x = a; conducción En esta consideración, enfrentados con un nuevo tipo de vehículo
y = b: (por ejemplo una nave espacial), se puede suponer que existe algún medio para
1 conducirla Se puede decir que vehiculo es un tipo base y nave espacial es un
int leerX 0 (return x; 1
int leerY 0 (return y;1 tipo derivado de ella,
1; En consecuencia, se puede crear un tipo base que representa el comporta-
miento y características comunes a los tipos derivados de este tipo base
La sintaxis anterioi ha definido la clase punto, pero no ha creado ningún Un objeto es en realidad una clase especial de variable de un nuevo tipo que
objeto Para crear un objeto de tipo P u n t o tendrá que utilizarse una declara- algún programador ha creado. Los tipos objeto definidos por el usuario se com-
ción del tipo correspondiente, al igual que se declara cualquier variable de un portan como tipos incorporados que tienen datos internos y operaciones exter-
tipo incorporado C + + nas Por ejemplo, un número en coma flotante tiene un exponente, mantisa y bit
de signo y conoce cómo sumarse a sí mismo con otro n ú m e ~ ode coma flotante
Punto P: // se define una variable de tipo Punto Los tipos objeto definidos por el usuario contienen datos definidos por
el usuario (caracteristicas) y operaciones (comportamiento) Las operaciones
Conceptos fundamentales de programación orientada a objetos 79
78 Programanon orientada a objetos
tos; es decir, ¿qué cosas son objetos?; jcómo deducimos los objetos dentro del
definidas por el usuario se denominan métodos Para llamar a uno de estos dominio de la definición del problema?
métodos se hace una petición al objeto: esta acción se conoce como «enviar un L.a identificación de objetos se obtiene examinando la descripción del pro-
mensaje al objeto» Por ejemplo, para detener un objeto automóvil se envía un blema (análisis gramatical somero del enunciado o descripción) y localizando
mensaje de parada («stop») Obsérvese que esta operación se basa en la noción los nombres o cláusulas nominales Normalmente, estos nombres y sus sinónimos
de encapsnlación (encapsulamiento): se indica al objeto lo que ha de hacer, pero se suelen escribii en una tabla de la que luego deduciremos los objetos reales,
los detalles de cómo funciona se han encapsulado (ocultado) Los objetos, según Shlaer, Mellor y CoadJYourdon, pueden caer dentio de
las siguientes categorías:
3.4.1. Definición de objetos2 Cosas tangibles (avión, reactor nuclear, fuente de alimentación, televisor,
libro, automóvil).
Un objeto (desde el punto de vista formal se debería hablar de clase), como ya se Roles o papeles jugados o representados por personas (gerente, cliente,
ha comentado, es una abstracción de cosas (entidades) del inundo real, tales que: empleado, médico, paciente, ingeniero)
Todas las cosas del mundo real dentro de un conjunto -denominadas Organizaciones (empresa, división, equipo )
irzrtancias- tienen las mismas características Incidentes (representa un suceso -evento- u ocurrencia, tales como vue-
lo, accidente, suceso, llamada a un servicio de asistencia técnica )
Todas las instancias siguen las mismas reglas
Interacciones (implican generalmente una transacción o contrato y rela-
Cada objeto consta de: cionan dos o más objetos del modelo: compras -comprador, vendedor,
artículo-, matrimonio -esposo, esposa, fecha de boda)
Estado (atributos)
Especijkaciones (muestran aplicaciones de inventario o fabricación: iefri-
Operaciones o comportamiento (métodos invocados por mensajes)
gerador, nevera )
Desde el punto de vista inforrnático, los objetos son tipos abstvactos de datos Lugares (sala de embarque, muelle de carga )
(tipos que encapsulan datos y funciones que operan sobre esos datos)
Una vez identificados los objetos, será preciso identificar los atributos y las
Algunos ejemplos típicos de objetos:
operaciones que actúan sobre ellos,
Número raciolzal Los atributos describen la abstracción de características individuales que
Estado (va101 actual) poseen todos los objetos
Opeiaciones (sumar, multiplicar, asignar )
Vehículo
Estado (velocidad, posición, precio ),
Operaciones (acelerar, frenar, parar, ) Matricula Nombre
Colzjunto Licencia del piloto Número de identificación
Estado (elementos). Nombre de avión Salario
Operaciones (añadir, quitar, visualizar ), Capacidad de carga Dirección
Número de pasajeros Nombre del departamento
Avión
Estado (fabricante, modelo, matrícula, número de pasajeros )
Operaciones (aterrizar, despegar, navegar ) Las operaciones cambian el objeto -su comportamiento- de alguna foi-
ma, es decir, cambian valores de uno o más atributos contenidos en el objeto
3.4.2. Identificación de objetos Aunque existen gran número de operaciones que se pueden realizar sobre un
objeto, generalmente se dividen en tres grandes grupos3:
El primei problema que se nos plantea al analizar un problema que se desea Operaciones que matnpulan los datos de alguna f o ~ m aespecífica (añadir,
implementar mediante un programa orientado a objetos es identificar los obje- borrar, cambiar formato )
Operaciones que realizan un cálculo o proceso
""ando se habla de modo genérico, en iealidad se debería hablar de CLASES,
dado que la clase
en el tipo de dato y objeto es s61o una instancia, ejemplar o caso de la clase Aquí mantenemos el
término objeto por conservar la rigurosidad de la definición «orientado a objetos», aunque en ' PRESSMAN,
Roger: 1izgeniei.ía de1 rofrwaie Uii eofoque pi.dctico 3 " edición McGraw-Hill, 1993
realidad la definición desde el punta de vista técnico sería la clase
80 Programacion orrentada a obletos Conceptos fundamentales de programación orientada a objetos 81
Operaciones que comprueban (inonztoizzan)un objeto frente a la ocurren- La caja se etiqueta con el nombre del objeto y representa el límite o f~ontera
cia de algún suceso de control entre el interior y el exterior de un objeto
La identificación de las operaciones se realiza haciendo un nuevo análisis
Objeto
-:
gramatical de la descripción del problema y buscando y aislando los verbos del
texto
Campos miembro
,
res Estas operaciones se ejecutarán implícitamente por el compilador o
explícitamente por el prograinadol, mediante invocación a los citados construc- 1 I
tores
L,+ Interior Exterior
3..4.4. Objetos frente a clases. Representación gráfica Figura 3 , 1 1 Diagrama d e u n objeto,
(Notación de Ege)
Un campo se dibuja poi una caja rectangular, una función por un hexágono
Los objetos y las clases se comparan a val iables y tipos en lenguajes de progra- largo Los campos y funciones se etiquetan con sus nombres Si una caja rectan-
mación convencional Una variable es una instancia de un tipo, al igual que un gular contiene algo, entonces se representa el valor del campo para el objeto
objeto es una instancia de una clase; sin embargo, una clase es más expresiva dibujado Los campos y funciones miembro en el interior de la caja están
que un tipo Expresa la estructura y todos los procedimientos y funciones que ocultos al exterior, que significa estar encapsulados El acceso a las carac-
se pueden aplicar a una de sus instancias terísticas de los miembros (campos y funciones) es posible a través del interfaz
En un lenguaje estructurado, un tipo i n t e g e r , por ejemplo, define la es- del objeto En una clase en C + + , el interfaz se construye a partir de todas las
tructura de una variable enteia, por ejemplo una secuencia de 16 bits y los características que se listan después de la palabra reserva gublic; puede ser
procedimientos y funciones que se pueden realizar sobre enteros De acuerdo a funciones y campos
nuestra definición de «clase», el tipo i n t e g e r será una clase Sin embargo, en La Figura 3 12 muestra el diagrama objeto del objeto "holamundo" Se
estos lenguajes de programación no es posible agrupar nuevos tipos y sus llama Saludol y permite acceder a su estado interno a través de las funciones
correspondientes nuevas funciones y procedimientos en una única unidad En miembro públicas cambiar y anunciar El campo miembro privado contiene
un lenguaje orientado a objetos una clase proporciona este servicio el valor ~ s t eos saludo1
Además de los términos objetos y clases, existen otros términos en orienta-
ción a objetos Las variables o campos que se declaran dentro de una clase se Saludol
denominan datos nliembro en C + + ; otros lenguajes se refieren a ellos como va-
riable~instancia Las funciones que se declaran dentro de una clase se denomi-
nan,funciones mieinbro en C++; otros lenguajes utilizan el tQmino método Las
funciones y campos miembro se conocen como caracteristicas miembro, o sim-
plemente mielnbros A veces se invierten las palabras, y las funciones miembros
S2
se conocen como miembro función y los campos se denominan nlienlbro datos.
Es útil ilustrar objetos y clases con diagramas4 La Figura 311 muestra el
esquema general de un diagrama objeto Un objeto se dibuja como una caja
Visualizar
Las nolaciones de clases y objetos utilizada en esta sección se deben a Raimund K. Ege, que
las dio a conocer en su libro Progiai+iming in aii Object-Orieiired Enviroitmenr Academic Press (AP),
1992 Figura 3 12 El objeto Saludol
82 Programación orientada a objetos Conceptos fundamentales de programación orientada a objetos 83
Esto significa que la ventana se reducirá en tamaño una cantidad dada por
5 filas y 6 columnas:
Figura 313. Diagrama de una clase,
mensaje reducir
Una clase es un tipo definido que determina las estructuras de datos y
operaciones asociadas con ese tipo L.as clases son como plantillas que descri- Afortunadamente, no necesita tener que guaidar la posición actual de la
ben cómo ciertos tipos de objetos están construidos. Cada vez que se construye ventana, ya que el objeto hace esa operación por usted La posición actual se
un objeto de una clase, estamos creando lo que se llama una instancia (modelo almacena en una variable de estado que mantiene internamente la ventana
o ejemplar) de una clase y la operación correspondiente se llama instanciación Naturalmente, se puede acceder a esta variable estado cuando se desee, envian-
(creación de instancias) Por consiguiente, los objetos no son más que instancias do un mensaje tal conlo:
de clases En general, los términos objeto e inrtai~ciade una clase se pueden
utilizar indistintamente indicar posicion actual
84 Programación orientada a objetos Conceptos fundamentales de programación orientada a objetos 85
En lenguaje Pascal orientado a objetos (versiones Turbo 5 5 a 7 O), la sinta- 3.5.2.. Tipos de herencia
xis de una clase (objeto en su terminología) es:
Existen dos mecanismos de herencia utilizados comúnmente en programación
tme orientada a objetos: lzerencia sinzple y herencia múltiple
<nombre-clase, = object (clase ascendiente) En herencia simple, un objeto (clase) puede tener sólo un ascendiente, o
<campos propios de nuevo objeto>
<métodos propios del nuevo objeto, dicho de otro modo, una subbase puede heredar datos y métodos de una única
end; clase, así como añadir o quitar compo~tamientosde la clase base Turbo Pascal
sólo admite este tipo de herencia C + + admite herencia simple y múltiple
Así, por ejemplo, en C + + , si se crea una clase base: La lzerencia múltiple es la propiedad de una clase de poder tener más de un
ascendiente inmediato, o lo que es igual, adquirir datos y métodos de más de
class base { una clase
int x y; Una representación gráfica de los tipos de herencia con una clase base
public: genérica 01 se muestra en la Figura 3 16
void hacerAlgo ( 1;
La Figura 1 15 representa los gráficos de herencia simple y herencia múlti-
ple de la clase figura y persona,respectivamente
en Turbo Pascal se escribiría la clase equivalente:
base = object
x , y : integer;
procedure hacerñlgo;
end;
Se desea construir uii nuevo tipo derivado del tipo base existente, tal que el
tipo derivado sea idéntico al tipo base, con una excepción: extender base
añadiendo un método llamado hacerotracosa Se construye una clase deri-
vada En C++:
3.6,,1.. Activación de objetos Infor mnción especial necesaria para realizar el método invocado (argu-
mentos o parámetros requeridos)
A los objetos sólo se puede acceder a través de su interfaz público ¿Cómo se
permite el acceso a un objeto? Un objeto accede a otro objeto enviándole un sumar 10 X y Z "
mensaje --
receptor método parámetro
Carro
Modelo 7 1
Puenas 1
Edad
PreCiLcBl'o
C ~ b j e t emisor
o
- .I[_->
Prueba ( )
Objeto receptor
Un mensaje incluye el nombre de una operación y cualquier argumento reque-
rido por esa operación Con frecuencia, es útil referirse a una operación por
nombre, sin considerar sus argumentos
lJ--
Métodos
Calcular-precio (100) Cuando un objeto recibe un mensaje, se realiza la operación solicitada ejecu-
Producto tando un método Un nzétodo es el algoritmo ejecutado en respuesta a la
recepción de un mensaje cuyo nombre se corresponde con el nombre del
método
La secuencia actual de acontecimientos es que el emisor envía su mensaje; el
Figura 3 19 Objetos emisor y receptor de un mensaje receptor ejecuta el método apropiado, consumiendo los par&metros; a conti-
nuación, el receptor devuelve algún tipo de respuesta al emisor para reconocer
Estructuralmente, un mensaje consta de tres partes: el mensaje y devolver cualquier información que se haya solicitado
-- . . .. - ......-
..
Identidad del receptor 7
El método que se ha de ejecutar El receptor responde a un mens;ijc...
- .
- .... . ... .. -
... -. . .... - - - - . .
Conceptos fundamentales de programación orientada a objetos 93
92 Programación onentada a objetos
m Objeto A
las características generales de ese tipo una vez, en lugar de en cada objeto
A paitir de una clase se puede definir un número de objetos Cada uno de
estos objetos tendrá generalmente un estado peculiar propio (una pluma puede
estar rellenada, otra puede estar medio-vacía y otra estar totalmente vacía) y
otras características (como su color), aunque compartirán operaciones comunes
El método-1 llama (como <<escribir»,«llenar», «poner el capuchón», etc)
al método-2, En resumen, un objeto es una instancia de una clase
enviándole
El método-3
I
3..8.1. Una comparación con tablas de datos
se invoca por
un mensaje Una clase se puede considerar como la extensión de un registro Aquellas
de otro objeto 1 1 personas familiarizadas con sistemas de bases de datos pueden asociar clase e
instancias con tablas y registros, respectivamente Al igual que una clase, una
Figura 3 2 3 Invocación de u n método, tabla define los nombres y los tipos de datos de la inforinación que contenga
metodo: Precio-coche Del mismo modo que una instancia, un registro de esa tabla proporciona los
valores específicos para una entrada particular La principal diferencia, a nivel
conceptual, es que las clases contienen métodos, además de las definiciones de
fin datos,
Una clase es una caja negra o módulo en la que está permitido conocer lo
3..8.CLASES que hace la clase, pero no cómo lo hace Una clase será un inódulo y un tipo
Como módulo la clase encapsula los recursos que ofrece a otras clases (sus
La clase es la construcción del lenguaje utilizada más frecuentemente para clientes) Como tipo describe un conjunto de objetor o instancias que existen en
definir los tipos abstractos de datos en lenguajes de programación orientados a tiempo de ejecución
objetos Una de las primeras veces que se utilizó el concepto de clase fue en
Simula (Dahl y Nygaard, 1966; Dahl, Myhrhang y Nigaard, 1970) como enti-
dad que declara conjuntos de objetos similares En Simula, las clases se utiliza-
ron principalmente como plantillas para crear objetos de la misma estructura,
Los atributos de un objeto pueden ser tipos base, tales como enteros, reales y
booleans; o bien pueden ser arrays, procedimientos o instancias de otras clases
Generalmente, una clase se puede definir como una descripción abstracta de
un grupo de objetos, cada uno de los cuales se diferencia por un estado es- Instancia (objeto)
pecífico y es capaz de realizar una serie de operaciones Clase de la clase
Por ejemplo, una pluma estilográfica es un objeto que tiene un estado (llena
Figura 3.,24 Una clase y una instancia (objeto) de la clase (Notación Booch),
de tinta o vacía) que puede realizar algunas operaciones (por ejemplo escribir,
poner/quitar el capuchón, rellenar si está vacla)
En programación, una clase es una estructura que contiene datos y procedi- Instancias corno registros
mientos (o funciones) que son capaces de operar sobre esos datos Una clase
pluma estilográfica puede tener, por ejemplo, una variable que indica si está llena Servicio Horas Frecuencia I>eicucnro
o vacía; otra variable puede contener la cantidad de tinta cargada realmente La
clase contendrá algunas funciones que operan o utilizan esas variables
Dentro de un programa, las clases tienen dos propósitos principales: definir
abstracciones y favorecer la modularidad
96 Programación orientada a objetos Conceptos fundamentales de programac~ónorientada a objetos 97
Clase Instancia
Figura 3.25, Instancias de una clase (notación OMT),
operaciones
end hombre
Figura 3 2 8 , Herencia múltiple
clase mujer inherit persona;
propiedades
esposo: man; Herencia selectiva
nombre: ctring;
La herencia selectiva es la herencia en que algunas propiedades de las supercla-
end mujer ses se heredan selectivamente por parte de la clase heredada Por ejemplo, la
clase B puede heredar algunas propiedades de la superclase A, mient~asque
La herencia es un mecanismo potente para tratar con la evolución natural la clase C puede hetedar selectivamente algunas propiedades de la superclase A
de un sistema y con modificación incremental [Meyer, 19881 Existen dos tipos y algunas de la superclase D
diferentes de herencia: simple y múltiple,
Herencia múltiple
3.9.1. Herencia simple (herencia jerárquica)
Problemas
En esta jerarquía cada clase tiene como máximo una sola supeiclase. La heren- 1 La propiedad referida solo está en una de las subclases padre
cia simple permite que una clase herede las propiedades de su superclase en una 2 La propiedad concreta existe en más de una superclase
cadena jerárquica
Caso 1 No hay problemas
Atributos Atributos
Nombre Nombre
Dirección Dirección
Campus Estudios
Curso Salario
Año Días-Vacaciones
Método
Aumento Salario
Atributos heredados ~ é t o d oheredados
s
Nombre Días-Vacaciones Aumento-Salario
Figura 3 2 7 Herencia simple,, Dirección Curso
Salario Campus
Estudios Año
3..9.2.. Herencia múltiple (herencia en malla) Figura 3.,29 Herencia de atributos y métodos
Una malla o retícula consta de clases, cada una de las cuales puede tener uno O Caro 2 Existen diferentes tipos de conflictos que pueden ocurrir:
más superclases inmediatas Una herencia múltiple es aquella en la que cada Conflictos de nombres
clase puede heredar métodos y variables de cualquier número de superclase
100 Programación orientada a objetos Conceptos fundamentales de programación orientada a objetos 101
Clases abstractas
3..9.3..
Con frecuencia, cuando se diseña un modelo orientado a objetos es útil introdu-
cir clases a cierto nivel que pueden no existir en la realidad pero que son cons-
trucciones conceptuales útiles Estas clases se conocen como clases abstractas
Una clase abstracta normalmente ocupa una posición adecuada en la jerar-
quía de clases que le pe~miteactuar como un depósito de métodos y atributos
compartidos para las subclases de nivel inmediatamente inferior
Las clases abstractas no tienen instancias directamente Se utilizan para
agrupar otras clases y capturar información que es común al grupo Sin embar-
go, las subclases de clases abstractas que corresponden a objetos del mundo
real pueden tener instancias Figura 3 3 2 Anulación de atributos y métodos en clases derivadas
102 Programación orientada a objetos Conceptos fundamentales de programación orientada a objetos 103
Supongamos que ciertos atributos y métodos definidos en la clase A se Actualmente la sobrecarga se aplica sólo a operaciones Aunque es posi-
redefinen en la clase C Las clases E, F, G y H heredan estos atributos y ble extender la propiedad a atributos y relaciones específicas del modelo
métodos La cuestión que se produce es si estas clases heredan las definiciones propuesto
dadas en la clase A o las dadas en la clase C El convenio adoptado es que una La sobrecaiga no es una propiedad específica de los lenguajes orientados a
vez que un atributo o método se tedefine en un nivel de clases específico, objetos Lenguajes tales como C y Pascal soportan operaciones sobrecargadas
entonces cualquier hijo de esa clase, o sus hijos en cualquier profundidad, Algunos ejemplos son los operadores aritméticos, operaciones de E/S y opera-
utilizan este método o atributo redefinido Por consiguiente, las clases E, F, G dores de asignación de valores
y H utilizarán la redefinición dada en la clase C, en lugar de la definición dada En la mayoría de los lenguajes, los operadoies aritméticos «+»,« » y <e»
en la clase A se utilizan para sumar, restar o multiplicar números enteros o reales Estos
operadores funcionan incluso aunque las implementaciones de aritmética ente-
ra y real (coma flotante) sean bastante diferentes. El compilador genera código
3.,11. SOBRECARGA objeto para invocas la implementación apiopiada basada en la clase (entero o
coma flotante) de los operandos.
La sobrecarga es una propiedad que describe una caiacterística adecuada que Así, por ejemplo, las operaciones de E/S (Entrada/Salida) se utilizan con
utiliza el mismo nombre de operación para representar operaciones similares frecuencia para leer números enteros, caiacteres o reales En Pascal readix)
que se comportan de modo diferente cuando se aplican a clases diferentes Por se puede utilizar, siendo x un entero, un carácter o un real Naturalmente, el
consiguiente, los nombres de las operaciones se pueden sobrecargar, esto es, las código máquina real ejecutado para leer una cadena de caracteres es muy
operaciones se definen en clases diferentes y pueden tener nombres idénticos, diferente del código máquina para leer enteros readix) es una operación
aunque su código programa puede diferir sobrecargada que soporta tipos diferentes Otros operadores tales como
Si los nombres de una operación se utilizan para nuevas definiciones en los de asignación («:=» en Pascal o « = » en C) son sobrecargados Los
clases de una jerarquía, la operación a nivel inferior se dice que anula la opera- mismos operadoies de asignación se utilizan para variables de diferentes
ción a un nivel más alto tipos
Un ejemplo se muestra en la Figura 3 33, en la que la operación Incre- Los lenguajes de programación convencionales soportan sobrecarga para
mentar está sobrecargada en la clase Empleado y la subclase Administra- algunas de las operaciones sobre algunos tipos de datos, como enteros, reales y
tivo Dado que Administrativo es una subclase de Empleado, la opera- caracteres Los sistemas orientados a objetos dan uiz poco más en la sobrecarga
ción incrementar, definida en el nivel Administrativo, anula la operación y la lzacen disponible para operaciones sobre cualquier tipo objeto,
correspondiente al nivel Empleado En Ingeniero la opetación incremen- Por ejemplo, en las operaciones binasias se pueden sobrecarga1 para núme-
tar se hereda de Empleado Por otra parte, la sobrecarga puede estar situada ros complejos, arrays, conjuntos o listas que se hayan definido como tipos
entre dos clases que no están relacionadas jerárquicamente Por ejem- estructurados o clases Así, el operador binario <<+ n se puede utilizar pala
plo, Cálculo-Comisión está sobrecargada en Administrativo y en sumar las correspondieiites partes reales e imaginarias de los números comple-
Ingeniero Cuando un mensaje calcular-Comisión se envía al objeto jos Si ~l y A2 son dos array de enteros, se pueden definir:
><
ingeniero,la operación correspondiente asociada con ingeniero se activa,
Nombre
Empleado para sumar:
a = a naci;n
A[i] := Al[il + A2[il //para todo i
3..12.. LIGADURA DlNAMlCA realiza en las subclases En este caso, por consiguiente, la selección del método
se hace en tiempo de compilación, pero el código real del método utilizado se
Los lenguajes 00 tienen la característica de poder ejecutar ligadura tardía determina utilizando ligadura dinámica o tardía en tiempo de compilación
(dinámica), al contrario que los lenguajes imperativos, que emplean ligadura Esto permite definir el método de un número de formas diferentes para cada
temprana (estática) Por consiguiente, los tipos de variables, expresiones y fun- una de las diferentes clases Consideremos la jerarquía de clases definida en la
ciones se conocen en tiempo de compilación para estos lenguajes imperativos Figura 3 34,
Esto permite el enlazar entre llamadas a procedimientos y los procedimientos Aquí el método virtual se define en la clase FIGURA y el código procedimeu-
utilizados que se establecen cuando se cumple el código En un sistema 00 esto tal real utilizado se define en cada una de las subclases CIRCULO, CUADRADO,
requería el enlace entre mensajes y que los métodos se establezcan en tiempo RECTANGULO y LINEA Ahora, si un mensaje se envía a una clase específica, se
dinámico ejecuta el código asociado con ella Esto contrasta con un enfoque más conven-
En el caso de ligadura dinámica o tardía, el tipo se conecta directamente al cional que requiere definir los procedimientos por defecto, con nombres dife-
objeto Por consiguiente, el enlace entre el mensaje y el método asociado sólo se rentes, tales como Dibujar-círculo, Dibujar-cuadrado, etc También se
puede conocer en tiempo de ejecución. requerirá utilizar una llamada al nombre de la función específica cuando sea
La ligadura estática permite un tiempo de ejecución más rápido que la necesario
ligadura dinámica, que necesita resolver estos enlaces en tiempo de ejecución
Sin embargo, en ligadura estática se ha de especificar en tiempo de compilación
las operaciones exactas a que responderá una invocación del método o función
específica, así como conocer sus tipos 3..12.2.. Polimorfismo
el contrario, en la ligadura dinámica simplemente se especifica un méto-
do en un mensaje, y las operaciones reales que realizan este método se determi- La capacidad de utilizar funciones virtuales y ejecutar sobrecarga conduce a
nan en tiempo de ejecución Esto permite definir funciones o métodos virtuales una característica importante de los sistemas 00,conocida como polinzorfismo,
que esencialmente permite desarrollar sistemas en los que objetos diferentes
puedan responder de modo diferente al mismo mensaje
3.12..1. Funciones o métodos virtuales En el caso de un método virtual se puede tener especialización incremental
de, o adición incremental a, un método definido anteriormente en lajerarquía
Las funciones virtuales en C + + permiten especificar un método como virtual Más adelante volveremos a tratar este concepto,
en la definición de una clase particular La implementación real del método se
-. Método virtual
3..13. OBJETOS COMPUESTOS
Una de las características que hacen a los objetos ser muy potentes es que
pueden contener otros objetos Los objetos que contienen otros objetos se
conocen como objetos conzpuestor
En la mayoría de los sistemas, los objetos compuestos no «contienen» en el
sentido estricto otros objetos, sino que contienen variables que se iefiexen a
otros objetos La referencia almacenada en la variable se llama identificador del
objeto (ID del objeto),
Esta caracteiística ofrece dos ventajas importantes:
Coche
tiene-un /
c5 Motor
, T ~ ' R
parte-de parte_de
significa que puede construir estructuras de cualquier complejidad conectando La jerarquía componente-de ( p u fte-de) pueden estar solapadas o anidadas
objetos juntos Esto es importante debido a que normalmente se necesita más Una jerarquía de solapamiento consta de objetos que son componentes de más
de un nivel de modulariración para evitar el caos en sistemas a gran escala, de un objeto padre
Un objeto compuesto, en general, consta de una colección de dos o más Una jerarquía anidada consta de objetos que son componentes de un objeto
objetos relacionados conocidos como objetos componentes Los objetos com- padre que, a su vez, puede actuar como componente de otro objeto. El objeto Z
ponentes tienen una relación una parte-de o un componente-de con objeto com- es un componente del objeto B, y el objeto B es un componente de un objeto
puesto Cuando un objeto compuesto se instancia para producir un objeto complejo más grande, A
instancia, todos sus objetos componentes se deben instanciar al mismo tiempo
Cada objeto componente puede, a su vez, ser un objeto compuesto, resultando,
por consiguiente, una jerarquía de componentes-de
Un ejemplo de un objeto compuesto es la clase COCHE Un coche consta de
diversas partes, tales como un motor, un sistema de frenos, un sistema de
transmisión y un chasis; se puede considerar como un objeto compuesto que
consta de partes diferentes: MOTOR, SISTEMA-FRENOS, SISTEMA-TRANSMI-
SION,CHASIS Estas partes constituyen los objetos componentes del objeto
COCHE,de modo que cada uno de estos objetos componentes pueden tener
atributos y métodos que los caracterizan
COCHE
atribvtos
Número_coches-vendidos
atributos compartidos
C o n c e s i o n a r i o : SEAT Andalucía Figura 3 3 9 . Jerarquia de componentes agregados
atributos instancia
Modelo
Color
Precio
componentes
MOTOR
1 SISTEMA-FRENOS
1 SISTEMP-TRANSMISION
CHASIS
MOTOR
Figura 3 4 0 Anidamiento de objetos,
Atributos:
Número-cilindras Tipo: Un ejemplo típico de un objeto compuesto anidado es un archivador Un
Potencia ABS: archivador contiene cajones, un cajón contiene carpetas y una carpeta contiene
Cilindrada Proveedor: documentos El ejemplo COCHE, citado anteriormente, es tambikn un objeto
Válvulas-cilindro
compuesto anidado
número, se puede crear la función que realice la taiea que el programa necesita, terística El símbolo +, cuando se utiliza con enteros, representa un conjunto
Con un esfuerzo suplementario se puede crear una función que pueda elevar de instrucciones máquina distinto de cuando los operadores son valores reales
cualquier número a cualquier potencia Esta función se debe guardar para de doble precisión De igual modo, en algunos lenguajes el símbolo + sirve
poderla utilizar como herramienta de propósito general en cuantas ocasiones para realizar sumas aritméticas o bien para concatenar (unir) cadenas,
sea necesario La utilización de operadores o funciones de formas diversas, dependiendo
Las ventajas de la reutilización son evidentes El ahorro de tiempo es, sin de cómo se estén operando, se denomina poliilzo~fisilzo(múltiples formas)
duda, una de las ventajas más considerables, y otra la facilidad para intercam- Cuando un operador existente en el lenguaje tal como +, = o x; se le asigna
biar software desarrollado por diferentes programadores la posibilidad de operar sobre un nuevo tipo de dato, se dice que está sob~ecar-
En la programación tradicional, las bibliotecas de funciones (casos de gado La sobiecaiga es una clase de polimorfismo, que también es una carac-
FORTRAN o C) evitan tener que ser escritas cada vez que se necesita su uso teiística importante de P O 0 Un uso típico de los operadores aritméticos es la
Ada y Modula-2 incorporan el tipo de dato paquete (package) y módulo sobrecarga de los mismos para actuar sobre tipos de datos definidos por el
(module) que consta de definición de tipos y códigos y que son la base de la usuario (objetos), además de sobre los tipos de datos predefinidos Supongamos
reutilizacióii de esos lenguajes que se tienen tipos de datos que iepresentan las posiciones de puntos en la
pantalla de un computador (coordenadas x e y) En un lenguaje orientado a
objetos se puede realizar la operación aritmética
3.14.1. Objetos y reutilización
posición1 = origen + posición2
La progtamacióii orientada a objetos pioporciona el marco idóneo para la
reutilización de las clases Los conceptos de encapsulamiento y herencia son las donde las variables posiciónl, posición2 y o~igenrepresentan cada una posicio-
bases que facilitan la reutilización Un programador puede utilizar una clase nes de puntos, sobrecargando el operador más (+) para realizar suma de posi-
existente, y sin modificarla, añadirle nuevas características y datos Esta opera- ciones de puntos (x, y) Además de esta operación de suma se podrían realizar
ción se consigue derivando una clase a partir de la clase base existente La otias operaciones, tales como iesta, multiplicación, etc, sobrecargando coiive-
nueva clase hereda las propiedades de la antigua, pero se pueden añadii nuevas nientemente los operadores -, *, etc
propiedades Pot ejemplo, suponga que se escribe (o compia) una clase menú En un sentido más general, el polimorfismo supone que un mismo mensaje
que crea un sistema de menús (barias de desplazamiento, cuadros de diálogo, puede producir acciones (resultados) totalmente diferentes cuando se reciben
botones, etc); con el tiempo, aunque la clase funciona bien, obseiva que sería por objetos diferentes. Con polimorfismo un usuario puede enviar un mensaje
interesante que las leyendas de las opciones de los menús parpadearán o cam- genérico y dejar los detalles de la implementación exacta para el objeto que
biarán de color Pala realiza1 esta tarea se diseña una clase derivada de menú recibe el mensaje El polimorfisino se fortalece con el mecanismo de herencia
que añada las nuevas propiedades de parpadeo o cambio de color Supongamos un tipo objeto llarnado vehlculo y tipos de objetos deriva-
La facilidad para reutilizar clases (y en consecuencia objetos) es una de las dos llamados bicicleta,automóvil,moto y embarcación Si se envía un
propiedades fundamentales que justifican el uso de la programación orientada mensaje conducir al objeto vehículo,cualquier tipo que herede de vehículo
a objetos Por esta razón los sistemas y en particular los lenguajes orientados a puede también aceptar ese mensaje Al igual que sucede en la vida real, el
objetos suelen venir provistos de un conjunto (biblioteca) de clases predefinidas, mensaje conducir reaccionará de modo diferente en cada objeto, debido a que
que permite ahorrar tiempo y esfuerzo en el desairo110 de cualquier aplicación cada vehículo iequiere una forma distinta de conducir
Esta lieriamieiita -la biblioteca de clases- es uno de los parámetros funda-
mentales a tener en cuenta en el moineiito de evaluar un lenguaje orientado a
objetos RESUMEN
E:l tipo abstiacto de datos se implementa a través de clases Una clase es un
conjunto de objetos que constituyen inslancias de la clase, cada una de las
cuales tienen la misma estructura y comportamiento Una clase tiene un noni-
Otra propiedad importante de la programación orientada a objetos es el poli- bre, una colección de operaciones para manipular sus instancias y una repre-
moifisino Esta propiedad, en su concepción básica, se encuentra en casi todos sentación. Las operaciones que manipulan las instancias de una clase se llaman
los lenguajes de programación El polimorfismo, en su expresión más simple, es nlétodos El estado o representación de una instancia se almacena en variables
el uso de un nombie o un símbolo -por ejemplo un operador- para represen- de iiistancia Estos métodos se invocan mediante el envío de mensaje,^ a instan-
tal o significa1 más de una acción Así, en C, Pascal y FORTRAN -entre otros cias El envío de mensajes a objetos (instancias) es similar a la llamada a proce-
lenguajes- los operadores aritméticos repiesentan un ejemplo de esta carac- dimientos en lenguajes de programación tradicionales
112 Programación orientada a objetos
un objeto>>de una clase y todas las clases heredan de una única clase base otras clases de su jerarquía El lenguaje C + + permitía la ligadura diná-
denominada O b j e c t Smalltalk afirmó el término «método» para describir las mica y el polimorfismo, así como sobrecarga de funciones y operaciones
acciones realizadas por un objeto y el concepto de «paso de mensajes» como el Sin embargo, al contrario que Smalltalk, las primeras versiones de C + +
medio para activar «métodos» Es también un lenguaje tipificado dinámica- no se comercializaban en bibliotecas grandes de clases predefinidas
mente, que liga (enlaza) un método a un mensaje en tiempo de ejecución Otro dialecto importante de C f , con propiedades orientadas a ob-
Smalltalk ha sido, a su vez, el inspirador de un gran número de lenguajes jetos, es Objective-C [Cox, 19871 Este lenguaje es un superconjunto
00 Entre ellos destaquemos Eiffel, Smalltalk-80, Smalltalk/V, C + + , Actor, de C, que incorpora características orientadas a objetos de Smalltalk
Objective-C y CLOS, así como extensiones 00 de lenguajes tradicionales, tales Al igual que Smalltalk, Objective-C incluía una gran colección de clases
como Object Pascal, Object COBOL, etc predefinidas que permitía simplificar el proceso de desarrollo Objecti-
Bertran Meyer, el diseñador de Eiffel, fue también un usuario de Simula, e ve-C soportaba tipos abstractos de datos, herencia y sobrecarga de ope-
incluso llegó a ser presidente de la Asociación de Usuarios de Simula .Jean radores Sin embargo, al contrario que C + + , no ampliaba la definición
Ichbiah, el diseñador jefe de Ada-83, dirigió un equipo que implementó un de construcciones existentes en lenguajes, y diseñó nuevas construcciones
subconjunto de Simula, y Bjarne Stroustrup, el diseñador de C + + , utilizó y operadores para realizar tareas tales como definición de clases y paso
Simula y siempre ha agradecido su influencia en el diseño de C + + de mensajes L.as computadoras NEXT, cuyo éxito iio pasó de unos años,
Existen varias versiones y dialectos de Smalltalk: Smalltalk-72, -'74, -'76, -78, eligieron Objective-C como su principal lenguaje de desarrollo
-80, y más recientemente -y seguramente la más popular- Smalltalk/V de Niklaus Wirt y un grupo de ingenieros informáticos de Apple Com-
Digitalk Smalltalk no es un lenguaje tipificado Smalltalk es extraordinaria- puter diseñaron Object Pascal [Schmucker, 19861 Extendió el lenguaje
mente rico en conceptos orientados a objetos. En Smalltalk todo es un objeto, Pascal con soporte para tipos abstractos de datos, métodos y herencia
incluyendo clases base y tipo base Esto significa que la potencia de Smalltalk, Incluyó el concepto de tipo de objeto y definición de clases,
como un entorno de programación completo, se fundamenta en el envío de Los nuevos lenguajes Ada-95 y Java son totalmente orientados a
mensajes a objetos objetos
Otra característica fundamental que diferencia a Smalltalk es su capacidad 3 Lenguajes orientados a objetos,fuerteine~ztetipificados Simula fue uno de
de concurrencia La concurrencia es un aspecto del mundo real Por ejemplo, en 10s lenguajes orientados a objetos que se desarrollaron en la década
un entorno de oficina, secretarias, administrativos, gerentes y otros empleados de los ochenta y que fueron implementados en diversas plataformas
funcionan simultánea e independientemente Se comunican entre sí, a través de Otros lenguajes han emergido en la década de los ochenta, con
conversaciones, informes, correo electrónico, etc Smalltalk empleó la construc- características fuertemente tipificadas (con verificación estricta de ti-
ción denominada proceso para soportar concurrencia, pos) Un lenguaje disponible comercialinente y más interesante es Eiffel
Durante la década de los ochenta, los conceptos orientados a objetos (tipos [Meyer, 19881 de Interactive Software Engineering, Inc Además de
abstractos de datos, herencia, identidad de objetos y concurrencia), Smalltalk, encapsulamiento y herencia, Eiffel incorpora muchas características
Simula y otros lenguajes comenzaron a mezclarse y producir nuevos lenguajes orientadas a objetos, tales como tipos paraiizétricos y pre y post-condi-
orientados a objetos, así como extensiones y dialectos El desarrollo de lenguajes cioizes para métodos Otro lenguaje fuertemente tipificado que soporta
de orientación a objetos en esa década se muestra en la siguiente clasificación: conceptos orientados a objetos (abstracción, objetos, tipos paramétri-
cos) es Ada, aunque la versión Ada-83 presenta el inconveniente de no
1 Extenscones, dialectos y ve?siones de Smalltalk Xerox y Textronix incor- sopor tar hereizcia
poraron en sus máquinas, a principios de los ochenta, la versión Small- 4 Exteizsioizes orientadas a objetos de LISP Existen diferentes versiones
de LISP, aunque la más conocida y notable es CL.OS (Common List
Object System) CLOS es un lenguaje 00 que introduce notables mejo-
y compatibles, ras y tiene garantizada larga vida, especialmente desde la creación del
2 Extelzsiones orientadas a objetos de lenguajes convencionales Uno de los comité X3J13 de ANSI para la estandarización del lenguaje
lenguajes orientados a objetos más populares es C + + Este lenguaje
fue diseñado por Bjarne Stroustrup en AT&T al principio de los ochen-
ta [Stroustrup, 19861 La primera implementación del lenguaje C + + se 4.1.1. Estado actual de los lenguajes orientados a objetos
lanzó como un preprocesador a los compiladores C C + + proporcionó en la década de los noventa
dos construcciones para definiciones de clases El primer método es una
extensión de la construcción s t r u c t (estructura de C) y la otra nueva La década de los ochenta lanzó la orientación a objetos como base de la futura
construcción c l a s s (clase) C + + incorporó jerarquía de clases y per- ingeniería de software orientada a objetos de la década de los noventa En 1982
mitía subclases que podían acceder a métodos y variables instancias de se predijo que la piogramación orientada a objetos sería en la década de los
118 Programación orientada a objetos Lenguajes d e programación orientados a objetos 119
ochenta lo que la programación estructurada fue en los setenta [Rentsch, 4.,2..1. Taxonomía de lenguajes orientados a objetos
19821 La piofecí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 Una taxonomía de lenguajes de programación con propiedades de orientación
década de los noventa a objetos fue creada por Wegner2 La clasificación incluye los siguientes grupos:
Sin duda, el desarrollo de conferencias internacionales sobre orientación a
objetos y, en especial, OOSPLA (Object-Oriented Programming Systems and 1 Basado en objetos Un lenguaje de programación es basado en objetos
LAnguages) han sido los detonantes de la explosión de la 00 en la década de si su sintaxis y semántica soportan la creación de objetos que tienen las
los noventa La primera conferencia se celebró en el año 1986 piopiedades descritas en los capítulos anteriores
Otros hitos que han influido considerablemente en el enorme desarrollo de 2 Basado en clases Si un lenguaje de programación es basado en obje-
los LPOO han sido la aparición de diferentes publicaciones periódicas exclusi- tos y soporta además la creación de clases, se considera basado en
vamente dedicadas a orientación a objetos En 1988 apareció la primera revista clases,
de prestigio: Ihe Iournal of Object-Oriented Programming 3 O~ientacióna objetos. Un lenguaje de programación orientado a obje-
-
En la década de los noventa, los lenguajes, técnicas, interface5 gráficos y tos es un lenguaje basado en clases que soporta también herencia
bases de datos se están haciendo muy populares Sin duda, los noventa será la
década de la proliferación de tecnologías y lenguajes orientados a objetos
Microsoft, IBM, Borland, Sun, A'I&T, Digitalk, Symantec y otras grandes
compañías están lanzando productos orientados a objetos de modo continuo y
Objetos Basado en objetos
+\ + clases
progresivo Actor
Los lenguajes más implantados en la actualidad son Smalltalk y Eiffel, Clipper 5 X Basado en clases
junto con C + + , Object Pascal (Turbo/Borland Pascal especialmente), Visual
+ herencia
BASIC y Object Visual como lenguajes híbridos
C f + es, sin lugar a dudas, el lenguaje más popular, aunque Smalltalk está
Clu
1
/ Orientado a objetos /
ganando adeptos día a día Tanto C + + como Smalltalk han sido implementa-
dos en diferentes plataformas: DOS, UNIX, OS/2, Windows e incluso en siste- C++
mas grandes; su importancia reside en la gran cantidad de desarrolladores y Eiffel
Simula
vendedores que comercializan estos lenguajes, Smalltalk
Turbo Borland Pascal
Delphi
4..2. CLASlFlCAClON DE LENGUAJES ORIENTADOS Visual Object
Obiect COBOL
A OBJETOS da-95
Como ya se ha comentado anteriormente, los lenguajes de programación orien- Figura 4 2 Taxonomía de lenguajes 00 de Wegner,
tados a objetos son: Eiffel, Lisp, Prolog, Simula, Smalltalk, C + + , Object Pas-
cal, etc Se entienden por lenguajes orientados a objetos aquellos que soportan Esta taxonomía de orientación a objetos proporciona una definición estiic-
las características de orientación a objetos Otros lenguajes de programación, ta de los lenguajes de programación orientados a objetos, que ha prevalecido
tales como Ada, C, Cliper, pueden implemeiitar algunas características orienta- en la época actual Según esta taxonomía, no es suficieiite que un lenguaje
das a objetos, utilizando ciertas técnicas de programación, pero no se conside- soporte la creación de objetos; para ser considerado orientado a objetos, es
ran orientados a objetos necesario que existan construcciones de creación de clases y que soporten he-
Los piincipales lenguajes de piogramación utilizados actualmente pasa sis- rencia adecuadamente
. .~.
temas de tiempo real son C y Ada Ada fue diseñado específicamente para la C + + soporta la creación de objetos y clases, así como herencia, y es poi
implementación de sistemas en tiempo real, especialmente empotrados Aunque consiguiente totalmente orientado a objetos. Ada-83 soporta la creación de
Ada (Ada-83) no cumple las propiedades importantes de un LPOO (por ejemplo objetos mediante paquetes (tipos abstractos de datos) Un paquete en Ada no
herencia y ligadura dinámica), soporta un enfoque de diseño orientado a objetos
y se le conoce usualmente como basado en objetos [Wegner, 871 Ada-95, ya
estandarizado por ISO y ANSI, soporta herencia y ligadura dinámica; en conse- WEGNER,P : The Ohject-Oiiented Clars$calioil Poiadigrii iri Rcsearch Di>ections ilz Ohjecr-
cuencia, aunque todavla con restricciones, se considera orientado a objetos, Oiieizted Piograrnrning págs 508-510 MIT Press, Cambiidge, MA 1987
120 Programación orientada a objetos Lenguajes de programación orientados a objetos 121
es una definición de tipos como la clase C + + , y en consecuencia Ada es un pasar señales entre módulos, sin necesidad de tener que pasar real-
lenguaje basado en objetos Ada-95 soporta, además de las propiedades de mente ningún dato
Ada-83, clases y herencia, y se puede considerar orientado a objetos 6 Polimorfismo. L.os lenguajes deben permitir que existan operaciones
De acuerdo a la taxonomía de Wegner, se podría actualizar la clasificación con igual nombre, que se utilicen para manejar objetos de tipos dife-
de los lenguajes pensando en la segunda década de los noventa: rentes en tiempo de ejecución El polimorfismo se implementa, nor-
malmente, en unión con la herencia
Leizguajes basados erz objetos Ada-83, Actor, Clipper 5 2, Visual Basic 4 7 Excepciones Se deben poder detectar, informar y manejar condicio-
Lerzguajer basados eiz clase? Clu nes excepcionales utilizando construcciones del lenguaje Esta propie-
Lenguajes o1,ientados a objetos C + + , Objective-C, dad añadida al soporte de tolerancia a fallos del software permitirá
Object Pascal, Delphi, Visual Object, una estrategia de diseño eficiente
Object COBOL,, Overon 8 Concurrencia Es conveniente que el lenguaje soporte la creación de
Eiffel, Smalltalk, Simula, procesos paralelos independientes del sistema operativo. Esta propie-
Prolog++, CL.OS, Ada-95 dad simplificará la transportabilidad de un sistema de tiempo real de
una plataforma a otra
9 Persistencia. Los objetos deben poder ser persistentes; es decir, los
4.,2..2. Características de los lenguajes orientados objetos han de poder permanecer después de la ejecución del pro-
a objetos grama
10 Datos compartidos. Los módulos se deben poder comunicar median-
Además de las caracteiísticas citadas anteriormente de objetos, clases y heren- te memoria compartida, además del paso de mensajes
cia, los LPOO deberán tener algunas o todas las características que se citan a Los lenguajes de programación disponibles actualmente no cumplen todas
continuación: las características citadas anterioimente En geneial, los lenguajes orientados a
objetos no soportan concurrencia; este es el caso de C + + , aunque las versiones
1 lipificación estricta (fuerte) Iipificacidiz es el proceso de declarar el
de C++que siguen el futuro estándar 4 0 comienzan a incorporar propiedades
tipo d'e información que puede contener una variable Los errores de
de concurrencia e incluso persistencia Asimismo, Ada-95, además de concu-
programación ielacionados con el número de parámetros, tipos de
rrencia, soporta ya herencia y polimorfismo
parámetros e interfaces de módulos, se detectan durante las fases de
diseño e implementación, en lugar de en tiempos de ejecución
2 Encapsulamiento. Es deseable que el lenguaje soporte ocultación de
la información, mediante partes independientes, para la especificación 4.2.3. Puros frente a híbridos
y la implementación Esta característica proporciona un diseño débil-
mente acoplado que cumple con rigor el principio básico de la inferen- Existe un profundo debate entre los usuarios y desarrolladores de 00 sobre la
cia de software: acoplamiento d6bil y fuerte cohesión entre los módulos decisión del lenguaje a emplear Este debate no es reciente, aunque sí es en la
de un programa actualidad cuando este debate se ha acrecentado y ha comenzado a ser decisivo
3 Compilación incremental Característica en el desarrollo de sistemas en el desarrollo de la 00
grandes, en los que las porciones del sistema se crean e implementan Un LPOO puro es un lenguaje diseñado para soportar únicamente el paia-
de un modo sistemático (poco a poco, etapa a etapa) Esta carac- digma orientado a objetos, en el que todo consta de objetos, métodos y clases
terística complementa la característica de tipificación estricta, que so- Los LPOO más populares son Smalltalk y Eiffel Un LPOO hz'bl.ido, por otra
porta partes independientes de implementación y específica. parte, soporta otros paradigmas de programación (tales como el tradicional
4 Genericidad L,as clases parametrizadas (mediante plantillas -tem- -estructurado-, funcional, etc), además del paradigma orientado a objetos
plates- o unidades genéricas) sirven para soportar un alto grado de Los lenguajes híbridos se constiuyen a partir de otros lenguajes existentes, tales
reusabilidad (reutilización) Estos elementos genéricos se diseñan con como C o Pascal, de los cuales se derivan; es posible utilizar el L.POO de un
parámetros brmales, que se instanciarán con parámetros reales, para modo no orientado a objetos y también como orientado a objetos utilizando
crear instancias de módulos que se compilan y enlazan y ejecutan objetos, clases y métodos
posteriormente Cada tipo de lenguaje tiene sus ventajas e inconvenientes Los lenguajes
5 Paso de mensajes.. El lenguaje es conveniente soporte paso bidimen- puros, tales como Smalltalk o Eiffel, pueden ser más potentes, ya que utilizan
sional de mensajes entre módulos, lo que implicará módulos débil- todas las ventajas de la tecnología. Proporcionan su máxima flexibilidad para
mente acoplados y diseños flexibles Esto significa que se deben poder cambiar los aspectos esenciales del lenguaje Dado que todo en el lenguaje se
122 Programación orientada a objetos Lenguajes de programación orientados a objetos 123
--
Lenguajes puros Lenguajes hibndos quier intento de situat otra clase de datos en la variable producirá un mensaje
de errot
Algunos lenguajes de objetos requieren que a todas las variables se les
Mensajes Mensajes asigne un tipo antes de que se pueda utilizar Otros lenguajes no requieren esos
requisitos, petmitiendo que las variables puedan tomar sus tipos adecuados en
+ cualquier instante dado Estas dos opciones se denominan tipificación fuerte,
estricta o estática, y tipificación débil, no estricta o diizámica
La tipificación fuerte o sistemas de tipos estáticos exige que el progtama-
tradicional
dor asocie explícitamente un tipo con cada nombre declarado en un progra-
ma, de modo que el coinpilador del lenguaje puede verificar que los nombres
y expresiones compuestas de estos nombres se refieren siempre a los objetos
Figura 4.3, Lenguajes 00 purosihibridos,, del tipo especificado El tipo de cada objeto se ha de determinar y comprobai
antes que se ejecute el programa Lenguajes con sistemas de tipos estáticos
construye sobre la base de los objetos, se pueden realizar cambios profundos si son los tradicionales FORTRAN, COBOL y PASCAL.. L.a tipificación fuerte es
son necesarios menos flexible pero más segura, ya que el lenguaje puede realizar comprobacio-
Existe un piecio, sin embargo, a la potencia y flexibilidad de los lenguajes nes de iutinas para asegurar que los parámetros de los mensajes sean de tipo
puros L.a mayoría de los lenguajes puros no son tan rápidos como los híbridos correcto
y son difíciles de codificar en toda clase de operaciones fundamentales Esto les L.as ventajas considerables de un lenguaje tipificado estáticamente son que
hace perder eficiencia en tiempo de ejecución. los eirores relativos a tipos se capturan (detectan) durante la compilación, antes
En contraste, los lenguajes híbridos pierden con frecuencia alguna de las de que se ejecute el programa, y el programa se puede ejecutar más eficiente-
características de los lenguajes puros y normalmente no permiten modificar mente, dado que no hay necesidad de hacer ninguna veiificación de tipos en
características de construcción del lenguaje base; aunque, como ya se ha co- tiempo de ejecución,
mentado, son normalmente más rápidos para operaciones construidas en el Los lenguajes con un sistema de tipos dinámicos (lenguajes de tipificación
lenguaje base débil) no exigen que el programador haya de especificar el tipo de objeto que
Los lenguajes puros e híbridos difieren también en la facilidad de aprendiza- puedan contenei las variables cuando se escribe el programa Cada objeto
je, si bien esta facilidad dependerá del nivel de cada persona Así, para un conoce su propio tipo cuando se crea durante la ejecución Las ventajas de los
programador la enseñanza de un lenguaje puro normalmente es más fácil, ya lenguajes con un sistema de tipos dinámicos son que los programas son más
que es más sencillo: sólo ha de aprenderse un lenguaje y no dos, como en el flexibles y puede disponer de nuevos tipos de objetos que no fueion previstos
caso de un lenguaje híbrido Sin embargo, para un piogramador experimenta- cuando se escribió el programa Esta flexibilidad se hace a costa de una pérdida
do, el movimiento o emigtación hacia un lenguaje híbrido puede ser más fácil si de eficiencia durante la ejecución del programa, debido a la necesidad de man-
está ya familiarizado con el lenguaje base, pues entonces s61o necesita dominar tener y comprobar el tipo de todos los objetos durante la ejecución
las extensiones orientadas a objetos Los lenguajes de objetos puros normalmente utilizan tipificación débil, ya
En la actualidad, C + + es el lenguaje más popular y utilizado; sin embargo, que este enfoque les proporciona máxima flexibilidad, especialmente durante el
Smalltalk está ganando día a día en aceptación, debido esencialmente a estar desarrollo, cuando se crean nuevos tipos objetos Los lenguajes hibridos, en
soportado por las plataformas DOS, UNIX y Windows El hecho de que en contraste, tienden a construirse como lenguajes fuertemente tipificados Es po-
1994 IBM lanzase versiones de Smalltalk para sus sistemas OS12 y AIX hará sible especificar el tipo de un aigumento, de modo que haya flexibilidad en
crecer el número de usuarios de este lenguaje tiempo de ejecución, pero esta tarea requiere esfuerzos especiales
ConSt n = 3;
var x : integer;
426. Revisión de lenguajes orientados a objetos
el valor 3 se enlaza estáticamente al nombre n, mientras que el tipo de dato
i n t e g e r se enlaza al nombre x Por otra parte, consideremos la sentencia de Los dos lenguajes más utilizados en el desarrollo 00 y más introducidos en el
asignación x := 3; en este caso, se enlaza 3 dinámicamente a x cuando se mercado son Eiffel, Smalltalk (en sus versiones 80 y V), C + + , Actor, Objective-
ejecuta la sentencia de asignación Y la sentencia C, CLOS, Object Pascal (especialmente 'Turbo Pascal) y Visual BASIC
El lenguaje Ada se suele considerar por muchos autores como basado erz
new (y1 ; objetos, debido esencialmente a que soporta el concepto de abstracción de
datos mediante el paquete y la genericidad mediante unidades genéricas; tain-
enlaza dinámicamente una posición de almacenamiento a yA y asigna a esa bién es considerado basado en objetos, debido a que Grady Booch, autor del
posición el valor de y famoso método de diseño Booch, se apoyó en dicho lenguaje en su primera
versión del método; la metodología HOOD también se apoya en Ada como
lenguaje fundamental La nueva versión Ada-95 ya es totalmente orientada a
Ejemplo de ligadura estática objetos
El lenguaje Eiffel se examina brevemente, debido a que fue diseñado para
Se desea procesar una determinada función, según sea un determinado carácter soportal totalmente la orientación a objetos y otras características de inge-
(código) Mediante una sentencia s w i t c h se podría realizar el programa niería de software El uso de precondiciones, poscondiciones e invariantes me-
correspondiente en C + + : joran significativamente la robustez y documentación de programas desarrolla-
dos en Eiffel
Smalltalk, como heredero directo de Simula, es el prototipo de lenguaje de
programación orientado a objetos puro
static vaid salir O funcl O , func2 0 ;
Además de estos lenguajes, realizaremos una síntesis de los lenguajes Ob-
char car; jective-C, Object Pascal y Visual BASIC Por la importancia del lenguaje
11; C + + y dado que es el lenguaje utilizado en este libro para la implementación
//czar, contiene el código de carácter de los conceptos orientados a objetos, se dedicarán capítulos específicos para
int codigo = toupper(car1; enseñar la escritura y sintaxis del lenguaje, así como reglas y consejos para
switch (codigo)
i
mejorar el estilo de programación y reglas y consejos para la depuración de
case 'S' : SalirO; progiamas
126 Programación orientada a objetos Lenguajes de programación orientados a objetos 127
4.,3.. ADA Un tipo abstiacto de dato paia iepresentar números completos con diferen-
les tipos de operaciónes en Ada es:
Ada fue un lenguaje desarrollado a petición de D O D (Departamento de Defen-
sa de Estados Unidos) y como fruto de un concurso para diseñar un lenguaje de package Tipo-Complejo is
programación que sirviera para reducir el coste del desarrollo del software type complejo is private
Ada soporta conceptos orientados a objetos, tales como tipos abstractos de function " + " (izda, dcha:complejo) return complejo;
function " - " (izda, dcha:complejo) return complejo;
datos, sobrecarga de funciones y operadores, polimorfismo paramétrico (geiieri- function " * " (izda dcha:complejo) return complejo;
cidad) e iiicluso especialización de tipos definidos poi el usuario El único con- function 1 " (izda, dcha:complejo) return complejo;
cepto que no implementa Ada es la herencia, aunque es posible emular un tipo function " - ' (dcha:complejo) return complejo;
de herencia elemental Las propiedades orientadas a objetos se implementan de private
la forma siguiente: type complejo is record
re:float : = O 0;
im:float : = O 0;
Encapsulamiento, mediante el uso de paquetes end record;
Ocultación de la información, mediante tipos de datos privados y privados end Tipo-Complejo;
limitados Instancias de estos tipos de datos sólo se pueden manipular por
los subprogramas especificados en el paquete que define los tipos de datos Los tipos privados peiiniteii que se definan nuevos tipos de datos, mientras
privados; un tipo privado de Ada es un tipo abstracto de datos se oculta su implementación real Al igual que otros tipos, los tipos privados
Sobrecarga de operadores, funciones y procedimientos se declaran dentio de una especificación de paquete Un tipo privado se decla-
Genericidad, mediante paquetes y subprogramas genéricos ra en la parte visible de un paquete, pero la definición real de su estructura
Herencia, aunque Ada no soporta la propiedad de la herencia, es posible interna se especifica en la parte privada de la especificación del paquete La
emular la pseudoherencia mediante la definición de tipos de datos deriva- estructura del tipo definido en la parte privada es accesible sólo dentro del
dos, aunque no es posible tener propiedades adicionales de datos o modi- cuerpo del paquete
ficación de las propiedades de datos existentes Las operaciones permitidas en tipos privados son asignación, pruebas para
igualdad y desigualdad, y cualquier opeiación definida explícitamente dentio
de la especificación del paquete
4.3..1. Abstracción de datos en Ada Ada proporciona también una definición de un tipo privado más limitado,
denominado privado liinitado La diferencia principal es que el tipo privado
En Ada los tipos abstractos de datos se implementan mediante paquetes; si bien limitado no hereda automáticaineiite operadores para asignación y pruebas de
los tipos abstractos de datos sirven además para una gran variedad de aplica- igualdad y desigualdad Una instaiicia de un tipo privado limitado sólo se
ciones puede copiar en, o compararlo con, otra instancia si las operaciones necesaiias
Un paquete Ada consta de dos partes: han sido especificadas e implementadas por el paquete que declara el tipo de
dato privado limitado Ada no permite que se sobrecaigue el operador de
Especificación del paquete, que declaia los nombres de los tipos, subpro- asignación, de modo que una iinplementacióii de usuario de esta operacióii
gramas y objetos que son visibles a los usuarios del paquete para un tipo de dato privado limitado se ha de especificar como un procedi-
Cuerpo del paquete, que contiene la implementación de los componentes miento con iiombre
que son ocultos a los clientes del paquete
L.os formatos para definir la especificación y el cuerpo de un paquete son:
4.3.2. Genericidad en Ada
package <nombre_paqwete> is espe~ficaci6ndel paquete
<elementosdeclarativos> Ada sopoita genericidad Las unidades genéricas son subprogiamas o paquetes
[private parametiizados que permiten al usuario desarrollai código reutilizable El foi-
<elementos_declarativoc>] mato de una unidad genérica es:
end <nombresaquete>,
La instanciación de una unidad genérica crea una copia de la unidad como un leizguaje basado en objetos, en base a que soporta todo el concepto de
genérica, Los parámetros genéricos se corresponden con los parámetros reales tipo abstracto de datos La Figura 4 5 muestra las características de 00 de
durante la iustanciación Se especifican tipos reales para todos los tipos formales Ada, así como sus carencias
genéricos Una variable o una constante se especifica para todos los objetos
genéricos brmales Un nombre de función o subprograma se da a cualquier Ada-83 soporta Genericidad
subprograma genérico Así, por ejemplo, para instanciar un subprograma genéri- Sobrecarga (no totalmente)
co I n t e r c a m b i o , que intercambia entre sí el contenido de unas variables: Verificación estática de tioos
Encapsulamiento
procedure Intercambio_INrEGER is new Intercarhio(1NTEGER); Ocultación de la información
Ada-83 no soDorta Herencia
También se puede instanciar un procedimiento llamado intercambio-
Empleado, que intercambia dos registros empleado: Ada-95 sooorta
Polimorfismo
Extensibilidad
Herencia
Polimorfismo
Extensibilidad
1
procedure Intercambio-Empleado is new Intercambio(Emp1eado);
1 i
Figura 4 5
4..3.3. Soporte de herencia en Ada-83
Un método acreditado de diseño basado en Ada se denomina Hierurchical
Ada-8.3 izo soporta herencia, pero sí un tipo de pseudo-herencia, de modo Object Oiieizted Design (HOOD), por lo que puede inducir a confusión entre
que una declaración de tipo de dato puede especifica1 que el tipo de dato descomposición jerárquica de objetos, única posibilidad con Ada, y las verda-
se deriva de un tipo de dato ya existente Así, a partir del tipo complejo, deras jerarquías de clases que soportan abstracciones mediante generalizacio-
definido anteriormente, se puede declarar otro tipo Tipo-complejo, del mo- nes y especializaciones
do siguiente: El proyecto Ada 9x, cuyo borrador definitivo se conoce como Ada-95, ha
definido un nuevo estándar de Ada publicado e11 1995, tanto por ISO como por
with Tipo-Complejo; ANSI, que propoiciona soporte completo orientado a objetos, aunque con
package Ejemplo i s ciertas restricciones todavía sobre C + + , pero también con notables ventajas,
type otro_tipo-complejo ic new Tipo-Complejo Complejo;
como es el caso de la concurrencia
end Ejemplo;
Un tipo derivado Ada hereda todas las opetaciones declaradas para el tipo
base y éstas se pueden redefinir para el nuevo tipo y especificadas operaciones
adicionales. Sin embargo, si el tipo base es privado, el único modo de imple- Eiffe13es un lenguaje orientado a objetos puro desaiiollado por Bertran Meyer
mentar cualquier operación adicional o redefinida es a través del uso de opera- de Interactive Software Environments Inc Su diseño se inspiró en Simula, pero
ciones del tipo base; no existe en Ada el concepto de acceso protegido de C++ también muestra la influencia de Smalltalk y Ada Además incorpora modernas
No es posible especificar nuevas propiedades de datos para un tipo deriva- técnicas de ingeniería de software, que lo hacen idóneo para construcción de
do en Ada, y en consecuencia, todos los tipos derivados de un tipo base tienen software para grandes aplicaciones, permitiendo desarrollar aplicaciones ro-
la misma representación bustas, exactas, transportables y eficientes.
El soporte de herencia de Ada no se puede utilizar para capturar abstraccio- Eiffel es un lenguaje compilado tipificado fuertemente, que soporta la
nes generalizadas, como un tipo de dato base abstracto (clase abstracta en mayoría de los conceptos orientados a objetos descritos en los capítulos ante-
C+f ), de las que se puedan derivar tipos de datos abstractos Ada tampoco riores, tales como abstraccióil de datos mediante clases, genericidad, herencia
soporta ninguna forma de ligadura dinámica ni de poliinorfismo (simple y múltiple), ligadura dinámica y polimorfismo 'También proporciona
una amplia biblioteca de clases y soporta recolección de basura (garbage collec-
tion) El entorno Eiffel está especialmente concebido pala áreas de ingeniería de
4.3..4. Soporte Ada para orientación a objetos software, tales como bases de datos o inteligencia artificial, y tiene un soporte
muy limitado para objetos persistentes y concurrencia, aunque ambas carac-
Las grandes limitaciones de método de herencia de Ada y su ausencia de sopor-
te de polimorfismo no permiten que Ada pueda ser utilizado como un lenguaje
de programación orientado a objetos A lo máximo, Ada se puede considerar ' MEYER,Bertrand: Ohjeit-Oiiriiied Softivaie Cuitsrruiiioii Prentice-Hall. 1988
130 Programación orientada a objetos
Lenguajes de programación orientados a objetos 131
terísticas han sido prometidas por sus diseñadores [Meyer, 19881 y en trabajos 4.4.3.. El lenguaje Eiffel
posteriores Las características de Eiffel se resumen en la Tabla 41,
El único criterio de estructuración en Eiffel es la clase Una clase es una uni-
Tabla 4 . , 1 Caracteristicac de Eiffel dad simple y no se separa en una parte interfaz y en una parte implementación
- Una clase en Eiffel define los elementos básicos de sus objetos instancia: varia-
Ocultacióii de la iiiformación Sí bles de instancia, métodos de instancia y un método de clase Las variables de
Herencia Sí (simple y múltiple) instancias se llaman también atributos, los métodos de instancia se llaman
Verificación/ligadura de tipos Tempiana también rutinas y los atributos y rutinas se llaman colectivamente carac-
Polimorfismo Sí terirticas
Recolección de basura Sí
Persistencia Pseudo-persistencia L.a clase P e r s o n a se representa con un código similar a:
Concurreiicia Prometida
Genericidad Sí class Persona
Biblioteca de objeios Pocas creation
crea
feature
Eiffel soporta conceptos de ingeniería de software tales como precondicio- n0mbre:CTRWG;
nes, poscondiciones e invariantes de clases Estas características y las propias de conyuge: Persona;
feature (PERSONA) casado (n:PERSONA) is
orientación a objetos lo hacen muy útil para construir, soportar y mantener do
proyectos de software grandes conyuge : =n
end:
feature
crea (c:STRING) is do
4.4.1 . La biblioteca de clases Eiffel nombre : = S ;
end
casado-con (p: PERSONA) is
El entorno de programación Eiff'el proporciona una biblioteca de clases prede- require
finidas muy grande, Las clases predefinidas van desde clases de estructura de existe : p/=void;
datos, apoyo y de núcleo (Keiizel), hasta clases gráficas que soportan puntos, solteros: (conyuge=void and y conyuge=vaid)
rectángulos, etc do
La biblioteca de clases de gráficos avanzados sopoita el sistema XWindow, casado (p);
p casado (actual)
lo que permite al programador construir interfaces de usuaiio sofisticados ensuze
boda_valida:conyuge=y and actual=p conyuge
end
end
4.4.2. El entorno de programación Eiffel
La clase E s t u d i a n t e que se deriva de Persona podrá ser:
El compilador Eiffel, un ho,jeador de clases (browser), un editor y las herramien-
tas «Jlat» y «shol t» son las partes fundamentales del entorno de programación
Eiffel. class Estudiante
inherit
El compilador Eiffel tiene una caractetística de recompilación automática Persona
Recompila sólo aquellas clases que estén afectadas por un cambio El hojea- rename imprimir as imprimirpersona
dos de clases permite el examen de clases en el contexto de sus jerarquías redefine imprimir
(superclases y subclases), pudiendo visualizar las relaciones existentes entre end;
clases creation
hacer
La gestión de memoria en Eiffel se realiza p o ~el entorno de p~ograinación feature (NONEI
El espacio de ob.ietos se asigna cuando se crean objetos Eiflel proporciona es:STDFILES;
recolección automática de basura Se coinprueba cuando un objeto se vuelve feature
obsoleto y libera su espacio asociado Eiffel soporta también un mecanismo de hacer x (n=STRING) is
do
manejo de excepcioiies
132 Programación orientada a objetos
Lenguajes de programación orientados a objetos 133
Smalltalk es el primer lenguaje creado con tecnología de objetos puros Fue Polimorfismo Sí
desairollado al piincipio de los setenta por Alan Kay y Adele Golberdg en el Ligadura/Verificación de tipos Tardia
Software Concepts Group de Xerox Palo Alto Research Center En la actuali- Ocultación de la información Sí
dad Smalltalk comienza a imponerse como uno de los primeros lenguajes de Concurrencia Pobre
Herencia simple Sí
programación orientados a objetos. Herencia múltiple No
La primera versión comercial de Smalltalk se lanzó en 1983 con el nom- Recolección de basura Si
bre de Smalltalk-80 En u11 principio sólo estuvo disponible para potentes Genericidad No
estaciones de trabajo gráficas Smalltalk, en el sentido más estricto, es un Persistencia No
entorno de progiamación interactivo y requiere gran cantidad de memoria En
la actualidad las versiones de Smalltalk corien bajo entornos Windows, OS12 y
UNIX Smalltalk no es un lenguaje híbrido, como C + + , sino un lenguaje puro, que
En esencia, el entorno de progiamación Smalltalk tiene tres componentes: no permite un estilo de programación convencional Es el lenguaje de progra-
el lenguaje bá~icoSnzalltalk, una colección de clases, que se utilizan para im- mación más dinámico de los conocidos y dispone de un entorno de programa-
plementar el sistema Smalltalk completo, y el eiztorno leal de progranzacióiz, ción excelente, aunque tiene el inconveniente de teneI una velocidad de ejecu-
que permite a un programador introducir, comprobar y ejecutar aplicaciones ción pequeña Otro inconveniente de Smalltalk es ser un sistema de un solo
Smalltalk, usuario
134 Programación orientada a objetos
Lenguajes de programación orientados a objetos 135
Por el contrario, el desariollo de aplicaciones en Smalltalk tiende a ser muy
rápido Además, dado que el código de Smalltalk se compila incrementalmente, Turbo Pascal (Object Pascal) aersióiz hibrida de Pascal
las nuevas definiciones de clases y objetos se vuelven eficaces tan pronto como Visual Object vei sióii Iiihrida de Clipper
se introducen El alto grado de interactividad del entorno Smalltalk lo hace Delphi uei sióiz hibrida de Iui,bo Parcal
altamente productivo para desarrollos rápidos Object COBOL versión lzihrida de COBOL,
Visual BASIC 4 (no iizcorpoia propiedades de heleizcia ni de polinzorfisnzo)
C++ versión hibrida de C
4..5.2.. La jerarquía de clases Smalltalk El lenguaje C + + se estudia y analiza en profundidad en la segunda y
tercera parte de este libro, y es la base fundamental de todo el desarrollo del
El entorno de programación incluye una amplia biblioteca de varios centenares mismo. Los Apéndices A, B, C, D y E muestran unas guías rápidas de los
de clases Para gestionar esta gran lista de clases, Smalltalk las agrupa en lenguajes C + + , Turbo/Borland Pascal 7, Delphi, Ada-95 y lava
categorías L.as categorías de clases implementan muchas estructuras de datos
básicos: colecciones, conjuntos, bolsas, diccionarios, etc Además, existen clases
predefinidas que iealizan entradas y salidas y ayudan a desarrollar componen- RESUMEN
tes de interfaces de usuarios; algunas clases de esta categoría son: Punto,
Rectángulo, F o r m a , V i s t a El auge de las tecnologías de orientación a objetos se ha debido fundamental-
La Figura 4 6 muestra una parte de la jerarqula de clases de Smalltalk mente a la existencia y posterior popularidad de numerosos lenguajes de pro-
gramación orientados a objetos
En la década de los sesenta, los diseñadores del lenguaje Simula introduje-
ron el concepto de objeto Conceptualmente, un objeto contenía tantos datos
como operaciones que manipulaban esos datos Simula incorporó también la
noción de clases que se utilizaban para describir la estructura y comportamien-
to de un conjunto de objetos Otra característica importante soportada por
Simula fue la herencia de clases
Durante la década de los setenta y principio de los ochenta, los conceptos
de orientación a objetos de Simula se pasaron a Smalltalk, uno de los lenguajes
orientados a objetos más influyentes en el desarrollo de las tecnologías de
objetos Este lenguaje incorporaba muchas de las características orientadas a
objetos de Simula, incluyendo clases y herencia Pero Smalltalk añadió una
característica muy notable: la incorporación de un entorno de programación
completo y un interfaz de usuario interactivo basado en menús,
Smalltalk es muy rico en conceptos orientados a objetos En Smalltalk todo
es un objeto, incluyendo clases y tipos base,
La taxonoinía de lenguajes de Wegner clasificaba éstos en basados en obje-
tos, basados en clases y orientados a objetos
Figura 4 6 Jerarquía Taylor de clases d e Smalltalk,
Los lenguajes basados en objetos más populaies son Ada, Modula-2, Clip-
per 5-2 Los lenguajes basados en clases se agrupan en torno a Cla Los lengua-
jes orientados a objetos se clasifican en dos grandes bloques: puros e hibridos
4.6. OTROS LENGUAJES DE PROGRAMACION Lenguajes orientados a objetos puros son Simula, Smalltalk y Eiff'el, y len-
ORIENTADOS A OBJETOS guajes orientados a objetos híbridos son Object Pascal (Turbo Pascal y Bor-
land Pascal), Objective-C, Object COBOL, Overon, C + + , Delphi, etc
Hoy día se puede aventurar que existen muy pocos lenguajes comercializados El lenguaje 00 híbrido por excelencia es C + + , aunque en los últimos años
que no tengan versiones orientadas a objetos, tal vez sea FORTRAN el único están apareciendo otros lenguajes híbridos que comienzan a competir con cier-
lenguaje que no soporta estas características to éxito, tales como Object COBOL, Visual Object, Visual BASIC 4, Delphi,
La mayoría de los lenguajes estructurados modernos presentan una versión etcétera
que es híbrida Los casos más sobresalientes son: En los lenguajes 00 puros todo es un objeto, incluso las definiciones de
tipos, mientras que en los lenguajes híbridos no todo necesita ser un objeto
136 Programación orientada a objetos
y reutilizar código anteriormente desarrollado en las definiciones de la clase 5.2.1. Jerarquías de generalizaciónlespecialización
base se denomina plogramación por herencia Las clases que heredan propieda-
des de una clase base pueden, a su vez, servir como clases base de otras clases, Las clases con propiedades comunes se organizan en superclases
Esta jerarquía de tipos normalmente toma la estructura de árbol, conocido Una superclase representa una generalizacióiz de las subclases De igual
como jerarquia de clases o jerarquía de tipos modo, una subclase de una clase dada representa una especializació~zde la clase
La jerarquía de clases es un mecanismo muy eficiente, ya que se pueden superior (Fig 5 4) La clase derivada es-un tipo de clase de la clase base o
utilizar definiciones de variables y métodos en más de una subclase sin duplicar super clase,
sus definiciones Por ejemplo, consideremos un sistema que representa varias
clases de vehículos manejados por humanos Este sistema contendrá una clase
genérica de vehículos, con subclases para todos los tipos especializados La
clase v e h í c u l o contendrá los métodos y variables que fueran propios de todos
es-un wq es-un
de pasajeros de pasajeros
Camión
L..
1
' \
L.a flexibilidad y eficiencia de la herencia no es gratuita; se emplea tiempo en Figura 5 4 Relación de generalización,
buscar una jerarquía de clases para encontrar un método o variable, de modo
que un programa orientado a objetos puede correr más lentamente que su Una superclase representa una generalización de las subclases Una subclase
correspondiente convencional Sin embargo, los diseñadores de lenguajes han de la clase dada representa una especializació~zde la clase ascendente (Figu-
desarrollado técnicas para eliminar esta penalización en velocidad en la mayoría ra 5.5),
de los casos, permitiendo a las clases enlazar directamente con sus métodos y En la modelización o modelado orientado a objetos es útil introducir clases
variables heredados de modo que no se requiera realmente ninguna búsqueda, en un cierto nivel que puede no existir en la realidad, pero que son construccio-
nes conceptuales útiles Estas clases se conocen como clases abstractas y su
propiedad fundamental es que n o se pueden crear instancias de ellas Ejemplos
de clases abstractas son VEHICULO DE PASAJEROS y VEHICULO DE MERCAN-
CIAS Por otra parte, de las subclases de estas clases abstractas, que correspon-
den a los objetos del mundo real, se pueden crear instancias directamente por sí
eado ) (.~studiante) mismas Por ejemplo, de BMW se pueden obtener, por ejemplo, dos instancias,
Coche1 y Coche2,
6 Vendedor
&
es-un
i Empleado
A
es-un
Lt Xlnformático
Gerente
t
<5 Oficinista
(a)
(b) (c)
es-un/y
tiene
tiene tiene
/
es-u/
u lnformático
t
/ es-un
\es--
\
Habitación Tejados
La agregación de objetos permite describir modelos del mundo real que se un CHASIS,etc , que son a su vez parte-de COCHE,representa un ejemplo de una
componen de otros modelos, que a su vez se componen de otros modelos La agregación con contenido físico (Fig 5 9)
agregación es un concepto que se utiliza para expresar tipos de relaciones entre
objetos parte-de (par t-of) o tiene-un (has-a) El objeto componente, también a
veces denominado continente o contenedor, es un objeto agregado que se com-
pone de múltiples objetos
La agregación es una forma específica de asociación y no un comporta-
miento independiente, que añade significados o connotaciones semánticas en
ciertos casos Dos objetos forman un agregado, o existe entre ellos una relación
de agregación, si existe entre ellos una relación todo-parte, continente-contenido
(whole-part) Si dos objetos se consideran normalmente como independientes,
sus relaciones se consideran normalmente una asociación Rumbaugh et al3,en
la obra ya citada, sugiere las siguientes pruebas para determinar si una relación
es una agregación:
0 Transmisión
GRADY BOOCHdefine estos dos términos en su obra, ya citada, Object-Oriented Analyiir and
Design 2.' edición clase o clase base y una instancia de la subclase Una superclase se compone de
En Latinoamérica se utiliza como acepción usual de autor>~óuiila palabra carro propiedades que desctiben un objeto (relaciones es-un, un-tipo-de)
146 Programación orientada a objetos
Modelado de objetos. relaciones 147
E
Cada venta se corresponde coi1 una operación de una tarjeta de crédito y a
la inversa Otio ejemplo es la relación entre PAIS y CAPITAL Un país tiene
una capital y sólo una, y una ciudad que es capital de un país sólo pertenece a
Boeing Jumbo Concorde un país
r;
.
. -. - -- - . - - . --
relacign.de agregación s e implementa mediante objetos compuestos.
. . . . I
-7
Una relación una a muchas se puede ver entre las clases PAIS y CIUDAD Un
país tiene muchas ciudades, mientras que una ciudad sólo pertenece a un país
Las clases Venta y Articulo se enlazan también por una relación una-
otro orden, aunque la mayoría serán binarias
nzuchas Una venta puede constar de muchos artículos
148 Programación orientada a objetos Modelado de objetos: relaciones 149
,,
..-\
--' ... , - *
.-
5.,4..1. Otros ejemplos de cardinalidad
.'1 n :'
. Venta ; ,.. Articulas !
,
,
\.-.' , .. -----,
.-..s
Una asociación una-a-una es la que mantienen objetos de la clase Persona y de
la clase Número de la Seguridad Social (NSS) Cada persona tiene un único
número de la Seguridad Social y dado un número de la Seguridad Social se
Por último, la multiplicidad muchas-a-nzuchus implica que una instancia de
corresponde con una única persona Obsérvese la relación bidireccional entre
una clase puede corresponder con muchas instancias de otra clase, y viceversa
objetos de estas dos clases
Las clases Estudiante y Asignatura pueden estar relacionadas con asocia-
ciones de multiplicidad muchas-a-muchas Un estudiante puede estar matricula-
do en muchas asignaturas, y en una asignatura determinada pueden estar ma-
triculados muchos alumnos
tiene
Nombre identifica ~ ú m ~ ~ ~
Dirección
1 n , 1-m una-a-muchas
M
+ una-a-muchas Nombre Nombre
Dirección Dirección
m n , m-n muchas-a-muchas
M 1 Ventas 1
- muchas-a-muchas
es-un ,
-
M =
\aes-un - El caso más siinple de herencia es la herencia simple, en la que una clase sólo se
deriva de otra clase Así, por ejemplo, en un caso típico de zoología,
un gato o un perro es un animal? y en un caso típico de botánica, un clavel es
una flor Un gato posee determinadas características de la categoría o clase
animal; por otra patte, un gato difiere en determinadas características de la
categoría animal En nuestros ejemplos, <<Animal»o «Flor» son las superclases
Polígono Elipse o clases bases, y «Gato» o «Rosa» son las subclases, clases derivadas o clases
extendidas o ampliadas
es-un, -f es-un Otro ejemplo simple puede se1 la clase P r o f e s o r como un tipo de clase
derivado de Persona
La clase P r o f e s o r es un tipo de (es-un) Persona, al que añade sus propias
caracteristicas L.as clases se organizan en una estructura lógica denominada
jeraiquia de clases La Figura 5 18 muestra unajerarquía de clases que contiene
en su nivel más alto la clase P e r s o n a y dos subclases o clases derivadas,
E s t u d i a n t e y P r o f e s o r Las subclases heredan características de sus super-
clases Las características pueden ser variables de instancias (campos miembro)
y/o métodos (funciones miembro)
Figura 5,,16. Relaciones entre clases (un tipo de, o e s un/una.l
152 Programación orientada a objetos Modelado de objetos: relaciones 153
. . - .. ..
Subclase o
clase derivada
El mecanismo que permite a una clase heredar de más de una clase se llama Otro ejemplo de herencia múltiple se puede ver en la Figura 5 22, en donde
hel.encia múltiple; se dice entonces que una clase es una extensión de dos o más Comida y Planta son dos clases que actúan como superclases de Patata,que
clases Con herencia múltiple se pueden combinar diferentes clases existentes es un alimento y a la vez una planta
para producir combinaciones de clases que utilizan cada una de sus múltiples La herencia múltiple es una herramienta muy potente, pero es fácil abusar
superclases La representación giáfica en este caso se suele hacer con un grafo de ella y caer en graves errores; por el contrario, utilizada con precaución, es
dirigido no simétrico, ya que una clase puede tener más de una predecesora una ayuda valiosísima en el desarrollo orientado a objetos De cualquier forma,
inmediata la herencia múltiple ha sido y sigue siendo tema de debate entre expertos de
La Figura 5 21 proporciona un ejemplo de la jerarquía de clase Persona programación y de lenguajes orientados a objetos,
utilizando herencia múltiple Como en ella se ilustra, el Gerenteventas hereda
de Gerente y Vendedor; de modo similar, EstudianteTrabajador hereda
de Estudiante; DirectorDeProyectos hereda de ~ e r e n t ey de Ingenie- 5.,5,.2,,1.Ventajas de la herencia multiple
ro;por Último, SecretarioTécnico hereda de Secretario y de Ingeniero,
La herencia múltiple es útil en muchas situaciones Puede ayudar, fundamental-
mente, a modelar objetos en su dominio del problema Una aplicación muy
frecuente de la herencia múltiple se suele dar cuando se crea una nueva clase a
partir del comportamiento de dos o más clases, incluso aun cuando fueran
Estudiante desarrolladas independientemente unas de otras Un uso muy común es añadir
persistencia6 a los objetos,
%e- \
general
/
trabajador
Otra ventaja apreciable es su alto grado de flexibilidad, simplicidad y elegan-
cia en la definición de nuevas clases que se crean a partir de clases existentes
La herencia múltiple favorece claramente la reutilización, por la razón im-
portante que permite más libertad en la definición de nuevas clases a partir de
las existentes Esta construccióii permite crear jerarquías de clases completas
más fácilmente, sin restringir las relaciones en las jerarquías de clases o casos
singulares. En este sentido, la herencia múltiple favorece un enfoque más flexi-
ble para el diseño de aplicaciones
Adeinás, la herencia múltiple facilita el cambio de la implementación de una
clase, mientras deja inalterado su interfaz. De hecho, puede cambiar simple-
[p]
Figura 5 2 1 Jerarquía de clases P e r s o n a con herencia rnultiple, mente la parte de una clase que corresponda a una de sus clases base, heredan-
do de una clase base diferente que realiza las mismas hncionalidades en dife-
Comida rentes formas, obteniendo, en consecuencia, una implementación diferente de la
Precio misma abstracción
Calorias Sin embargo, hemos de reconocer que el uso generalizado de plantillas
Fertilizar templat te^) ha reducido significativamente las ventajas de la herencia múltiple
Comprar
Comer
Guisar 5,.5.,2..2 Inconvenientes de la herencia multiple
li
Existen problemas asociados al uso de la herencia múltiple Con frecuencia
se produce confusión y comportamiento impredecible, debido al uso de la
Patata "os objetos persistentes - e n contraposición a los objetos transitorios- son aquellos que
permanecen activos entre ejecuciones El tiempo de vida de un objeto es la duraciún de la ejecución
del programa; una vez que el programa termina su ejecución, todos los objetos que estaban activos
Pelar se vuelven inaccesibles Los objetos persistentes son aquellos que al almacenarse en disco permdne-
Cortar cen intactos entre ejecuciones La perrirrencia o mejor el soporte de objetos persistentes es funda-
mental en los sistemas de gestión o administración de bases de datos orientadas a objetos Para
ampliar conceptos sobre objetos persistentes se puede estudiar a Booch, Rbosafian y Abnous,
Figura 5 22 Jerarquía de clases P a t a t a con herencia multiple Graham y Mary Loomies, entre otros
156 Programación orientada a objetos Modelado de objetos: relaciones 157
herencia a partir de clases con métodos que tienen los mismos nombres pero La clase EstudianteTrabajador hereda de Empleado y Estudiante
significados diferentes; es decir, se produce ambigüedad Todo lenguaje que Una variable instancia de Estudiante puede contener las variables {Nom-
soporte herencia múltiple ha de tener reglas propias para resolver esta ambi- bre, Edad, Dirección, Carrera, Curso, Grupo, Turno) yunavariable
güedad Otro inconveniente de la herencia múltiple es el aumento de tiempo instancia de Empleado contendrá las variables {Nombre, Edad, Direc-
auxiliar que se añade a los programas. ción, Salario, Categoría, Departamento)
La herencia múltiple está soportada por C + + , CLOS y Objective-C Sin Booch considera que existen básicamente tres métodos para resolver las
embargo, Object-Pascal, Turbo Pascal 5.51617 y Smalltalk no soportan esta colisiones o choque de nombres:
propiedad, aunque algunas versiones de Smalltalk también permiten esta ca-
1 L.a semántica del lenguaje puede considerar una colisión de nombres
racterística
como ilegal y rechaza la compilación de la clase. Este es el método
utilizado por Smalltalk y Eiffel Sin embargo, en Eiffel es posible renom-
brar elementos de modo que no exista ambigüedad
5 5 . , 2 . , 3 Diseño de clases con herencia multiple 2 La semántica del lenguaje puede considerar el mismo nombre introdu-
cido por clases diferentes con referencia al mismo elemento conflictivo
El diseño de una estructura de clases adecuada que implica herencia, espe- Es el método de CLOS
cialmente herencia múltiple, es una tarea difícil Suele ser un proceso interac- 3 La semántica del lenguaje puede permitir el choque o conflicto, pero
tivo e incremental Dos problemas se suelen presentar cuando se manipula requiere que todas las referencias de nombres califiquen la fuente de su
herencia múltiple: jcómo resolver las colisiones de nombre de diferentes su- declaración Es el método utilizado por C + +
perclases? Y ¿cómo manipular herencia repetida o herencia de ascendientes
comunes?
Las colisiones de nombres se producen cuando dos o más superclases dif'e- 5.6. HERENCIA REPETIDA
rentes tienen el mismo nombre para algún elemento de sus interfaces, tales
como variables instancia y métodos Y la herencia repetida se produce cuando El otro problema grave que se produce en el uso de la herencia múltiple es la
una clase es ascendiente de otra clase por más de un camino Supongamos que herencia repetida Este tipo de herencia se produce cuando una clase hereda de
las clases empleado y estudiante tienen las estructuras de variables instan- dos o más superclases que a su vez heredan de la misma superclase Esta
cias que se muestran en la Figura 5 23 situación se presenta, por ejemplo, en el caso de la Figura 5 24, en la que
EstudianteTrabajador es una subclase de Empleado y Estudiante, que
Estudiante
a su vez son subclases de Persona Suponiendo que Per cona tiene los atribu-
tos Nombre, Edad, Dirección que se reciben por herencia de Estudiante-
Trabalador En este caso, los atributos anteriores se repetirán en la última
Dirección subclase
Salario
Categoría
Atributos: Nombr e
Edad
Estudiante
trabajador
Colisión
(se heredan Nombre,Edad y Dirección
de las dos dases) Figura 5.24, Herencia repetida
la Figura 5 25 se muestran grafos de herencia repetida, con lo que se crea una Por el contrario, si consideramos una clase que describa a una pareja o
copia o dos copias (instancias), según el caso matrimonio que se derive de dos clases, Hombre y Mujer, respectivamente, la
clase P e r s o n a debe estar presente dos veces, ya que el matrimonio lo consti-
tuyen dos personas y no una La Figura 5 27 muestra otro ejemplo de herencia
repetida,
Estas dos clases diferentes de herencia repetida corresponden a dos signifi- Figura 5.,26. Grafo de herencia repetida (dos copias de la superclase)
cados muy diferentes de esta construcción, como se ilust~aen los ejemplos
siguientes El grafo de la Figura 5 28 muestra cómo la clase D tiene dos copias, instan-
El primer ejemplo es una clase que describe una P e r s o n a (con atributos de cias o subobjetos de la clase A: una copia A de W y otra copia -llamada virtual
datos de la persona y otra información) Se crean dos nuevas clases a partir de
en C++- compartida por B y C
la clase P e r s o n a por herencia: la clase P r o f e s o r de universidad (se añaden
datos adicionales relativos a la universidad donde imparte docencia, asignatu-
ras y cursos a su cargo); la otra clase que se crea por herencia es Autor de
libros (con algunos nuevos atributos, tales como títulos de libros publicados,
años de publicación y editoriales) En esta situación se pueden considerar profe-
sores que son autores de libros, y cuya estructura jerárquica se muestra en la
Figura 5 2 6 En este caso es más correcto utilizar el caso de la herencia múltiple
de la Figura 525b, ya que un Pro£ e s o r A u t o r es sólo una persona (iy no dos!),
y en consecuencia sus datos privados se han de duplicar
3 Se puede tratar referencias a la misma clase como si fueran la misma Esta clase tiene el inconveniente de no detectar desbordamientos posi-
clase Este es el método empleado por C + + cuando se introducen super- tivos o negativos de la pila En cousecuencia, se decide diseñar una nueva
clases repetidas como clases base virtual Una clase base virtual existe clase PilaDer derivada de Pila, con las mismas funciones miembro
cuando una subclase nombra a otra clase como su superclase y marca la meter y s a c a r , pero que adviertan al usuaiio con mensajes de «Pila
superclase como virtual, para indicar que es una clase compartida vacía» o <<Pilallena» cuando se intente sacar un elemento de una pila
vacía o meter un elemento en una pila llena Escribir programa que
gestione la pila con ambas clases
RESUMEN 5.2. Se dispone de la clase obj-geom:
Fórmulas
Persona Pacieizte Empleado
nombre nombre nombre Círculo Longitud 2 n i
dirección dirección dirección Area n j2
ciudad ciudad ciudad
Leer ( ) código-diagnóstico códigoempleado Cilindro Area 2 n 1 h+2 n 1'
5.6. Diseñar una clase nombre que contenga ties miembros datos (nombre,
primer apellido y segundo apellido), un constructor y dos funciones
miembro Leernombre i que obtiene valores para los miembros dato
de la clase mostrar ( ) que ofrece la visualización del nombre comple-
mento Diseñar otra clase derivada dirección que toine la información
de nombre y añada calle, ciudad, provincia y código postal Esta clase
debe tener acceso a las funciones públicas de la clase base y tres funciones
miembro nueva-dirección, nuevo-nombre i ) y mostrar ( ) . Escri-
bir un programa que cree un objeto de dirección,lea datos y visualice
la información