Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion Orientada A Objetos - Luis Joyanes Aguilar
Programacion Orientada A Objetos - Luis Joyanes Aguilar
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
Antonio Vaquero Snchez
Catedrtico de Lenguajes y Sistemas Informticos
Escuela Superior de Informtica
Universidad Complutense de Madrid
ESPANA
Gerardo Quiroz Vieyra
Ingeniero en Coinunicaciones y Electrnica
por la ESIME del Instituto Politcnico Nacional
Profesor de la Universidad Autnoma Metropolitana
Unidad Xochimilco
MEXICO
Willy Vega Glvez
Universidad Nacional de Ingeniera
PERU
PROGRAMACION
ORIENTADA A OBJETOS
Luis Joyanes Aguilar
Director del Departamento de
Lenguajes y Sistemas Informticos e Ingeniera de Software
Facultad de Informtica
Universidad Pontificia de Salamanca Cainpus Madiid
McGraw-Hill
Prlogo
Parte 1
EL MUNDO DE LA ORIENTACION A OBJETOS:
CONCEPTOS, RELACIONES, MODELADO Y LENGUAJES
DE PROGRAMACION
Captulo 1. El desarrollo de software
11
12
13
PROGRAMACION ORIENIADA A 0B.JEIOS
No est permitida la reproduccin total o parcial de este libro, ni su tratamiento
informtica, ni la transmisin de ninguna forma o por cualquier medio, ya sea
electrnico, mecnico, por fotocopia, por registro u otros metodos, sin el permiso
previo y por escrito de los titulares del Copyright
14
15
a
en espaol, por
DERECHOS RESERVADOS 01996, respecto a la p r i ~ edicin
McGRAW-HILL/INTERAMERICANADE ESPANA, S A
Edificio Valrealty, 1 " planta
Basauri, 17
28023 Aravaca (Madrid)
16
17
ISBN: 84-481-0590-'7
Depsito legal: M 30 121-1996
18
19
xvii
vi
Captulo 2
Modularidad
2 1 1 L.a estiuctura de un mdulo
2.1 2 Reglas de modularizacin
2 2 Diseno de mdulos
2 2 1 Acoplamieiito de mdulos
2.2 2 Cohesin de mdulos
2 3 Tipos de daios
2 4 Abstiaccin en lenguajes de progiaiiidcin
2 4 1 Abstracciones de control
2.4 2 Abstracciii de datos
2 5 Tipos abstiactos de datos
2 5 1 Veritajas de los tipos abstI%dctosde daios
2.5 2 Iinplementacin de los TAD . .
. ,
2 6 Tipos abstractos de datos en 'Turbo Pascal
2.6 1 Aplicaciii del tipo abstiacto de dato Pila
2 7 Tipos abstiactos de datos en Modula-2
2 7 1 Mdulos
2 '7 2 Mdulos locales
2
Tinos onacos
- 7 1
2 7 4 Tipos transpdientes
.,
2 7 5 Una versin del tipo abstracto de dato Pila con datos opacos
7 7. 6. Otra
aolicaciii del TAD Pila
-.
.
2 8 Tipos abstractos de datos en Ada
2 8 1 Tipos piiuados
2.8 2 Tipos privados limitados
2 9 Tipos abstractos de datos en C .
2.9 1 Un ejemplo de un tipo abstracto de datos en C
..
2 10 Tipos abstractos de datos en C + +
2 10 1 Definicin de una clase Pila en C + +
Resumen
Ejercicios
~
~~
Captulo 3
12
33
34
25
27
29
21
31
Contenido
Contenido
Piograiiiacin estructuiada
3 1 1 Desventajas de la piogramacin estructuiada
&QuCes la piogramacin otientada a objetos"
3 2 1 El objeto
3 2 2 Ejemplos de objetos
3 2 3 Mtodos y mensajes
Clases
3 3 1 Irnplementacin de clases en lenguajes
3 3 2 Sintaxis
Un mundo de objetos
31
31
32
35
35
35
36
38
38
19
.-
3 4 1 Definicin de objetos
3 4 2 Identificacin de objetos
3 4 3 Duracin de los objetos .
..
3 4 4 Objetos frente a clases Representacin gifica (Notacin de Ege)
3 4 5 Datos internos
3.4 6 Ocultacin de datos
3 5 Herencia
3 5 1 Sintaxis
3.5 2 Tipos de herencia
.
3 6 Comunicaciones eiitie objetos: los mensajes
3 6 1 Activacin de objetos
3 6 2 Mensajes
.
3 6 3 Paso de mensajes
3 7 Estiuctura interna de un objeto
3 7 1 Atributos
3.7.2 Mtodos
3 8 Clases . .
3.8 1 Una comparacin con tablas de datos
3 9 Herencia y tipos
3 9 1 Herencia simple (he?eiicia ,jerdrquica)
3 9 2 Herencia mltiple (Iierei~iaeii malla)
3 9 3 Clases abstractas
3 10 Anulacin/Sustitucin
3 11 Sobrecarga
3 12 Ligadura dinmica
3 12 1 Funciones o mtodos viituales
3.12 2 Polimorfismo
3 13 Objetos compuestos
3 13 1 Un ejemplo de objetos compuestos
3 13 2 Niveles de prolundidad
3 14 Reutilizacin con orientacin a objetos
3 14 1 Objetos y ieutilizaciii
3 15 Polimorfisino
Resumen
43
vii
Contenido
67
Eiffel .
, . .
..
4 4 1 La biblioteca de clases Eiffel . . .
4 4 2 El entorno de programacin Eiffel
4 4 3. El lenguaje Eif'fel
4 5 Smalltalk
. ., ,
4 5 1 El lenguaje Smalltalk . , . .
4.52 La jerarqua de clases Smallialk
..
4 6 Otros lenguajes de programacin orientados a objetos
Resumen
Ejercicios
44
51
52
Parte 11
PROGRAMACION ORIENTADA A OBJEIOS CON C + +
Captulo 8 . Polimorfismo
61
62
63
64
65
66
Clases y objetos en C + +
Clases y objetos
Objetos
.
6.2 1 Identificacin de objetos
Clases
Creacin de clases
Diagramas de clases y objetos
Construccin de clases en C + +
6 6 1 Declaracin de clases
6 6 2 Definicin de una clase
6 6 3 Constructores y destructores
6 6 4 Usar las clases
6 6 5 Especificacin/implementacin de clases
6 6 6 Compilaciii separada de clases
6 6 7 Reutilizacin de clases . .
6 6 8 Estilos de declaracin de clases
L.igadura
..
8.1 1 Ligadura en C++
8 2 Funciones virtuales . .
.
.
8 2.1 Ligadura dinmica mediante funciones virtuales
8 3 Polimorfismo
.
. .
. .
8 3 1 El poliinorfismo sin ligadura dinmica
8 3 2 El polimorfismo con ligadura dinmica
8 4 Uso del polimorfismo .
..
8 4 1 Uso del polimorfiosmo en C + + .
8 5 Ligadura dinmica freiite a ligadura esttica
8 6 Ventajas del polimorfismo
Resumen
Ejercicios
81
Captulo 6
91
92
Genericidad
Conceptos fundamentales de plantillas en C++
Contenido
Contenido
11 5
Plantillas de funciones
.
9 3 1 Fundaineiitos tericos
9 3 2 Definicin de plantilla de funcin
9 3 3, Un ejemplo de plantilla de funciones
9 3 4 Un ejemplo de funcin plantilla
9 3 5 Plantillas de funcin ordeiiar y buscai
9 3 6 Una aplicacin prctica
9 3 7 Probleinas en las funcioiies plantilla
9 4 Plantillas de clases
. . .
9 4 1 Definicin de una plaiitilla de clase
9 4 2 Instanciacin de una plantilla de clases
9 4 3 Utilizacin de uiia plantilla de clase
9 4 4 Argumentos de plantillas . .
9.4 5 Aplicaciones de plantillas de clases
9 5 Una plantilla para manejo de pilas de datos
9 5 1 Definicin de las funciones mieinbro
9 5 2 Utilizacin de una clase plantilla
9 5 3 Instanciacin de una clase plantilla con clases
9 5 4 Uso de las plantillas de funcioiies con clases
9 6 Plantillas frente a polimorfismo
Resumen
Ejercicios
Parte 111
DISENO ORIENTADO A OBJETOS
Captulo 1 2 Diseo orientado a objetos (Notaciones Booch, Rumbaugli
, , , ,
335
y CoadlYonrdon) . , , , . , . . , , . . , . . . . . . , , . , . . . . . .
10 1
10 2
Concepto de excepciii
Manejo de excepciones
10 2 1 Medios tpicos pala el manejo de excepciones
10 3 El mecanismo de excepciones en C + +
10 4 L.anzamiento de excepciones
1 0 4 1 Foiinatos de thiow
10 5 Manejadores de excepciones
10 5 1 Bloques 1rj)
10 5 2 Captura de excepciones
10 5 3 Relanzamiento de excepciones
10 6 Especificacin de excepciones
10 7 Aplicaciones prcticas de manejo de excepciones
, .
10 7 1 Calculai las races de uiia ecuacin de segundo grado
10 7 2 Control de excepciones en una estructura tipo pila
Resuineu
Ejercicios
11 2
11 3
11 4
Mecanismos de reutilizacin
11 1 1 Herramientas tradicionales de reutilizacin
Reutilizacin por herencia .
.
11 2 1 Ventajas de la reutilizacin a travs de la herencia
Las recompilaciones en C + +
Reutilizacin mediante plantillas o tipos genricos
11 4 1 Polimorfismo frente a geuericidad
12 1
11 1
321
323
324
325
326
326
327
328
328
329
329
331
Bibliotecas de clases
11 5 1 Coiitenedores
11 5 2 La riecesidad de los coiitenedoies
11 5 3 Clases contenedoias de Boiland C + + 3 1 a 5 0
11 5 4 La biblioteca estndar de plantillas (SIL)
11 6 Clases contenedoras en Boiland C + + 4 515 O
11 6 1 Nombies de las clases contenedoias
11 6 2 Clases vector
11 6 3 Clases listas doblemente enlazadas
11 6 4 Clases array
11 6 5 Creacin y uso de contenedores
Resumen
93
xii
Contenido
Contenido
13 19 Organizacin de un programa C + +
13 19 1 Evitar definiciones mltiples
, . ,
13 19 2 Evitar incluir archivos de cabecera ms de una vez
Resumen
Ejercicios
, , , , , ,
Parte IV
EL LENGUAJE C + + : SINTAXIS, CONSTRUCCION
Y PUESTA A PUNTO DE PROGRAMAS
Captulo 13. De C a C + +
13 1
13 2
13 3
13 4
13 5
13 6
13 7
13 8
13 9
13 10
13 11
13 12
13 13
13 14
13 15
13 16
13 17
13 18
, ,
Limitaciones de C
. .
.,
Mejora de caractersticas de C en C i +
El primer programa C + +
. ..
13 3 1 Comparacin de programas C y C + +
Nuevas palabras reservadas de C + +
Comentarios
Declaraciones de variables , .
.
.
13 6 1 Declaracin de variables en un bucle foi
,
,
,
13 6 2 Declaraciones externas
13 6 3 El mbito de una variable
El especificador de tipos conrt
. ,,
13 7 1 Diferencias entre coiist de C + + y conrt de C
13 '7 2 Las variables voltiles
Especificador de tipo uoid
11 8 1 Punteros void
L.os tipos char
. .
13 9 1 Inicializacin de caracteres
Cadenas
,
,
. ,
Conversin obligatoria de tipos (Castiilg)
,
,,
El especificador de tipo volatile
Estructuras, uniones y enumeraciones
13 13 1 Estructuras y uniones
13 13 2 Uniones annimas
13 13 3 Enumeraciones
, .
13 13.4 Enumeraciones annimas
Funciones en C + +
13 14 1 i?~aii%()
,
,
13 14 2 Prototipos de funciones .
13 143 Una declaracin tpica de funciones y prototipos
13 144 Funciones en lnea
,
,
13 14 5 Ventajas sobre las macros
13 14 6 Argumentos por omisin
. .
.
13 147 Funciones con un nmero variable de parmetros (el parmetro ..) .
.. .
. .. , , , ,
Llamada a funciones C Programas mixtos C/C++
El tipo ieferencia
,
,
Sobrecarga
13 17 1 Sobiecarga de funciones
13 172 Aplicacin de sobrecarga de funciones
13 1'7 3 Sobrecarga de operadores
Asignacin diiimica de memoria
13 18 1 El operador new
13 18 2 El puntero nulo/cero
13 18 3 El operador delete
13 184 Ventajas de nen' y delete
,
,
, ,
15 7
15 8
Depuracin de programas
15 1 1 Errores durante la depuracin
, ,
,
Errores en arrays
Errores en cadenas
. . . . , ., ,
15 3 1 Clculo incorrecto de la longitud de una cadena
,
, ,
,
Errores en comentarios , , ,
Errores en corchetes y llaves
Errores en funciones
, , .,
15 6 1 Pasar un argumento por valor en lugar de por variable
15 6 2 Fallos en el valor de retorno de la funcin , , , ,
15 6 3 No incluir el archivo de cabecera de una funcin en tiempo de
ejecucin
, ,
Errores en macros
. ,
.
,. , ,
,
15 7 1 Omisin de parntesis en los argumentos de macros
15 '7 2 Especificacin no vlida de macros tipo funcin
Errores con operadores .
,
, ,
15 8 1 Mal uso de operadores de incremento (++) y decremento (--)
15 8 2 Confusin de operadores de asignacin
, ,
,
,
15 8 3 Fallos en la precedencia de operadores
xiii
xiv
15 9
15 10
15 11
15 12
15 13
Contenido
Contenido
Errores en punteros
15 9 1 Olvido del operador de direccin (&)
15 9 2 Fallos al inicializar un puntero
15 9 3 Declaracin de un puntero con el tipo incorrecto
Errores en sentencias de seleccin (switcli, if-else)
Errores en separadores
Errores bsicos frecuentes
Eriores en clases
Resumen
Ejercicios
Apndice A
A1
A 11 Punteros (Apuntadores)
A 11 1 Declaracin de punteros
A 11 2 Punteros a arrays
A 11 3 Punteros a estiucturas
A 11 4 Punteros a objetos constantes
A 11 5 Punteros a void
A 11 6 Punteros y cadenas
A 11 7 Aritmtica de punteros
A 12 Los operadores new y delete
A 13 Arrays
A 13 1 Definicin de arrays
A 14 Enumeraciones, estructuras y uniones
A 15 Cadenas
A 16 Funciones
A 16 1 Declaracin de funciones
A 16 2 Definicin de funciones
A 16 3 Argumentos por omisin
A 16 4 Funciones en lnea (inl~iie)
A 16 5 Sobrecarga de funciones
A 16 6 El modificador const
A 16 7 Paso de parmetros a funciones
A 16 8 Paso de arrays
Apndice B
B1
B2
B3
B4
,
XV
Objetos
Herencia
Polimorfismo y mtodos virtuales
Objetos dinmicos
542
544
545
547
Apndice C
C1
C2
C3
C4
C5
C6
C7
C8
C9
C 10
C 11
,
, ,
548
548
549
550
550
551
551
551
552
553
554
5 5'7
559
,
,
559
562
566
567
569
xvi
Contenido
, ,
, ,
, , ,
, ,
, ,
589
589
597
603
610
614
618
621
623
625
Apndice G
G1
G2
G3
G4
G5
PROLOGO
Apndice H. Glosario
642
Bibliografa
651
Indice
653
LA ORlENTAClON A OBJETOS
Las teciiologas orientadas a objetos se han convertido en la dcada de los
noventa en uno de los motores clave de la industiia del software Sin embargo,
las tecnologas de objetos no es, como algunos innovadores pregonan, una
novsima tecnologa, sino que, muy al contrario, es una vieja y madura tecnologa que se remonta a los aos sesenta. De hecho, Simula, uno de los lenguajes orientados a objetos ms antiguos, fue desarrollado en 1967
El desarrollo de piogramas orientados a objetos es un enfoque diferente
del mundo informtico Implica la creacin de n~odelosdel mundo real y la
construccin de programas informticos basados en esos modelos El proceso
completo de programacin comienza con la construccin de un modelo del
suceso (evento) real El resultado final del proceso es un programa de computadora que contiene caractersticas que representan algunos de los objetos del
mundo real que son parte del suceso
El principio bsico de la programacin orientada a objetos es que un
sistema de software se ve como una secuencia de transfoimaciones en un
conjunto de objetos. El trmino objeto tiene el mismo significado que un
nombre o una frase nominal Es una persona, un lugar o una cosa Ejemplos
de objetos del inundo real son: persona, tabla, computadoia, avin, vuelo de
avin, diccionario, ciudad o la capa de ozono La mayora de los bjetos del
mundo real tienen atributos (caracterlsticas que los describen) Por ejemplo,
los atributos de una persona incluyen el nombie, la edad, el sexo, la fecha de
nacimiento, la direccin, etc Los objetos tienen atributos, y ellos, a su vez,
comportamiento El comportamiento (behavkr) es el conjunto de cosas que
puede hacer un objeto; por ejemplo, una persona puede estudiai, caminar,
trabajar, etc En sntesis, se puede decir que los objetos conocen cosas y haceiz
cosas Las cosas que un objeto conoce son sus atributos; las cosas que puede
hacer un objeto son su comportamiento
Los principios en que se apoyan las tecnologas orientadas a objetos son:
Objetos como instancia de una clase
Mtodos
Mensajes
xviii
Encapsulamiento
Modularidad
Abstraccin
Polimorfismo
Prlogo
Prlogo
Herencia (generalizacin/especializacin)
Agregacin
Asociacin
uso
TIPOSABSTRACTOSDE DATOSYCLASES
Una clase es una caracterizacin abstracta de un conjunto de objetos; todos
los objetos similares pertenecen a una clase determinada Por ejemplo, un
conjunto de objetos tales como cuadrados, tringulos, crculos, lneas, etc,
pertenecen a una clasefigura De modo ms formal, una clase define variables
(datos) y mtodos (operaciones) comunes a un conjunto de objetos En realidad,
una clase es un prototipo o generador de un conjunto de objetos
Una clase bien diseada especifica un tipo abstracto de dato (TAD) Un
tipo de dato es abstracto si las operaciones de alto nivel adecuadas a los tipos
de datos estn aisladas de los detalles de la implementacin asociados con el
tipo de datos As, por ejemplo, si diseamos una clase cnculo que convierte
a un crculo en un tipo abstracto de dato, la clase nos proporciona mtodos
(funciones) tales como dibujar, mover, ampliar, contraer, borrar, etc Se pueden
utilizar estos mtodos para manipular objetos cilculo de todas las formas
esperadas Los mtodos son todo lo que se necesita conocer sobre la clase
circulo Una estructura de datos fundamental de un crculo puede ser un array,
un registro, una cadena de caracteres, etc. Los detalles de la representacin
interna de un crculo se pueden ignorar mientras se crean, amplan o mueven
crculos Un crculo como tipo abstracto de dato se centra exclusivamente en
operaciones (mtodos) apropiadas a los crculos; un clculo como tipo abstracto de dato ignora totalmente la representacin interna de un crculo
La clase es el bloque de constiuccin fundamental de un lenguaje de
programacin orientada a objetos Una clase es un tipo abstracto de datos
junto con un conjunto de transformaciones permitidas de dicho tipo abstracto
de datos; puede definir tambin su interfaz a otras clases o funciones, descubriendo para ello que parte de su descripcin interna de datos o conjunto de
transformaciones permitidas pueden hacerse pblicos La regla por defecto es
que nada de una clase es pblica, a menos que se declare explcitamente por
el desarrollador de software que defini la clase
Aunque no es completamente una terminologa estndar en POO, el trmino objeto se utiliza normalmente para repiesentar una instancia de una
xix
xx
Prlogo
Prologo
xxi
EL LENGUAJE C++
C + i todava no es un lenguaje estndar, aunque ya se encuentra en la fase
final de estandarizacin C + + es sin duda el lenguaje del futuro, y marca las
pautas de desarrollo para nuevos lenguajes, como es el caso de Java, el
lenguaje de programacin orientado a objetos para desarrollo en Internet, o
Ada-95, el lenguaje de desarrollo para sistemas en tiempo leal tambin orientado a objetos
L.as caracteristicas comunes ms importantes a las nuevas veisiones de
C + + son:
Las funciones de entradalsalida printf y scanf se utilizan raramente en C + + , y en su lugar se emplean cin y cout, que realizan
un trabajo mejor y ms eficiente
2
3
4
HISTORIA
Al principio de los ochenta, Bjarne Stroustrup dise una extensin del lenguaje C al que Ilain C con clases, debido a que su caracterstica fundamental
eia aadirle clases a C El concepto de clase proceda de Simula 67 y serva
para captuiar el comportamieilto del inundo real a la vez que oculta los
detalles de su implementacin
En 1983-84, C con clases fue rediseado, extendido e implementado en un
compilador El lenguaje se denomin C + + y fue descrito poi Stroustrup en
Data Abst~actioiziiz C en el Iechnical Jouinal (vol 63, nm. 8, octubre 1984),
de AT&T Be11 Laboratories L.a primera versin comercial de C + + estuvo
disponible en 1985 y se document en el libio de Bjarne Stroustrup Ilze C + +
Prograi?ziizinqLanguage, editado por Addison-Wesley en 1986.
El nombre de C++ fue elegido coino variante del lenguaje de programaci6n C Dado aue eia una extensin de C, se decidi elegir C + + debido a
que el opeiador
significa aadir uno a la variable y poi consiguiente
el lenguaje C + + se supondra que era una ve~sininmediatamente superior o
siguiente a C
En realidad, Stroustrup cre C + + con dos objetivos principales: (1) hacer
compatible C + + con el C ordinario, y (2) ampliar C con construcciones de
P O 0 basadas en la construccin clase de Simula 67. El lenguaje en su forma
actual ha sido descrito en 1990 por Stroustrup y Ellis en el Anizotated C + +
Refereizce Maiiual (el ARM)', que sirve como documento base para la estan~-~
++
MARGARET
E ~ r r sy BJARNE
SrxousrRuP: Tiie Aniiotatud C + + Refefei.eiiie Ma~lual Reading,
Mass, Addisoii-Wesiey, 1990 Existe versin en espaol con el ttulo C + + Maiiual de refeieizcia
coi? ai~utacioizei editado por Addison-\l'esley/Daz de Santos en 1994
xxiv
Prlogo
Prlogo
XXV
xxvi
Prologo
AGRADECIMIENTOS
Muchas son las peisonas que me han prestado ayuda de una u otra forma en
la elaboracin de esta obia y a las que debo mi agradecimiento ms sincero
Prlogo
xxvii
E n particular, deseo expresa1 ini reconocimiento a mis colegas del Departainento de Lenguajes y Sistemas Informticos de la Facultad y Escuela Universitaria de Informtica de la Universidad Pontificia de Salamanca, en el
cuiiipus de Madrid, que han impartido e imparten conmigo Prvgramaciit
Orieittaa a Objetos dentio de la asigiiatuia Metodologa de la Programacin,
as coino Anlisis y Diseo Orientados a Objetos, cuyas sugerencias, consejos y
crticas han permitido los apuntes originales de la asignatura en este libro que
hoy ve la luz Estos profesores son: Ignacio Zahonero, Antonio Reus, Paloina
Centeiiera, Rosa Hernndez, Rafael Ojeda, Fernando Davara, M.TL.uisaDez,
Daniel Gaica y L.uis Doieste De un modo especial han contribuido a esta
obra las profesoras Paloma Centenera, Mara Luisa Dez y Rosa Hernndez,
que han volcado su experiencia docente personal en la revisin de las galeiadas
de esta obra; tras su lectura han detectado erratas y sobre todo me han dado
consejos, sugerencias y aportaciones personales que han permitido mejoiar la
versin original de esta obra Gracias, amigas y colegas, por vnestia ayuda
Tambin el piofesor Ignacio Zahoneio ha leido parte de las galeradas y me
ha sugerido ideas de mejora Aunque no han intervenido directamente en la
obra hay nunierossiinas peisonas que han contribuido eficientemeiite en la
redaccin final de esta obra, sin su colaboiacin esta obra no estara ahora
en la calle Son todos mis alumnos de los ltimos cinco aos a los que he
impaitido cursos, seminarios y conferencias sobre tecnologas oiientadas a
objetos (anlisis, diseo, programacin y bases de datos) en universidades
espaolas y latinoamericanas, as coino en centros de formacin de empresas
multinacionales y de la administracin espaola Ellos me haii alentado eii
todo momento a difundir las teciiologas de objetos y de ellos he recibido todo
tipo de citicas, consejos y sugerencias que he volcado en muchos casos en el
libro Por ltimo, deseo expiesar de modo muy especial mi agiadecimiento a
Joige Piernavieja, mi antiguo editor -y, sin embargo, anzigo- que inici la
edicin de esta obra y que por sus nuevas iespousabilidades profesionales iio
la ha podido terminar, pero su coiisejo y aliento al igual que tantas otras veces
nunca me faltaron. A mi nuevo editor y tambin amigo Pepe Doinnguez que
ha teiiiiinado la obra; mi agradecimiento por su paciencia y comprensin Al
lector que ha confiado en esta obra en la esperanza de que le sea lo ms til
y eficaz posible en su formacin en programacin orientada a objetos
En Ca~chelejo(Andaluciu-Espaiia), verano de 1996
El autor
PARTE
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
1 2 La crisis del software
1 3 Factores en la calidad del software
1 , 4 Programacin y abstraccin
1 , 5 El papel (el rol) de la abstraccin
1 6 Un nuevo paradigma de programacin
1 7 Orientacin a objetos
1 8 Reutilizacin de software
19. Lenguajes de programacin orientados a objetos
1 , 1 0 Desarrollo tradicional versus orientado a objetos
111. Beneficios de las tecnologas de objetos (TO)
RESUMEN
incluso millones de lneas de cdigo Esta caracterstica se facilita descomponiendo nuestia implementacin en centenales y a veces millones de mdulos
independientes Esta cantidad de trabajo exige el uso de un equipo de desarroIladores, aunque se trata por todos los medios de que este equipo sea lo ms
pequeo posible Ahora bien, a medida que haya ms desarrolladores, se producen comunicaciones entre ellos ms complejas, e incluso con coordinacin
difcil entre ellos, particularmente si el equipo est disperso geogrflcamente,
como suele ser el caso de proyectos grandes
La rotura de una aplicacin en entidades y relaciones que son significativas
a los usuarios es un anlisis convencional y tcnicas de diseo Con la programacin orientada a objetos, este pioceso de descomposicin se extiende a la
fase de implementacin. Es ms fcil disear e implementar aplicaciones orientadas a objetos, ya que los objetos en el dominio de la aplicacin se corresponden directamente con los objetos en el dominio del software
1.,2..
LA CRISIS DEL SOFTWARE
En 1968 una conferencia sobre software, patrocinada por la OTAN, asumi los
trminos iizgenieiia del roftware y ciisis del software Con estos trminos se
quera expresar que el software era caro, poco fiable y escaso
Las metodologas y tcnicas estructurales que han reinado en la dcada de
los setenta y ochenta no han eliminado el problema, y de hecho la crisis del
software contina hoy en da Pese a las muchas herramientas y mtodos utilizados, los problemas del diseo descendentes permanecen igual, posiblemente
debido a que la complejidad del problema ha crecido considerablemente
El desarrollo de soitware
Entre las diferentes fases del ciclo de vida del software (Fig 1 l), el mantenimiento, aunque en tiempos fue despreciada su importancia, se considera actualmente como u110 de los problemas ms rigurosos en el desarrollo del software
Anlisis
Diseo
Implementacin
15 %
Eficiencia
Mantenimiento
La eficiencia del software es su capacidad pala hacer u11 buen uso de los recuisos que manipula
67 %
Figura 1 2
Transportabilidad portabilidadl
La integridad es la capacidad de un softwaie para proteger sus propios componentes contia los procesos que no tengan derecho de acceso
Fcil de utilizar
Capacidad de los productos software de realiza1 exactamente las tareas definidas por su especificacin
Robustez
El desarrolio de software
10
E l desarrollo de software
11
aquellas caracteisticas del territorio que deseamos modelar Un mapa de carreteras modela cmo conducir mejor de una posicin a otra Un mapa topogrfico modela el contorno de un territorio, quiz para planear un sistema de
largos paseos o caminatas
De igual forma que uii mapa debe ser ms pequeo significativamente que
su territorio e incluye slo informacin seleccionada cuidadosamente, as los
modelos mentales abstraen esas caractersticas de un sistema requerido para
nuestra comprensin, mientias ignoian caractersticas irrelevantes Este proceso de abstracciiz es psicolgicarneiite necesario y natural: la abstraccin es
crucial para comprender este complejo inundo,
L.a abstraccin es esencial para el funcionamiento de una mente humana
normal y es una herramienta muy potente para tratar la complejidad Considerar, por ejemplo, el ejercicio mental de memorizar nmeros. Un total de siete
dgitos se puede memorizar con ms o menos facilidad Sin embargo, si se
agrupan y se deiioininan nmeios de telfono, los dgitos individuales se relegan en sus detalles de ms bajo nivel, crendose un nivel abstracto y ms alto,
en el que los siete nmeros se organizan en una nica entidad Utilizando este
mecanismo se pueden memorizar algunos nmeros de telfonos, de modo que
la agrupacin de diferentes entidades conceptuales es un mecanismo potente al
seivicio de la abstiaccin
12
1.5..3. Procedimientos
Los procedimientos y funciones fueron uno de los primeros mecanismos de
abstracciu que se utilizaron ampliamente en lenguajes de programacin Los
procedimientos permitan tareas que se ejecutaban rpidamente, o eran ejecutadas slo con ligeras variaciones, que se reunan en una entidad y se reutilizaban, en lugar de duplica1 el cdigo varias veces Por otra parte, el procedimiento proporcion la primera posibilidad de ocultacin de ilzfolmacin Un
programador poda escribii un procedimiento o conjunto de procedimientos
que se utilizaban por otros programadores Estos otros programadores no
necesitaban conoce1 con exactitud los detalles de la implementacin; slo necesitaban el interfaz necesaiio. Sin embargo, los procedimientos no resolvan
todos los problemas En particular, no era un inecanismo efectivo para ocultar
la informacin y pala resolver el problema que se produca al trabajar mltiples piogramadores con nombres idnticos
Para ilustra1 el problema, consideremos un programador que debe escribir
un conjunto de rutinas para implementar una pila Siguiendo los criterios clsicos de diseno de software, nuestro programador establece en primer lugar el
interfaz visible a su trabajo, es decir cuatio rutinas: meter,sacar,pilavaca
y pilallena A continuacin iinplementa los datos mediante arrays, listas
enlazadas, etc Naturalmente, los datos contenidos en la pila no se pueden
hacer locales a cualquiera de las cuatro rutinas, ya que se deben compartir por
todos. Siil embargo, si las nicas elecciones posibles son variables locales o
globales, entonces la pila se debe mantener en variables globales: por el contrario, al se1 las variables globales, no existe un mtodo para limitar la accesibilidad o visibilidad de dichas variables Por ejemplo, si la pila se representa
mediante un array denominado datospila,este dato debe ser conocido por
otros programadores, que puedan desear crear variables utilizando el mismo
nombre pero relativo a las referidas rutinas De modo similar, las rutinas citadas estn reservadas y no se pueden utilizar en otras paites del programa para
El desarrollo de sotware
13
1.,5..4. Mdulos
Un mdulo es una tcnica que proporciona la posibilidad de dividir sus datos y
procedimientos en una parte privada -slo accesible dentro del mdulo- y
pai te pblica -accesible fuera del mdulo- Los tipos, datos (variables) y
procedimientos se pueden definir en cualquier parte,
El criterio a seguii en la construccin de un indulo es que si iio se necesita
algn tipo de informacin, no se debe tener acceso a ella Este criterio es la
ocultaciiz de infornzaciiz
Los mdulos resuelven algunos problemas, pero no todos los problemas del
desarrollo de software Por ejemplo, los mdulos permitirn a nuestros programadores ocultar los detalles de la implementacin de su pila, pero qu sucede
si otros usuarios desean tener dos o ms pilas? Supongamos que un programador ha desarrollado un tipo de dato Complejo (representacin de un nmero
complejo) y ha definido las operaciones aritmticas sobre nmeros complejos
-suma, resta, multiplicacin y divisin; asimismo ha definido rutinas para
convertir nmeros convencionales a complejos Se presenta un problema: slo
puede manipular un nmero complejo El sistema de nmeros complejos no
ser til con esta restriccin, pero es la situacin en que se encuentra el programador con mdulos simples
Los mdulos pioporcionan un mtodo efectivo de ocultacin de la informacin, pero no permiten realizar irzstaizciacin, que es la capacidad de hacer
mltiples copias de las zonas de datos
14
Programacion
1
2
3
4
El desarrollo de software
orrentada a objetos
1.,5..6. Objetos
Uii objeto es sencillamente un tipo abstracto de datos al que se aaden importantes innovaciones en comparticin de cdigo y reutilizacin L.os mecanismos
bsicos de orientacin a objetos son: objetos, ineizsujes y iiztodos, clases e iizstaizcias y heieiiciu
Conceptos clave
I
I
Abstraccin
Encapsulacin
Polimotiismo
Persistencia
Genericidad
Entidades bsicas
Mtodos
Instancias
Jerarqua
15
a
a
a
a
procedimientos
objetos
lgica
reglas
Algoritmos
Clases 11 objetos
Expre~adoeiz clculo de piedicadf~r
Reglas if-then
'
'
Un ejemplo que sirve como modelo o patrn: Dicrioiiai.)i o/ S<ieitce aiid leiliizoloq> Acadeinic
Press, 1992
KUHIV,Thomas S : The Stiucfure o/ S<icizt$i Reooiuiioii 2 " e d , Uiiiversity of Cliicaga Press
Chicago, 19'70.
Object-Oriented Programming (OOP)
16
El desarrollo de software
f1--
1-
17
natural L.as tcnicas orientadas a objetos proporcionan mejoras y metodologa~para construir sistemas de software complejos a partir de unidades de
software modularizado y reutilizable
Se necesita un nuevo enfoque para construir software en la actualidad Este
nuevo enfoque debe ser capaz de manipular tanto sistemas grandes como pequeos y debe crear sistemas fiables que sean flexibles, mantenibles y capaces
de evolucionar para cumplir las necesidades de cambio
L.a tecnologa orientada a objetos puede cubrir estos cambios y algunos
otros ms en el futuro
La orientacin a objetos trata de cumplir las necesidades de los usuarios
finales, as como las propias de los desarrolladores de pioductos software. Estas
tareas se iealizan mediante la modelizacin del mundo real El soporte fundamental es el modelo objeto Los cuatro elementos (propiedades) ms importantes de este modelo6 son:
Abstraccin
Encapsulacin
Modularidad
Jerarqua
Como sugiere Booch, si alguno de estos elementos no existe, se dice que el
modelo no es orientado a objetos
1..7.1. Abstraccin
La abstraccin es uno de los medios ms importantes, mediante el cual nos
enfrentamos con la complejidad inherente al software La abstraccin es la
propiedad que permite representar las caracteisticas esenciales de un objeto,
sin preocupaise de las restantes caracteisticas (no esenciales)
Una abstiaccin se centia en la vista externa de un objeto, de modo que
sirva para separar el comportamiento esencial de un objeto de su implementacin Definir una abstraccin significa describir una entidad del mundo real, no
importa lo compleja que pueda ser, y a continuacin utilizar esta descripcin en
un programa
El elemento clave de la programacin orientada a objetos es la clase Una
clase se puede definir como una descripcin 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 estilogrfica 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 capuchn,
llenar de tinta si est vaca)
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
programacin ha facilitado consideiablemente su aplicacin
Booc~;Giady: Objert-Oiientcd
1994
Benjainin/Cumrnings,
18
El desarrollo de soiware
19
1.,7..2. Encapsulacin
La eiicapsulaciii o eiicap~ulaiizieiitoes la propiedad que permite asegurar que el
contenido de la informacin de un objeto est oculta al mundo exterior: el
objeto A no conoce lo que hace el objeto B, y viceversa L.a encapsulacin
(tambin se conoce conlo otultaciiz de la iifoii~zuciiz),en esencia, es el proceso
de ocultar todos los secretos de un objeto que no contribuyeri a sus caractersticas esenciales
L.a encapsulacin permite la divisin de un prograina en mdulos Estos
n~dulosse implementan mediante clases, de foima que una clase representa la
encapsulacin de una abstraccin En la prctica, esto significa que cada clase
debe tener dos partes: un interfaz y una implementaciii El iizterfaz de una
clase captura slo su vista externa y la iiizplei?zeizzacincontiene la representacin de la abstraccin, as como los iilecaiiismos que realizan el comportamiento deseado
1.7.5. Polimorfismo
1.7.3. Modularidad
L,a modularidad es la propiedad que permite subdividii una aplicacin
en partes ms pequeas (llamadas nzdulos), cada una las cuales debe ser
tan independiente como sea posible de la aplicacin en s y de las restantes
partes
La modulaiizacin, como indica Liskov, consiste en dividir un programa en
mdulos que se puedan compilar por separado, pero que tienen conexiones con
otros mdulos Al igual que la encapsulacin, los lenguajes soportan la modularidad de diversas formas. Por ejemplo, en C + + los mdulos son archivos
compilados poi separado L.a prctica usual (se ver en el Captulo 2) es situar
los inteifaces de los mdulos en archivos con nombres con extensin , h (aiclzivos de cabecera) y las implementacioiies de los mdulos se sitan en archivos
con nombres con extensin cpp
En Ada, el mdulo se define como paquete (package) Un paquete tiene dos
partes: la espec@cacin del paquete y el cuerpo del paquete; tambin se pueden
compilar por separado
Como se ver en el Captulo 2, la i~zodulaiidod es la propiedad de un sistema
que peiinite su descomposicin en un conjunto de indulos cohesivos y dbilmente acoplados
1.7.4. Jerarqua
L.a jeiarqua es una propiedad que pei~niteuna ordenacin de las abstracciones L.as dos jerarquas ms importantes de un sistema complejo son: est~uctura
de clases (jerarqua es-un>>(iy-a): genetalizaciii/especializacin) y estructura
de objetos (jerarqua parte-de (part-of): agiegacin)
20
El desarrollo d e soffware
por ejemplo dibujar, esta tarea ser distinta segn que la clase sea un tringulo,
un cuadrado o una elipse Esta propiedad es el polimorfismo, que permite que
una misma funcin se comporte de diferente forma segn sea la clase sobre la
que se aplica La funcin dibujar se aplica igualmente a un crculo, a un cuadrado o a un tringulo, y el objeto ejecutar el cdigo apropiado dependiendo del
tipo especifico
El polimorfismo requiere ligadura tardia o postergada (tambin llamada
dinmica), y esto slo se puede producir en lenguajes de programacin orientados a objetos Los lenguajes no orientados a objetos soportan ligadura temprana o anterior; esto significa que el compilador genera una llamada a un nombre
especfico de funcin y el enlazador (linker) resuelve la llamada a la direccin
absoluta del cdigo que se ha de ejecutar En POO, el programa no puede
determinar la direccin del cdigo hasta el momento de la ejecucin; para
resolver este concepto, los lenguajes orientados a objetos utilizan el concepto
de ligadura tardia Cuando se envfa un mensaje a un objeto, el cdigo que se
llama no se determina hasta el momento de la ejecucin El compilador asegura
que la funcin existe y realiza ve~ificacinde tipos de los argumentos y del
valor de retorno, pero no conoce el cdigo exacto a ejecutar
Para realizar la ligadura tardia, el compilador inserta un segmento especial
de cdigo en lugar de la llamada absoluta Este cdigo calcula la direccin del
cuerpo de la funcin para ejecutar en tiempo de ejecucin utilizando informacin almacenada en el propio objeto Por consiguiente, cada objeto se puede
comportar de modo diferente de acuerdo al contenido de ese puntero Cuando
se enva un mensaje a un objeto, ste sabe qu ha de hacer con ese mensaje
Concurrencia (multitarea)
Per sistencia
Geizer icidad
Manejo de excepciones
Muchos lenguajes soportan todas estas propiedades y otros slo algunas de
ellas As, por ejemplo, Ada soporta concurrencia y Ada y C + + soportan
genericidad y manejo de excepciones La persistencia o propiedad de que las
variables -y por extensin a los objetos- existan entre las invocaciones de un
programa es posiblemente la propiedad menos implantada en los L P O 0 7 ,
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 objetos, como as est sucediendo en esta segunda mitad de la dcada de los noventa,
21
22
El desarrollo de software
23
Eii los ltinios aos han aparecido lenguajes con soporte de objetos que
cada vez se estn popularizando ms: Clipper 5-2, Visual BASIC, etc,
De cualquier forma, existe un Yey actual en los lenguajes oiientados a objetos: C + + La normalizacin por ANSI y AT&T de la versin 3 O y las numerosas versiones de difeientes fabricantes, tales como Borland C + + 4 014 5, Turbo
C + + 3 011 1 y 4 5, Microsoft C/C+ + 7 0, Visual C + + 1 512, Symantec 6 017 0,
etctera, hacen que en la seguilda mitad de los noventa ser el lenguaje orientado a objetos ms popular y utilizado en el mundo de la programacin
L.a evolucin de los lenguajes orientados a objetos se han mostrado en la
Figura 15, en la que se aprecia el tronco comn a todos los lenguajes modeinos
Algol y las tres lneas fundamentales: enfoque en Pascal (Ada, Object Pascal),
enfoque pulo de orientacin a objetos (Simula/Smalltalk/Eiffel) y enfoque en C
(Objective-C, C + f , .Talla)
1.9.1.
Existen varias clasificaciones de lenguajes de programacin orientados a objetos, atendiendo a criterios de construccin o caractersticas especficas de los
mismos Una clasificacii~ampliamente aceptada y difundida e s la dada poi
Wegner y que se ilustra en la Figura 1 69
en objetos
+clases
\
Algol
1 "---
\\\
/
1
Simula
Orientados
a objetos
CLU
Pascal
'
X
\/
/
Smalltalk
Objet Pascal
Ada
Actor
objective.c
c++
v
Ada-95
'E~i:!a~d
Pascal
Java
Figura 1 5
BASlC
Figura 1 6
Visual BASlC 3
i 4
Visual BASlC
24
El desarrollo de soffware
31
32
Eiffel
Simula
Modularizacin
Tipos abstractos de datos
Gestin automtica de memoria
4 Slo clases
5 Herencia
6 Polirnoifismo (y ligadura dinmica )
'7 Herencia mltiole v reoetida
1
2
3
S
S
S
S
S
S
S
S
S
Si
S
S
S
S
S
S
S
E n parte
En paile
S
S
S
S
S
S
S
S
S
S
No
Si
S
S
No
S
S
No
No
No
No
25
ORIENTADO A OBJETOS
El sistema tradicional del desarrollo del software para un determinado sistema
es la subdivisin del mismo en mdulos, a la cual deben aplicarse criterios
especficos de descomposicin, los cuales se incluyen en metodologas de diseo Estos mdulos se refieren a la fase de construccin de un programa, que en
el modelo clsico sigue a la definicin de los requisitos (fase de anlisis),que se
muestra en la Figura 3 1
El modelo clsico del ciclo de vida del software n o es el nico modelo
posible, dado que es posible desarrolla1 cdigo de un modo evolutivo, por
refinamiento y prototipos sucesivos Existen numerosos lenguajes de programacin y metodologas que se han desarrollado en paralelo a los mismos, aunque
normalmente con independencia de ellos
En esta seccin nos centraremos en la metodologa ms utilizada, denominada desarrollo estructurado, que se apoya esencialmente en el diseo desceizdente y en la progiamacin estructul.ada
La progiamacin estructurada es un estilo disciplinado de programacin segn los lenguajes procedimentales (por procedimientos), tales como
FORTRAN, BASIC, COBOL y recientemente C y C++
Las metodologias disetio descendente (o descomposicin funcional) se centran en operaciones y tienden a descuidar la importancia de las esrtructuras de
datos Se basan en la dlebre ecuacin de Wirth:
Datos
+ Algoritnzos = Programar
26
El desarrollo de software
27
que han sido probados pieviamente a su utilizacin El ensamblado de componentes electinicos se garantiza mediante interfaces adecuados
Estos conceptos se aplican tambin con tecnologas de objetos Las clases
(tipos de objetos) son como los clzips de hu~divaie,Cox les llam chips de
softwuie, que no slo se pueden enlazar (ensamblar) entre s, sino que tambin
se pueden reutilizar (volver a utilizar), L.as clases se agiuparn normalmente
en bibliotecas de clases, que son componentes reutilizables, fcilmente legibles
En la actualidad existe gran cantidad de software convencional, en su
mayora escrito normalmente para resolver problemas especficos; por esta razn, a veces es ms fcil escribir nuevos sistemas que conveitir los existentes.
L.os objetos, al reflejar entidades del mundo real, permiten desarrollar aplicaciones, creando nuevas clases y eiisamblndolas con otras ya existentes
Normalmente, los desarrolladores experimentados gastan un porcentaje alto
de su tiempo (20 al 40 por 100) en cieai nuevas clases y el tiempo restante en
ensamblar componentes probados de sistemas, construyendo sistemas potentes
y fiables
Figura 1 7
Mtodos
L.os sistemas tradicionales, por otia parte, presentan con frecuencia efectos
laterales no deseados Las tecnologas de objetos ayudan a los desarrolladores
a trata1 la complejidad en el desariollo del sistema
La productividad del desairollador se puede mejorar, debido a que las clases
de objetos se pueden hacer reutilizables de modo que cada subclase o instancia
de un objeto puede utilizar el mismo cdigo de piograma para la clase Por
otra parte, esta productividad tambin aumenta, debido a que existe una asociacin ms natural entie objetos del sistema y objetos del mundo real
28
Ei
Programa
Programa
Datos
..
" IAYLOR,
David A : Objet-Oriented Trchiioioqy Readirlg MA: Addison-Wesley, 1992, pginas 101-107
" Ibid pgs 108-113
desarrollo de soitware
29
RESUMEN
Este captulo es una introduccin a los mtodos de desarrollo orientados a
objetos Se comienza con una bieve revisin de los problemas encontrados en el
desarrollo tradicional de software que condujeron a la crisis del software y que
se han mantenido hasta los aos actuales El nuevo modelo de programacin se
apoya esencialmente en el concepto de objetos
La orientacin a objetos modela el mundo real de un modo ms fcil a la
perspectiva del usuario que el modelo tradicional La orientacin a objetos
proporciona mejores tcnicas y paradigmas para consttuir componentes de
software reutilizables y bibliotecas ampliables de mdulos de software Esta
caracterstica mejora la extensibilidad de los programas desarrollados a travs
de metodologas de orientacin orientada a objetos Los usuarios finales, programadores de sistemas y desarrolladores de aplicaciones se benefician de las
tecnologas de modelado y piogramacin orientadas a objetos
L.os conceptos fundamentales de orientacin a objetos son tipos abstractos
de datos, herencia e identidad de los objetos U n tipo abstracto de datos describe una coleccin con la misma estructura y comportamiento Los tipos abstractos de datos extienden la nocin de tipos de datos, ocultando la implementacin de operaciones definidas por el usuario (mensajes) asociados con los tipos
de datos Los tipos abstractos de datos se implementan a travs de clases Las
clases pueden heredar unas de otras Mediante la herencia se pueden construir
nuevos mdulos de software (tales como clases) en la parte superior de una
jerarqua existente de mdulos La herencia permite la comparticin de cdigo
(y por consiguiente reutilizacin) entre mdulos de software La identidad es la
propiedad de un objeto que diferencia cada objeto de los restantes Con la
identidad de un objeto, los objetos pueden contener o referirse a otros objetos
La identidad del objeto organiza los objetos del espacio del objeto inanipulado
por un programa orientado a objetos.
Este captulo examina el impacto de las tecnologas orientadas a objetos en
lenguajes de programacin, as como los beneficios que producen en el desario110 de software
Los conceptos claves de la programacin orientada a objetos se examina en
el captulo; si no ha ledo hasta ahora nada sobre tecnologas de objetos, deber
examinar con detenimiento todos los elementos conceptuales del captulo, que
se ampliarn en detalle en captulos posteriores; si ya tiene conocimientos bsicos de la orientacin a objetos, este captulo debe consolidarlos y prepararle
para una eficiente lectura de los siguientes captulos
31
2.1.. MODULARIDAD
MODULARIDAD:
TIPOSABSTRACTOSDEDATOS
CONTENIDO
2 , l Modularidad
2 2 Diseo de mdulos
2 3 Tipos de datos
2 4 Abstraccin en lenguajes de programacin
2 5 Tipos abstractos de datos
2 6 Tipos abstractos de datos en Turbo Pascal
2.7, Tipos abstractos de datos en Modula-2
2.8, Tipos abstractos de datos en Ada
2.9. Tipos abstractos de datos en C
210. Tioos abstractos de datos en C++
RESUMEN
EJERCICIOS
En este capitulo se examinarn los conceptos de modularidad y
abstraccin de datos La modularidad es la posibilidad de dividir
una aplicacin en piezas ms pequeas llamadas mdulos Abstraccin de datos es la tcnica de inventar nuevos tipos de datos
que sean ms adecuados a una aplicacin y, por consiguiente,
facilitar la escritura del programa La tcnica de abstraccin de
datos es una tcnica potente de propsito general, que cuando se
utiliza adecuadamente puede producir programas ms cortos,
ms legibles y flexibles,
Los lenguajes de programacin soportan en sus compiladores
tipos de datos fundamentales o bsicos (predefinidosl, tales com o int, char y float en C y C++, o bien integer, real o
boolean en Pascal Algunos lenguajes de programacin tienen
caractersticas que permiten ampliar el lenguaje aadiendo sus
propios tipos de datos,,
Un tipo de dato definido por el programador se denomina
tipo abstracto de dato, TAD(Abstract Data Type, ADTl El trmino
abstracto se refiere al medio en que un programador abstrae algunos conceptos de programacin creando un nuevo tipo de dato
La modularizacin de un oroarama
utiliza la nocin de tipo abs. 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
,
,
tipo, se obtiene un nuevo tipo de dato denominado objeto
En consecuencia, la i~zodularidades la posibilidad de subdividir una aplicacin en piezas ms pequeas (denominadas iiz<dulos),cada una de las cuales
debe ser tan independiente como sea posible, coiisiderando la aplicacin como
un todo, as como de las otras piezas de las cuales es una paIte Este piincipio
bsico desemboca en el principio bsico de construi~programas inodula~esEsto
significa que, aproximadamente, ha de subdividir un pr.ograma en piezas ms
pequeas, o mdulos, que son generalmente iiidependientes de cada una de las
restantes y se pueden eizsainblar fcilmente para construir la aplicacin completa
E,n esencia, las abstracciones se impleinentan en mdulos, conocidos en la
terminologa de Booch como objetos, que agrupan eii una sola entidad:
Un conjunto de datos
Un conjunto de operaciones que actan sobie los datos
L.iskov define la rnodulariracin como el proceso de dividir un progranla
en nldulos que se pueden compilar separadamente, pero que tienen conexiones con otros mdulos Painas va ms lejos y dice que las conexiones entre
mdulos deben seguir el criterio de ocultacin de la iuform.acin: un sistema se
debe descomponer de acuerdo al criterio general, de que cada mdulo oculta
alguna decisin de diseo del resto del sistema; en otras palabias, cada mdulo
oculta un secreto
Si un piograma se descoinpoiie (o subdivide en mdulos) de modo consistente con el criterio de Pariias 4 s decir, aplicando el piincipio de ocultacin de la
inrormacin-, se reduce la complejidad de cada mdulo que compone la solucin Estos se constituyen en cierto modo independientes de los restantes, con lo
que se reduce la necesidad de toinar decisiones globales, operaciones y datos
32
se denominan p i ~ i n ~ t ~ uoupuntos
s
de entiada del mdulo Los tipos lgicos
eventualmente definidos en el interfaz permiten iepresentar los parmetros de
estas primitivas
Primitivas de acceso
Descripcin de propiedades de los datos
lnteraz
Seccin
privada
Atributos
Algoritmos
Representacin
Parmetros actuales
2.1.2.
Reglas de modularizacin
Muchos
interaces
Unidades modulares
33
34
lnterfaces explicitos
El interfaz o parte visible exteinamente de un mdulo se debe declarar y describit explcitamente; el programa debe especificar cules son los datos y procedimientos que un indulo trata de exportar y cules deben permanece1 ocultos
del exterioi El interfaz debe ser fcilmente legible, tanto para el programador
como para el compilador Es decir, el programador debe comprender cmo
funciona el programa y el cornpilador ha de podei comprobar si el cdigo que
accede al mdulo se Iia escrito correctamente
!
1
!
11
35
2..2.DISENO DE MODULOS
Aunque el diseo modular persigue la divisin de un sistema grande en mdulos ms pequeos y a la vez manejables, no siempre esta divisin es garanta de
un sistema bien organizado Los mdulos deben disearse con los criterios de
acoylariiiento y cohesrdri El primer criterio exige independencia de mdulos y el
segundo criterio se corresponde con la idea de que cada mdulo debe realizarse
con una sola funcin relacionada con el problema
Desde esta perspectiva, Booch2 define la modularidad como la propiedad
de uiz sisteiizu que ha sido descoiizpuerto en un coiijunlo de nzdulos colzeiiuor );
dbilnieilte ucoplados
Ocultacin d e la informacin
-. -
- -.
.-
.-. .-
- ..
-.
-.
.-
kn lenguajes clc ~ i r o g r c i n ~ ; i ~ I ~l 5 ~
i l sla ~modilIar1~.1~611
~ ~ ~ ~ , h c C C I I ~ KCII~ lo,
subpii,gr:itn;is (pr~>cediniic~itos,
fi~~iei,)~lcs
y I ~ ~ I I I I : I SEn
.
1~11fiua.i~~
o r ~ n t ; ~ ;I~ lob;cios.
o~
1:l 1iiod11l:irIzaci61i
o parti~i611
dcl problelnii sc reI
S L I ~ I Y Ca travCs d? las ~Ip,)s:~h~tractos
LIS
d:~t.)s.
.-
-.
- -.
.-
.-
En diseo estiucturado, la modularizaciii -coino ya se ha coinentadose centra en el agrupanliento significativo de subprogramas, utilizaiido el criterio de acoplamiento y cohesin
En diseo orientado a objetos, el problema es sutilinente diferente: la tarea
consiste en decidir dnde se empaquetan lsicaiiiente las clases y objetos de
la estructura lgica del diseo, que son claramente diferentes de los subprogramas
'
2.2..2.Cohesin de mdulos
La cohesin es una extensin del concepto de ocultamiento de la iiiforinacin
Dicho de otro modo, la cohesin describe la natulaleza de las interacciones
Booc~,Grady: Ohjeit Oiiri?ted Desigil ittii appiicurioiir Benjarnin/Cummings 1991, py 52
36
dentro de un mdulo software Este criterio sugiere que un sistema bien modularizado es aquel en el cual los interfaces de los mdulos son claros y simples,
Un mdulo cohesivo ejecuta una tarea sencilla de un procedimiento de software y requiere poca interaccin con procedimientos que ejecutan otras partes de
un programa En otras palabras, un mdulo cohesivo slo hace (idealmente)
una cosa
La cohesin y el acoplamieiito se miden como un espectro que muestra
las escalas que siguen los mdulos L.a T'abla 2 1 muestra la clasificacin de
acoplamientos de mdulos y su grado de acoplamiento
< ; r ~ dde
o acoplamiento
Grado de manrenibilidad
Por contenido
Comn
De control
Por sellado (estampado)
Alto (fuerte)
Bajo
Alto
Datos
Sin acoplamiento
Bajo (dbil)
<;rddo de cnhesin
tirado dc manteniniiento
Por coincidencia
Lgica
Temporal
Po1 procedimientos
Por comunicacioiies
Secuencia1
Funcional
Info~macional
Bajo
Bajo
Alto
Alto
37
Repiesentacin
+ Operaciones
Un tipo de dato describe un conjunto de objetos con la misma representacin Existen un nmero de operaciones asociadas con cada tipo Es posible
realizar aritmtica sobre tipos de datos enteros y reales, concatenar cadenas o
recuperar o modificar el valor de un elemento
La mayora de los lenguajes tratan las variables y constantes de un programa como instancias de un tipo de dato Un tipo de dato proporciona una
descripcin de sus instancias que indican al compilador cosas como cunta
memoria se debe asignar para una instancia, cmo interpretar los datos en
memoria y qu operaciones son permisibles sobre esos datos Por ejemplo,
cuando se escribe una declaracin tal como f l o a t z en C o C++, se est
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 memoria, y que operaciones tales como suiliar y multiplicar estn permitidas,
mientras que operaciones tales como el el resto (mdulo) y desplazamiento
de bits no lo son Sin embargo, no se necesita escribir la declaracin del tipo
f l o a t - e l autor de compilador lo hizo por nosotros y se construyen en el
compilador- L.os tipos de datos que se construyen en un compilador de este
modo se conocen como tipos de datos fulzdamentales (predefinidos), y por ejemplo en C y C++ son, entre otros: i n t , c h a r y f l o a t
Cada lenguaje de programacin incorpora una coleccin de tipos de datos
fundamentales, que incluyen normalmente enteros, reales, carcter, etc Los
lenguajes de programacin soportan tambin un nmero de constructores de
tipos incorporados que permiten general tipos ms complejos Por ejemplo,
Pascal soporta registros y arrays,
En lenguajes convencionales tales como C, Pascal, etc, las operaciones
sobre un tipo de dato son composiciones de constructores de tipo y operaciones de tipos bases
Operaciones
Operaciones constructor
+ Operaciones base
38
39
Es esencial para disear software modular y fiable La abstracciiz procedimental se basa en la utilizacin de procedimientos o funciones, sin preocuparse de
cmo se implementan Esto es posible slo si conocemos qu hace el procedimiento; esto es, conocemos la sintaxis y semntica que utiliza el procedimiento
o funcin El nico mecanismo en Pascal estndar para establecer abstraccin
procedimental es el subprograma (procedimientos y funciones) La abstraccin
aparece en los subprogramas debido a las siguientes causas:
40
Un IAD se compone de estructuras de dator y los procedimientos o funciones que manipulan esas estructuras de datos,
Mtodo 3
Interfaz pblico
estructuras de datos
Implementacin de mtodos:
Cdigo del mtodo 1
Cdigo del mtodo 2
Cdigo del metodo 3
Cdigo del mtodo 4
El interfaz del tipo abstracto de dato se asocia con las operaciones y datos
visibles al exterior del TAD
Mtodo 4
41
Implementacin privada
Algunos lenguajes de programacin tienen caractersticas que nos permiten
ampliar el lenguaje, aadiendo sus propios tipos de datos Un tipo de dato
definido por el p~ogramadorse denomina tipo abstracto de datos (TAD) para
diferenciarlo del tipo fundamental (predefinido) de datos Por ejemplo, en Turbo Pascal un tipo Punto, que representa a las coordenadas x e y de un sistema
de coordenadas rectangulares, no existe Sin embargo, es posible implementar
el tipo abstracto de datos considerando los valores que se almacenan en las
variables y qu operaciones estn disponibles para manipular estas variables
En esencia, un tipo abstracto de datos es un tipo de datos que consta de datos
(estructuras de datos propias) y operaciones que se pueden realizar sobre esos
datos
42
Programacin
orientada a obletos
Modolaridad
43
2.6.. TIPOSABSTRACTOSDEDATOSENTURBOPASCAL
Un tipo abstracto de datos es un modelo (estructura) con un nmero de operaciones que afectan a ese modelo Es similar a la definicin que daremos en el
captulo siguiente de objeto, y de hecho estn unidos ntimamente L.os tipos
abstractos de datos pioporcionan numerosos beneficios al programador, que se
pueden resumir en los siguientes:
1
2
4
5
6
Pila
1
Estructura de datos
Almacena una serie de elementos del tipo elemento La pila esta inic~almente
vacla y los elementos se meten o sacan en la pila por el mismo extremo
Operaciones (Procedimientosque actan sobre la estructura de datos)
Meter
Sacar
Crear
Destruir
Pilavaca
Sacar?
7
Meter
2..5.2..
Implementacin de los TAD
Los lenguajes convencionales, tales como Pascal, permiten la definicin de
nuevos tipos y la declaracin de piocedimientos y luneiones para realiza1 operaciones sobre objetos de los tipos Sin embargo, tales lenguajes no permiten
que los datos y las operaciones asociadas sean declaradas juntos como una
unidad y con un solo nombre En los lenguajes en el que los mdulos (TAD) se
pueden implementar como una unidad, stos reciben nombres distintos:
Turbo/Borland Pascal
Modula-2
Ada
C++
lava
unidad, objeto
mdulo
paquete
clase
clase
Figura 2 5
En Turbo Pascal, los TAD se implementan mediante estructuras tipo unidad Recordemos que una unidad es una biblioteca de funciones y procedimientos que pueden ser utilizados poi cualquier programa con la condicin de
incluir el nombre de la unidad en la clusula u s e s de su sintaxis
unit <nombre unidad,;
interface
.cclaucula uses,
<constantes, tipos y variables publicas,
<cabeceras de procedimientos y funciones publicas>
implementation
cclaucula uses,
<constantes tipos y variables privadas,
<procedimientos/funciones privadas y cuerpos de
procedimientos/funciones publicas,
begin
44
45
Una vez que se ha implementado el tipo de dato Pila, ste puede ser utilizado en cualquier programa con tal de invocar en la clusula uses a dicho tipo
de dato Pila
integer;
*)
Esta tarea se consigue metiendo nmeros en la pila y a continuacin vaciando dicha pila
*)
program Nmeros;
implementation
procedure Crear (var S:tipo);
begin
SCima : = O ;
end;
uses
Pila;
var
S:Pila Tipo;
46
TAD: los tipos de datos y las definiciones de las operacioiies asociadas (que
manipulan) con esos datos se agrupan en una parte (mdulo de definicin:
DEFINITION MODULE)
y el cuerpo de las operaciones asociadas en otra parte
(mdulo de impkmentacin: IMPLEMENTATION MODULE)
2..7..1. Mdulos
La construccin que proporciona las caractersticas citadas anteriormente se
denomina mdulo Sintcticamente, el mdulo posee la misma estructuia que
las uniones en Pascal (versiones USCD y Turbo de Borland)
Un programa en Modula-2 pioporciona una coleccin de mdulos biblioteca que pueden ser ampliados por el programador escribiendo sus propios mdulos biblioteca. Los mdulos programa y biblioteca pueden contener anidados mdulos ms pequeos ocultos del resto del programa, que se denominan
rndulor locales
Los mdulos pueden compilarse por separado y facilitan a los programadores el desarrollo de bibliotecas de cdigo reutilizable y la construccin de grandes programas,
El formato bsico de un mdulo es:
MODULE i d e n t i f i c a d o r - m o d ;
<declaraciones>
BEGIN
<sentencias>
END i d e n t i f i c a d o i o d
47
Datos opacos
Figura 2 6
Ocultamiento de datos,
48
Cuando la parte de definicin de un mdulo biblioteca define un tipo opaco, la parte de implementacin del mdulo debe incluir una declaracin completa del tipo La declaracin completa de un tipo opaco se debe especificar
como un tipo abstracto de dato Pila,y es el siguiente:
DEFINICION MODULE PILA:
( * Tipo opaco * )
TYPE Pila;
PROCEDURE Inicializar(vAR S: Pila);
PROCEDURE Meter(VAR S: Pila) : INTEGER;
PROCEDURE Sacar( S : Pila) : INTEGER;
PROCEDURE Pilavacia(s: Pila) : BOOLEAN;
PROCEDURE Pilallena(s: Pila) : BOOLEAN;
END PILA
49
Este mdulo tiene algunos inconvenientes Si se decide incrementat el tamao mximo de la pila, se deben recompilar todos los mdulos que importan
Piiacaracteres,incluso cuando cambie la representacin de Piiacar Estos inconvenientes y otros ms no citados se pueden mejorar haciendo Pilacar de tipo opaco, permitiendo que Piiacaracteres exporte Pilarcar sin
proporcionar ninguna informacin a los mdulos cliente sobre la estructura
real de la variable Piiacar Este enfoque resuelve nuestros problemas: se
puede cambiar la representacin de PilaCar en cualquier momento sin cambiar los mdulos cliente y se asegura que los clientes no pueden modificar
variable Pilacar,excepto a travs de procedimiento exportados por Pilacaracteres
2.7.5.
50
H?.LT
*)
(*
retorno de carro
(*
vacia pila s
*)
s : PilaCar;
car: CHAR
BEGIN
Inicializar(s);
END ;
ch : = sA.ArrayPila[cA cimapila];
DEC ( S ^ cimapila)
END Meter;
Una aplicacin Inversa utiliza un mdulo programa que lee una cadena
de caracteres y visualiza su inversa Este programa es fcil de escribir si se
utiliza una pila para almacenar la cadena A medida que lee caracteres, se van
empujando a la pila, detenindose cuando se alcanza el final de la cadena
Inversa saca los caracteres de la pila hasta que se vace, escribiendo a continuacin cada carcter a medida que se saca el carcter
MODULE Inversa;
( * invierte una cadena escrita por el usuario * l
51
*)
) ;
*)
52
53
var pi1a:pilatipo;
var aux:integer;
begin
crear (pila);
meter (pila, 4 2 ) ;
meter (pila, 2 7 ) :
quitar (pila!;
aux : = cima (pila);
end usodepila
54
Ada divide el paquete en dos construcciones sintcticamente independientes: la especificacin del paquete y el cuerpo del paquete El contenido de la
especificacin es muy similar al mdulo de definicin (DEFINITION MODULE)
en Modula-2 El cuerpo se corresponde al mdulo de implementacin (IMPLEMENTATION MODULE)
El cuerpo del paquete contiene las definiciones de los componentes que estn
ocultas a los clientes del paquete Uii cuerpo del paquete se puede definir en un
mdulo separado de la especificacin del paquete La sintaxis es:
package body <nombrepaquete> is
<declaraciones>
.:impl ementacin subprogramas>
[manejador de excepciones1
begin <inicializaciones>
end <nombrepaquete>
55
Los paquetes permiten ocultar a los usuarios de los mismos los objetos
internos de los mismos. L.os tipos privados nos permiten ocultar a los usuarios
de los mismos los detalles de construccin de los tipos Ada soporta dos tipos
de datos: privados y privados limitados
Una seccin a continuacin de la palabra reservada pr i v a t e y terminada en end, al final de la especificacin, en la que se declaran los detalles de
implementacin del tipo o tipos privados
As, por ejemplo, la seccin de especificacin de un tipo de datos abstracto
P i l a s es:
package Pilas is
--comentarios
--un paquete que exporta un tipo abstracto Pila de enteros
type Pila-ent is private;
procedure Iniciar (S:in out Pila-ent);
procedure Meter (S:in out Pila-ent; 1nst:integer);
procedure Sacar (S:in out Pila-ent, x: out integer);
function Cima (P:Pila-ent) return integer;
function Es-vaca (%:Pila-ent) return baolean;
function Es-llena (S:Pila_ent) return boolean;
56
Cuando una variable se declara como tipo privado limitado, no estn disponibles ni las operaciones predefinidas de igualdad ni de asignacin. Si se
requieren, se puede definir una nueva funcin =, que slo compara los elemen-
57
implementacin
# define norma(x) (
58
Coord
punto;
X,
float real(comp1ejo c )
return c r;
1
long dx=pl x - p2 x
dy=pl y - p2 y ;
return sqrt (dx*dx+dy*dy);
float imag(comp1ejo c )
return c i;
typedef struct i
Y;
1
/*
Punto p2)
restantes ~mplementaciones* /
1
complejo sumar (complejo a , complejo b)
complejo c;
c r = a r + b r ;
c i = a i + b i ;
return
C;
Una vez definido el tipo de dato coinplejo, se puede invocar a los mismos
dentro de un programa principal
#endi
#include '"complexh"
Itifndef COMPLEX
#define COMPLEX
typedef struct
float r , i;
) complejo;
59
int main() {
complejo x , y, z ;
60
return O;
C no permite definir los signos y - para trabajar con tipos definidos por
el usuario, cosa que s podr realizarse con C + + mediante la propiedad de
sobrecarga de operadores
61
pila-carac a , b;
char ch;
a meter(''); b rneter('g');
ch = a cima O ;
= -1);
);
//archivo pila h
//definicin de una pila, con operaciones
conct int MAXPILA = 100;
i
pila S ;
int i;
struct pila
i
private:
int cuenta;
int itemsIMAXPILA1;
public:
pila();
void met.er(int item);
void sacar ( ) ;
int cima ( ) ;
int vaca ( ) ;
i
cuenta = 0;
1
void pila::meter(int item) //meter un elemento en la pila
items[cuenta++l = item;
1
vaid pila: :sacar( )
//ARCHIVO: pila h
//Interaz de una pila de enteros
#ifndef PILA
#define PILA
class pila i
private:
const unsigned int maximo;
int cuenta;
int * itemc;
public:
pila0;
-pila(1 ;
void meter(int item) ;
void cacar ( ) ;
int cima();
int vaca ( 1 ;
1;
1
int pila::vacia()
I
return cuenta == 0;
1
//devuelve elemento superior de la
//pila
Cuenta--;
int pi1a::cirnaO
63
pila: :pila0
maximo (100)
cuenta(0) i
itemc = new int [maximo];
)
64
pila: :-pila() (
delete items;
1
void pila::meter(int itern)
itemc [cuenta++] = item;
65
Ada, C y C + +
EJERCICIOS
21
principa cpp
Llena:
pila s;
int i:
for
(;
c meter();
C O U ~i<
'NUMEROS
Igual:
I N V E R T I D O S " << endl;
for ; c v a c i a 0 ; S sacar01
cout << s c i m a 0 .:< endl;
return O ;
RESUMEN
Este captulo examina el concepto fundamental de la orientacin a objetos, el
tipo abstracto de datos Los tipos abstractos de datos (TAD) describen un
conjunto de objetos con la misma representacin y comportamiento Los
tipos abstractos de datos representan una separacin clara entre la interfaz
externa de un tipo de datos y su implementaciii interna La implementacin
de un tipo abstracto de datos est oculta Por consiguiente, se pueden utilizar
implementaciones alternativas para el mismo tipo abstracto de datos sin cambiar su interfaz
23
2.5. Crear un TAD que lepresente un dato tipo cadena (striizg) y sus diversas
operaciones: clculo, longitud, buscar posicin de un carcter dado, concatenai cadenas, extraer una subcadena, etc
67
CONCEPTOS FUNDAMENTALES
DE PROGRAMACION
ORIENTADA A OBJETOS
CONTENIDO
3 1
3,2
3,3
34
3 5
3 6
Programacin estructurada
Qu e s la programacin orientada a objetos?
Clases
Un mundo de objetos
Herencia
Comunicaciones entre objetos: los mensajes
3 7 . Estructura interna de un objeto
3 8 Clases
3 9 . Herencia y tipos
3 1 0 AnulaciniSustitucin
3 , 1 1 Sobrecarga
3 1 2 Ligadura dinmica
3 1 3 Objetos compuestos
3 , 1 4 Reutilizacin con orientacin a objetos
3 15. Polimorfismo
RESUMEN
Funcin
La programacin orientada a objetos e s un importante conjunto de tcnicas que pueden utilizarse para hacer el desarrollo de programas ms eficientes, a la par que mejora la fiabilidad de los programas de computadora En la programacin
orientada a objetos, los objetos son los elementos principales
de construccin Sin embargo, la simple comprensin de lo
que es un objeto, o bien el uso de objetos en un programa, no
significa que est programado en un modo orientado a objetos Lo que cuenta e s el sistema en el cual los objetos se interconectan y comunican entre si
En este texto nos limitaremos al campo de la programacin, pero e s tambin posible hablar de sistemas de administracin de bases de datos orientadas a objetos, sistemas operativo~orientados a objetos, interfaces de usuarios orientados
a objetos, etc
A medida que la complejidad de un programa crece, tambin crece su independencia de los tipos de datos fundamentales que procesa En un programa
estructurado, las estructuras de datos de un programa son tan importantes
como las operaciones iealizadas sobre ellas Esto se hace ms evidente a medida que crece un programa en tamao L.os tipos de datos se procesan en
muchas funciones dentro de un programa estructurado, y cuando se producen
cambios en esos tipos de datos, las modificaciones se deben hacer en cada
posicin que acta sobre esos tipos de datos dentro del programa Esta tarea
puede ser frustrante y consumir un tiempo considerable en programas con
millones de lneas de cdigo y centenares de funciones
En un programa estructurado, los datos locales se ocultan dentro de funciones y los datos compartidos se pasan como argumentos (Fig 32)
68
69
D
Variables locales
Variables locales
Funcin A
Funcin B
--
Funcin
Figura 3 3
Funcin
1 1
Funcin
1 1
Funcin
Grady Booch, autor del mtodo de diseo orientado a obletos, define la piogramac~noi lentada a objetos (POO) como
un mtodo de implementacin en el que los programas se organizan como colecciones cooperativas de objetos, cada uno de los cuales representan una instancia
de alguna clase, y cuyas clases son todas miembros de una jerarqua de clases
unidas mediante relaciones de hetencias
Existen tres importantes partes en la definicin: la programacin orientada
a objetos 1) utiliza objetos, no algortmicos, como bloques de construccin
lgicos (jerarquia de objetos); 2) cada objeto es una instancia de una clase, y 3)
las clases se relacionan unas con otras por medio de relaciones de herencia
' Booc~,Giady: Anlisis y diseo orientado a objetos coii aplicacioi~es 2' edicidn AddisonWesleypaz de Santos, 1995
70
1l
3.2.,1.. El objeto
La idea fundamental en los lenguajes orientados a objetos es combinar en una
sola unidad datos v funciones que operan sobre esos datos Tal unidad se denomina objeto Por consiguiente, dentro de los objetos residen los datos de los
lenguajes de programacin tradicionales, tales como nmeros, ariays, cadenas
y registros, as como funciones o subrutinas que operan sobre ellos
Las funciones dentro del objeto (funciones miembro en C + + , nz4todos en
Object-Pascal y Smalltalk) son el nico medio de acceder a los datos privados
de un objeto Si se desea leer un elemento datos de un objeto se llama a la
funcin miembro del objeto Se lee el elemento y se devuelve el valor No se
puede acceder a los datos directamente Los datos estn ocultos, y eso asegura
que no se pueden modificar accidentalmente por funciones externas al objeto
Funciones externas
Procedimientos externos
Datos
Funcin
Datos
Funcin
1
Figura 3 4
Pblico
El modelo objeto,
Privado
71
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
mundo real Se designa por un nombie o identificado1 del objeto.
Dentro del contexto de un lenguaje orientado a objetos (LOO), un objeto
encapsula datos y los procedimientos/funciones (nz4todos.l que manejan esos
datos La notacin grfica de un objeto vara de unas metodologas a otras
72
rq
Atiibutos
Mtodos
73
El objeto tetiene cierta informacin y conoce cmo tealizar ciertas operaciones La encapsulacin de operaciones e informacin es muy importante L.os
mtodos de un objeto slo pueden manipular directamente datos asociados con
ese objeto. Dicha encapsulacin es la propiedad que permite incluir en una sola
entidad (el mdulo u objeto) la iifoimaciiz (los datos o atributos) y las opeiaciones (los mtodos o funciones) que operan sobre esa info~macin
Informacin
operaciones
Y
Seccin
privada
Nombre
del objeto
Figura 3 7
Encapsulamiento de datos
Atributos
Mtodos
lntertaz pblico
y operaciones
(c)
(d)
Figura 3 5 . Notaciones grficas de objetos: (a) Taylor; (b) Yourdon/Coad;
(c) OMT; (d) Booch,,
i . ; . . ._
Figura 3 8
u
Figura 3 6 El objeto Cochel
Representacin
3..2.3.Mtodos y mensajes
Un programa orientado a objetos consiste en un nmeio de objetos que se
comunican unos con otros llamando a funciones miembro Las funciones
miembro (en C + i ) se denominan mtodos en otros lenguajes orientados a
objetos (tales como Smalltalk y Turbo Pascal 5 516 0170)
Los procedimientos y funciones, denominados mtodos o funciones miemb~o,
residen en el objeto y determinan cmo actan los objetos cuando reciben un
mensaje Un merzsaje es la accin que hace un objeto Un mtodo es el procedimiento o funcin que se invoca para actuar sobre un objeto Un mtodo especifica cmo se ejecuta un mensaje
El conjunto de mensajes a los cuales puede responder un objeto se denomina protocolo del objeto Por ejemplo, el protocolo de un icono puede constar de
74
75
3..3. CLASES
Objeto
Mtodos
Figura 3 9
mensajes invocados por el clic de un botn del ratn cuando el usuario localiza
un puntero sobre un icono
Al igual que en las cajas negras, la estructura interna de un objeto est
oculta a los usuarios y programadores Los mensajes que recibe el objeto son
los nicos conductos que conectan el objeto con el mundo externo Los datos
de un objeto estn disponibles para ser manipulados slo por los mtodos del
propio objeto
Cuando se ejecuta un programa orientado a objetos ocurren tres sucesos,
Primero, los objetos se crean a medida que se necesitan Segundo, los mensajes
se mueven de un objeto a otro (o desde el usuario a un objeto) a medida que el
programa procesa informacin internamente o responde a la entrada del usuario Tercero, cuando los objetos ya no son necesarios, se borran y se libera la
memoria
L.a Figura 3 10 representa un diagrama orientado a objetos,
. . . - -.-
-- -
... .
..
Cool denadas
Objeto 2
/ Funcin
Figura 3.,10 Diagrama orientado a objetos
miembro
..
Cada vez que se construye un objeto de una clase, se crea una instancia de
esa clase Los objetos se crean cuando un mensaje de peticin de creacin se
recibe por la clase base
c l a s e Punto
Objeto 3
-.
Mtodos
Fijar
Leer x
Leer y
Obletos de la clase P u n t o
Mdtodos 1
Mdtodo, 2
Mtodos 3
obleto 1
obleto 2
objeto 3
76
77
En realidad, una clase es un tipo de dato definido por el usuario que determina las estructuras de datos y operaciones asociadas con ese tipo. Dicho de
otro modo, una clase es urza coleccin de objetos similares La definicin de una
clase no crea ningn objeto, de igual modo que la declaracin de variables
tampoco crea variables
type Punto =
X,Y
3.3.,2.Sintaxis
class Punto
int x int v:
public:
void fijarXY (int a , ~ n t
b)
(
x = a;
y = b:
(return x; 1
(return y;1
1;
Punto;
1
int leerX 0
int leerY 0
object
. Integer,
procedure operar,
end;
var p
int x;
int pesetas;
Punto P:
y el elemplo de un objeto P u n t o
78
79
3.4.1.
Definicin de objetos2
Nmero raciolzal
Estado (va101 actual)
Opeiaciones (sumar, multiplicar, asignar )
Vehculo
Estado (velocidad, posicin, precio ),
Operaciones (acelerar, frenar, parar, )
Colzjunto
Estado (elementos).
Operaciones (aadir, quitar, visualizar ),
Avin
Estado (fabricante, modelo, matrcula, nmero de pasajeros )
Operaciones (aterrizar, despegar, navegar )
3.4.2.
Identificacin de objetos
tos; es decir, qu cosas son objetos?; jcmo deducimos los objetos dentro del
dominio de la definicin del problema?
L.a identificacin de objetos se obtiene examinando la descripcin del problema (anlisis gramatical somero del enunciado o descripcin) y localizando
los nombres o clusulas nominales Normalmente, estos nombres y sus sinnimos
se suelen escribii en una tabla de la que luego deduciremos los objetos reales,
Los objetos, segn Shlaer, Mellor y CoadJYourdon, pueden caer dentio de
las siguientes categoras:
Cosas tangibles (avin, reactor nuclear, fuente de alimentacin, televisor,
libro, automvil).
Roles o papeles jugados o representados por personas (gerente, cliente,
empleado, mdico, paciente, ingeniero)
Organizaciones (empresa, divisin, equipo )
Incidentes (representa un suceso -evento- u ocurrencia, tales como vuelo, accidente, suceso, llamada a un servicio de asistencia tcnica )
Interacciones (implican generalmente una transaccin o contrato y relacionan dos o ms objetos del modelo: compras -comprador, vendedor,
artculo-, matrimonio -esposo, esposa, fecha de boda)
Especijkaciones (muestran aplicaciones de inventario o fabricacin: iefrigerador, nevera )
Lugares (sala de embarque, muelle de carga )
Una vez identificados los objetos, ser preciso identificar los atributos y las
operaciones que actan sobre ellos,
Los atributos describen la abstraccin de caractersticas individuales que
poseen todos los objetos
Matricula
Licencia del piloto
Nombre de avin
Capacidad de carga
Nmero de pasajeros
Nombre
Nmero de identificacin
Salario
Direccin
Nombre del departamento
Las operaciones cambian el objeto -su comportamiento- de alguna foima, es decir, cambian valores de uno o ms atributos contenidos en el objeto
Aunque existen gran nmero de operaciones que se pueden realizar sobre un
objeto, generalmente se dividen en tres grandes grupos3:
Operaciones que matnpulan los datos de alguna f o ~ m aespecfica (aadir,
borrar, cambiar formato )
Operaciones que realizan un clculo o proceso
' PRESSMAN,
Roger: 1izgeniei.a de1 rofrwaie Uii eofoque pi.dctico 3 " edicin McGraw-Hill, 1993
80
Operaciones que comprueban (inonztoizzan)un objeto frente a la ocurrencia de algn suceso de control
La identificacin de las operaciones se realiza haciendo un nuevo anlisis
gramatical de la descripcin del problema y buscando y aislando los verbos del
texto
81
Campos miembro
L.os objetos son entidades que existen en el tiempo; por ello deben ser creados o
instanciados (normalmente a travs de otros objetos) Esta operacin se hace a
travs de operaciones especiales llamadas constructores en C + + o inicializadores Estas operaciones se ejecutarn implcitamente por el compilador o
explcitamente por el prograinadol, mediante invocacin a los citados constructores
Funciones miembro
(zIIIr3
,
L,+
I
Interior
Exterior
Un campo se dibuja poi una caja rectangular, una funcin por un hexgono
largo Los campos y funciones se etiquetan con sus nombres Si una caja rectangular contiene algo, entonces se representa el valor del campo para el objeto
dibujado Los campos y funciones miembro en el interior de la caja estn
ocultos al exterior, que significa estar encapsulados El acceso a las caractersticas de los miembros (campos y funciones) es posible a travs del interfaz
del objeto En una clase en C + + , el interfaz se construye a partir de todas las
caractersticas que se listan despus de la palabra reserva gublic; puede ser
funciones y campos
La Figura 3 12 muestra el diagrama objeto del objeto "holamundo" Se
llama Saludol y permite acceder a su estado interno a travs de las funciones
miembro pblicas cambiar y anunciar El campo miembro privado contiene
el valor ~ s t eos saludo1
Saludol
S2
Visualizar
Las nolaciones de clases y objetos utilizada en esta seccin 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
83
rnove-hor
rnove-ver
Clase
);
Campo miembro
Funciones miembro
Esto significa que la ventana se reducir en tamao una cantidad dada por
5 filas y 6 columnas:
mensaje reducir
84
Programacin
orientada a objetos
85
Clase base
Caracteristica B
Caracteristica X
Caracteristica W
Clase derivada
Clase derivada
Clase derivada
3..5.HERENCIA
La encapsulacin es una caracterstica muy potente, y junto con la ocultacin
de la informacin, representan el concepto avanzado de objeto, que adquiere su
mayor relevancia cuando encapsula e integra datos, ms las operaciones que
manipulan los datos en dicha entidad Sin embargo, la orientacin a objetos se
caracteriza, adems de por las propiedades anteriores, por incorporar la caracterstica de herencia, propiedad que permite a los objetos ser construidos a
partir de otros objetos Dicho de otro modo, la capacidad de un objeto para
utilizar las estructuras de datos y los mtodos previstos en antepasados o
ascendientes. El objetivo final es la reutilizabilidad o reutilizacin (reu~ability)~,
es decir reutilizar cdigo anteriormente ya desarrollado
L.a herencia se apoya en el significado de ese concepto en la vida diaria As,
las clases bsicas o fundamentales se dividen en subclases Los animales se
dividen en mamferos, anfibios, insectos, pjaros, peces, etc La clase vehculo se
divide en subclase automvil, motocicleta, camin, autobs, etc El principio en
que se basa la divisin de clases es la jerarqua compartiendo caractersticas
comunes As, todos los vehculos citados tienen un motor y ruedas, que son
caractersticas comunes; si bien los camiones tienen una caja para transportar
mercancas, mientras que las motocicletas tienen un manillar en lugar de un
volante
Este trmino tambin se suele traducir por i.euialiilidad, aunque no es un trmino aceptado
por el Diccionario de la Real Academia Espaola
La herencia supone una clase base y una jerarqua de clases que contienen
las clases derivadas de la clase base Las clases derivadas pueden heredar el
cdigo y los datos de su clase base, aadiendo su propio cdigo especial y datos
a ellas, incluso cambiar aquellos elementos de la clase base que necesita sean
diferentes
No se debe confundir las relaciones de los objetos con las clases, con las
relaciones de una clase base con sus clases derivadas Los objetos existentes
en la memoria de la computadora expresan las caractersticas exactas de su
clase y sirven como un mdulo o plantilla Las clases derivadas heredan
caractersticas de su clase base, pero aaden otras caractersticas propias
nuevas
una
-.
-- ..- - . -.
-.
-1
---.
.. -
..
As, se puede decir que una clase de objetos es un conjunto de objetos que
comparten caractersticas y comportamientos comunes Estas caractersticas y
comportamientos se definen en una clase base Las clases derivadas se crean en
un proceso de definicin de nuevos tipos y reutilizacin del cdigo anteriormente desarrollado en la definicin de sus clases base Este proceso se denomina programacin por herencia Las clases que heredan propiedades de una clase
base pueden a su vez servir como definiciones base de otras clases Las jerarquas de clases se organizan en forma de rbol
86
3.5..1. Sintaxis
1
87
.:datos propios,
<funciones miembro propias>
En lenguaje Pascal orientado a objetos (versiones Turbo 5 5 a 7 O), la sintaxis de una clase (objeto en su terminologa) es:
tme
int x y;
public:
void hacerAlgo
1;
Se desea construir uii nuevo tipo derivado del tipo base existente, tal que el
tipo derivado sea idntico al tipo base, con una excepcin: extender base
aadiendo un mtodo llamado hacerotracosa Se construye una clase derivada En C++:
class derivada
public:
class base {
void hacerOtraCosa ( 1
1;
En Turbo Pascal,
derivada = object (base)
procedure hacerotracosa;
end;
Herencia simple
Herencia mltiple
En la Figura 3 16 se muestian grficamente las relaciones de herencia, aprecindose fcilmente los dos tipos (simple y mltiple)
A primera vista, se puede suponer que la herencia mltiple es mejor que la
herencia simple; sin embargo, como ahora comentaremos, no siempre ser as
88
Programac~norientada a objetos
89
Herencia simple
Base (01)
LOS MENSAJES
En los lenguajes de P O 0 -incluyendo Object-Pascal, Objective-C, Smalltalk y Acter- implementan slo herencia simple Eiffel y C + + (a partir de la
versin 2 O), por otra parte, soportan herencia mltiple,
En general, prcticamente todo lo que se puede hacer con herencia mltiple
se puede hacer con herencia simple, aunque a veces resulta ms difcil Una
dificultad surge con la herencia mltiple cuando se combinan diferentes tipos
de objetos, cada uno de los cuales define mtodos o campos iguales Supongamos dos tipos de objetos pertenecientes a las clases Grficos y Sonidos,y se
crea un nuevo objeto denominado Multimedia a partir de ellos Grficos
tiene tres campos datos: tamao, color y mapasdebits, y los mtodos
dibujar,cargar,almacenar y escala;sonidos tiene dos campos datos,
duracin, voz y tono, y los mtodos reproducir, cargar, escala y
almacenar As, para un objeto Multimedia,el mtodo escala significa poner
el sonido en diferentes tonalidades, o bien aumentar/reducir el tamao de la
escala del grfico
Naturalmente, el problema que se produce es la ambigedad, y se tendr
que resolver con una operacin de prioridad que el correspondiente lenguaje
deber soportar y entender en cada caso
En realidad, ni la herencia simple ni la herencia mltiple son perfectas en
todos los casos, y ambas pueden requerir un poco ms de cdigo extra que
represente bien las diferencias en el modo de trabajo
Una aplicacin Windows es un buen ejemplo de cmo se emplean los mensajes para comunicarse entre objetos El usuario pulsa un botn para enviar
(remitir, despachar) mensajes a otros objetos que realizan una funcin especfica Si se pulsa el botn Exit,se enva un mensaje al objeto responsable de
cerrar la aplicacin Si el mensaje es vlido, se invoca el mtodo interno Entouces se cierra la aplicacin,
90
91
Infor mncin especial necesaria para realizar el mtodo invocado (argumentos o parmetros requeridos)
sumar
10 X y Z "
--
Puenas
Edad
PreCiLcBl'o
Figura 3 20
Calcular precio ( )
l
3,,6,,2. Mensajes
Un mensaje es una peticin de un objeto a otro objeto al que le solicita ejecutar
uno de sus mtodos Por convenio, el objeto que enva la peticin se denomina
emisor y el objeto que recibe la peticin se denomina receptor,
- .I[_->
Prueba ( )
C ~ b j e t emisor
o
lJ--
Objeto receptor
Estructura de un mensaje
Un mensaje incluye el nombre de una operacin y cualquier argumento requerido por esa operacin Con frecuencia, es til referirse a una operacin por
nombre, sin considerar sus argumentos
Mtodos
Calcular-precio (100)
Producto
Figura 3 19
Cuando un objeto recibe un mensaje, se realiza la operacin solicitada ejecutando un mtodo Un nztodo es el algoritmo ejecutado en respuesta a la
recepcin de un mensaje cuyo nombre se corresponde con el nombre del
mtodo
La secuencia actual de acontecimientos es que el emisor enva su mensaje; el
receptor ejecuta el mtodo apropiado, consumiendo los par&metros; a continuacin, el receptor devuelve algn tipo de respuesta al emisor para reconocer
el mensaje y devolver cualquier informacin que se haya solicitado
-- .
. ..
El receptor responde a un mens;ijc...
- .
-
.... .
..
- .........
..
... -. . .... - - - - . .
92
93
3.6.3.
Abrit"-Il
Paso de mensajes
L.os objetos se comunican entre s a travs del uso de mensajes El interfaz del
mensaje se define un interfaz claro entte el objeto y el resto de su entorno
Esencialmente, el protocolo de un mensaje implica dos partes: el emisor y el
receptor Cuando un objeto emisor enva un mensaje a un objeto receptor, tiene
que especificar lo siguiente:
1
2
3
Mtodos
~~~~~
Objetos
3.7.1. Atributos
par6rnetroN)>
Ejemplo
enviar Coche1 P r e c i o C o c h e O
enva a Coche1 el mensaje Precio-Coche
enviar Cochel Fijarqrecio (8-10-92) enva a Cochel el mensaje Fijar-precio
con el parametro 8- 10-92
enviarcoche1 Poner-en-blanco0
enva a Coche1 el mensaje Poner-en-blanco
Atributos Servicios -
Figura 3 22
.. . .....
Alimento
3.7.
~~...
~~~~
(parmetrol,
~~.~
. ..
Clase
Un receptor
Un nombre de mensaje
Argumentos o parmetros (si se necesita)
~~~
. .....
.....
Los atributos describen el estado del objeto Un atributo consta de dos partes:
un nombre de atributo y un valor de atributo
Los objetos simples pueden constar de tipos primitivos, tales como enteros,
carcter, boolean, reales, o tipos simples definidos por el usuario Los objetos
complejos pueden constar de pilas, conjuntos, listas, array, etc, o incluso estructuras recursivas de alguno o todos los elementos
Los constructores se utilizan para construir estos objetos complejos a partir
de otros objetos complejos
3.7.2.
Mtodos
94
m
Objeto A
El mtodo-1 llama
al mtodo-2,
envindole
I
El mtodo-3
se invoca por
un mensaje
de otro objeto
3..8.CLASES
La clase es la construccin del lenguaje utilizada ms frecuentemente para
definir los tipos abstractos de datos en lenguajes de programacin orientados a
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 entidad que declara conjuntos de objetos similares En Simula, las clases se utilizaron 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 descripcin abstracta de
un grupo de objetos, cada uno de los cuales se diferencia por un estado especfico y es capaz de realizar una serie de operaciones
Por ejemplo, una pluma estilogrfica es un objeto que tiene un estado (llena
de tinta o vaca) que puede realizar algunas operaciones (por ejemplo escribir,
poner/quitar el capuchn, rellenar si est vacla)
En programacin, una clase es una estructura que contiene datos y procedimientos (o funciones) que son capaces de operar sobre esos datos Una clase
pluma estilogrfica puede tener, por ejemplo, una variable que indica si est llena
o vaca; 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 propsitos principales: definir
abstracciones y favorecer la modularidad
95
Instancia (objeto)
de la clase
Figura 3.,24 Una clase y una instancia (objeto) de la clase (Notacin Booch),
Clase
Horas
Frecuencia I>eicucnro
96
(Cuenta Ahorro)
Clase
97
Instancia
-- - .-.-
-. .
---
- - .-
-7
3..9.HERENCIA Y TIPOS
Los objetos con propiedades comunes (atributos y operaciones) se clasifican en
una clase De igual modo, las clases con propiedades y funciones comunes se
agrupan en una superclase Las clases que se derivan de una superclase son las
subclases.
Figura 3 2 6
Jerarqua de herencia
98
99
La herencia selectiva es la herencia en que algunas propiedades de las superclases 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 clase C puede hetedar selectivamente algunas propiedades de la superclase A
y algunas de la superclase D
Herencia mltiple
3.9.1.
En esta jerarqua cada clase tiene como mximo una sola supeiclase. La herencia simple permite que una clase herede las propiedades de su superclase en una
cadena jerrquica
Problemas
1
No hay problemas
Atributos
Nombre
Direccin
Campus
Curso
Ao
Atributos heredados
Nombre
Das-Vacaciones
Direccin
Curso
Salario
Campus
Estudios
Ao
Atributos
Nombre
Direccin
Estudios
Salario
Das-Vacaciones
Mtodo
Aumento Salario
~ t o d oheredados
s
Aumento-Salario
Conflictos de nombres
100
Conflictos de valores
Conflictos por defecto
Conflictos de dominio
Conflictos de restricciones
101
Por ejemplo,
Conflicto de nombres
Nombre
Nombre-estudiante
Valores
+ inyectores
lmpresora
matricial
Smalltalk
3
Lista de precedencia del usuario, y si no sucede as, la lista de precedencia de las clases por profundidad
Figura 3 30
3..9.3..
Clases abstractas
Con frecuencia, cuando se disea un modelo orientado a objetos es til introducir clases a cierto nivel que pueden no existir en la realidad pero que son construcciones conceptuales tiles Estas clases se conocen como clases abstractas
Una clase abstracta normalmente ocupa una posicin adecuada en la jerarqua de clases que le pe~miteactuar como un depsito de mtodos 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 informacin que es comn al grupo Sin embargo, las subclases de clases abstractas que corresponden a objetos del mundo
real pueden tener instancias
102
3.,11. SOBRECARGA
La sobrecarga es una propiedad que describe una caiacterstica adecuada que
utiliza el mismo nombre de operacin para representar operaciones similares
que se comportan de modo diferente cuando se aplican a clases diferentes Por
consiguiente, los nombres de las operaciones se pueden sobrecargar, esto es, las
operaciones se definen en clases diferentes y pueden tener nombres idnticos,
aunque su cdigo programa puede diferir
Si los nombres de una operacin se utilizan para nuevas definiciones en
clases de una jerarqua, la operacin a nivel inferior se dice que anula la operacin a un nivel ms alto
Un ejemplo se muestra en la Figura 3 33, en la que la operacin Incrementar est sobrecargada en la clase Empleado y la subclase Administrativo Dado que Administrativo es una subclase de Empleado, la operacin incrementar, definida en el nivel Administrativo, anula la operacin
correspondiente al nivel Empleado En Ingeniero la opetacin incrementar se hereda de Empleado Por otra parte, la sobrecarga puede estar situada
entre dos clases que no estn relacionadas jerrquicamente Por ejemplo, Clculo-Comisin est sobrecargada en Administrativo y en
Ingeniero Cuando un mensaje calcular-Comisin se enva al objeto
ingeniero,la operacin correspondiente asociada con ingeniero se activa,
><
103
Actualmente la sobrecarga se aplica slo a operaciones Aunque es posible extender la propiedad a atributos y relaciones especficas del modelo
propuesto
La sobrecaiga no es una propiedad especfica de los lenguajes orientados a
objetos Lenguajes tales como C y Pascal soportan operaciones sobrecargadas
Algunos ejemplos son los operadores aritmticos, operaciones de E/S y operadores de asignacin de valores
En la mayora de los lenguajes, los operadoies aritmticos +, y <e
se utilizan para sumar, restar o multiplicar nmeros enteros o reales Estos
operadores funcionan incluso aunque las implementaciones de aritmtica entera y real (coma flotante) sean bastante diferentes. El compilador genera cdigo
objeto para invocas la implementacin apiopiada basada en la clase (entero o
coma flotante) de los operandos.
As, por ejemplo, las operaciones de E/S (Entrada/Salida) se utilizan con
frecuencia para leer nmeros enteros, caiacteres o reales En Pascal readix)
se puede utilizar, siendo x un entero, un carcter o un real Naturalmente, el
cdigo mquina real ejecutado para leer una cadena de caracteres es muy
diferente del cdigo mquina para leer enteros readix) es una operacin
sobrecargada que soporta tipos diferentes Otros operadores tales como
los de asignacin (:= en Pascal o = en C) son sobrecargados Los
mismos operadoies de asignacin se utilizan para variables de diferentes
tipos
Los lenguajes de programacin convencionales soportan sobrecarga para
algunas de las operaciones sobre algunos tipos de datos, como enteros, reales y
caracteres Los sistemas orientados a objetos dan uiz poco ms en la sobrecarga
y la lzacen disponible para operaciones sobre cualquier tipo objeto,
Por ejemplo, en las operaciones binasias se pueden sobrecarga1 para nmeros complejos, arrays, conjuntos o listas que se hayan definido como tipos
estructurados o clases As, el operador binario <<+
n se puede utilizar pala
sumar las correspondieiites partes reales e imaginarias de los nmeros complejos Si ~l y A2 son dos array de enteros, se pueden definir:
Nombre
Empleado
para sumar:
= a
naci;n
Ingeniero
Beneficios
Calcular_Comisin = 0,05 * Presupuesto
Salario [40-801
Edad [25-651
Incrementar
CalcularComisin = 0.03 * Presupuesto
Figura 3 3 3 Sobrecarga,
A[i]
:=
Al[il + A2[il
//para todo i
104
Mtodo virtual
105
realiza en las subclases En este caso, por consiguiente, la seleccin del mtodo
se hace en tiempo de compilacin, pero el cdigo real del mtodo utilizado se
determina utilizando ligadura dinmica o tarda en tiempo de compilacin
Esto permite definir el mtodo de un nmero de formas diferentes para cada
una de las diferentes clases Consideremos la jerarqua de clases definida en la
Figura 3 34,
Aqu el mtodo virtual se define en la clase FIGURA y el cdigo procedimeutal real utilizado se define en cada una de las subclases CIRCULO, CUADRADO,
RECTANGULO y LINEA Ahora, si un mensaje se enva a una clase especfica, se
ejecuta el cdigo asociado con ella Esto contrasta con un enfoque ms convencional que requiere definir los procedimientos por defecto, con nombres diferentes, tales como Dibujar-crculo, Dibujar-cuadrado, etc Tambin se
requerir utilizar una llamada al nombre de la funcin especfica cuando sea
necesario
3..12.2.. Polimorfismo
La capacidad de utilizar funciones virtuales y ejecutar sobrecarga conduce a
una caracterstica 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
En el caso de un mtodo virtual se puede tener especializacin incremental
de, o adicin incremental a, un mtodo definido anteriormente en lajerarqua
Ms adelante volveremos a tratar este concepto,
Cdigo para
dibujar un circulo
Figura 3 34
2
Mtodos o funciones virtuales
106
107
Coche
tiene-un
c5
Motor
Objetos
compuestos
Un objeto compuesto
orden-compra
Un objeto coinpuesto consta de una colecciii de dos o ms objetos componentes Los objetos componentes tienen una relacin patt-of (parte-de) o component-of (coinpoizeizte-de) con objeto compuesto. Cuando un objeto compuesto
se instancia para producir una instancia del objeto, todos sus objetos componentes se deben instanciar al mismo tiempo Cada objeto coiilponente puede
se1 a su vez un objeto compuesto"
'
parte-de
Motor
Sistema frenos
Figura 3 3 6
parte_de
Sistema
transmisin
Articulo
Cliente
Artculo
Figura 3 38 Objetos compuestos (dos objetos orden-compra7)
Chasis
3.13.2.
Niveles de profundidad
Los objetos contenidos en objetos compuestos pueden, por s mismos, ser objetos compuestos, y este anidamiento puede ir hasta cualquier profundidad Esto
'
108
109
COCHE
atribvtos
Nmero_coches-vendidos
atributos compartidos
C o n c e s i o n a r i o : SEAT
Andaluca
atributos instancia
Modelo
Color
Precio
componentes
MOTOR
SISTEMA-FRENOS
SISTEMP-TRANSMISION
CHASIS
MOTOR
Figura 3 4 0
Atributos:
Nmero-cilindras
Potencia
Cilindrada
Vlvulas-cilindro
Tipo:
ABS:
Proveedor:
3.14.
Atributos:
Tipo:
Color:
Anidamiento de objetos,
Reutilizacin o reutzlizabilidad es la propiedad por la que el software desarrollado puede ser utilizado cuantas veces sea necesario en ms de un programa As
por ejemplo, si se necesita una funcin que calcule el cuadrado o el cubo de un
110
nmero, se puede crear la funcin que realice la taiea que el programa necesita,
Con un esfuerzo suplementario se puede crear una funcin que pueda elevar
cualquier nmero a cualquier potencia Esta funcin se debe guardar para
poderla utilizar como herramienta de propsito general en cuantas ocasiones
sea necesario
Las ventajas de la reutilizacin son evidentes El ahorro de tiempo es, sin
duda, una de las ventajas ms considerables, y otra la facilidad para intercambiar software desarrollado por diferentes programadores
En la programacin tradicional, las bibliotecas de funciones (casos de
FORTRAN o C) evitan tener que ser escritas cada vez que se necesita su uso
Ada y Modula-2 incorporan el tipo de dato paquete (package) y mdulo
(module) que consta de definicin de tipos y cdigos y que son la base de la
reutilizaciii de esos lenguajes
Otra propiedad importante de la programacin orientada a objetos es el polimoifisino Esta propiedad, en su concepcin bsica, se encuentra en casi todos
los lenguajes de programacin El polimorfismo, en su expresin ms simple, es
el uso de un nombie o un smbolo -por ejemplo un operador- para represental o significa1 ms de una accin As, en C, Pascal y FORTRAN -entre otros
lenguajes- los operadores aritmticos repiesentan un ejemplo de esta carac-
111
posicin2
donde las variables posicinl, posicin2 y o~igenrepresentan cada una posiciones de puntos, sobrecargando el operador ms (+) para realizar suma de posiciones de puntos (x, y) Adems de esta operacin de suma se podran realizar
otias operaciones, tales como iesta, multiplicacin, etc, sobrecargando coiivenientemente los operadores -, *, etc
En un sentido ms general, el polimorfismo supone que un mismo mensaje
puede producir acciones (resultados) totalmente diferentes cuando se reciben
por objetos diferentes. Con polimorfismo un usuario puede enviar un mensaje
genrico y dejar los detalles de la implementacin exacta para el objeto que
recibe el mensaje El polimorfisino se fortalece con el mecanismo de herencia
Supongamos un tipo objeto llarnado vehlculo y tipos de objetos derivados llamados bicicleta,automvil,moto y embarcacin Si se enva un
mensaje conducir al objeto vehculo,cualquier tipo que herede de vehculo
puede tambin aceptar ese mensaje Al igual que sucede en la vida real, el
mensaje conducir reaccionar de modo diferente en cada objeto, debido a que
cada vehculo iequiere una forma distinta de conducir
RESUMEN
E:l tipo abstiacto de datos se implementa a travs 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 nonibre, una coleccin de operaciones para manipular sus instancias y una representacin. Las operaciones que manipulan las instancias de una clase se llaman
nltodos El estado o representacin de una instancia se almacena en variables
de iiistancia Estos mtodos se invocan mediante el envo de mensaje,^ a instancias El envo de mensajes a objetos (instancias) es similar a la llamada a procedimientos en lenguajes de programacin tradicionales
112
El mismo nombre de un mtodo se puede sobrecargar con diferentes implementaciones; el mtodo I m p r i m i r se puede aplicar a enteros, arrays y cadenas
de caracteres La sobrecarga de operaciones permite a los programas ser extendidos de un modo elegante La sobrecarga permite la ligadura de un mensaje a
la implementacin de cdigo del mensaje y se hace en tiempo de ejecucin Esta
caracterstica se llama ligadura dinmica.
El polimoifismo permite desarrollar sistemas en los que objetos diferentes
pueden responder de modo diferente al mismo mensaje La ligadura dinmica,
sobrecarga y la herencia permite soportar el polimorfismo en lenguajes de
programacin orientados a objetos
Los programas orientados a objetos pueden incluir objetos compuestos,
que son objetos que contienen otros objetos, anidados o integrados en ellos
mismos,
Los principales puntos clave tratados son:
CAPITULO
LENGUAJES DE PROGRAMACION
ORIENTADOS A OBJETOS
CONTENIDO
4 1 Evolucin de los LPOO
4 , 2 Clasificacin de lenguajes orientados a objetos
4 , 3 Ada
4.4
Eiffel
4 5 Srnalltalk
4 6 . Otros lenguajes de programacin orientados a objetos
~
~~
RESUMEN
EJERCICIOS
114
41.
115
Ericapsulai~zientoy objetos, que agrupan juntos atributos de datos y acciones (mtodos) que procesen esos datos
Verificaciiz e~tticade tipos, que se realiza durante el proceso de compilacin para proporcionar seguridad en tiempo de ejecucin para la manipulacin externa de los atributos de los objetos
Clases, como plantillas o patrones de objetos
Hei encia, como medio de agrupar clases con propiedades comunes
Ligadula dininica (polimoifismoj, para permitir a las clases de objetos
que tengan iriterfaces idnticos y propiedades que se puedan intercambiar
La Figura 4 1 muestra la evolucin (qenealoaia) de los lenguaies de prorra. macin oiientados a objetos (LPOO).E= esta figura se muestra yue Simula-67
(Simula). inspir el desarrollo de Smalltalk,. aue es el verdadero vrimer lenguale
de programacin orientado a objetos.
Alan Kay cre Smalltalk-80 en Xerox PARC (Xerox Palo Alto Research
Park) con Adele Goldberg, que previamente haba trabajado con una implementacin de Simula Smalltalk es un lenguaje orientado a objetos pulo, todos es
A
Java
Figura 4 1
' Esta genealoga ha sido extrada y modificada ligeramente con lenguajes de los noventa, de:
Robert W Sebesta, Coriceptn of Progi.ai~i>ningLanguager Addison-Wesley, 2nd edil 1993
116
un objeto>>de una clase y todas las clases heredan de una nica clase base
denominada O b j e c t Smalltalk afirm el trmino mtodo para describir las
acciones realizadas por un objeto y el concepto de paso de mensajes como el
medio para activar mtodos Es tambin un lenguaje tipificado dinmicamente, que liga (enlaza) un mtodo a un mensaje en tiempo de ejecucin
Smalltalk ha sido, a su vez, el inspirador de un gran nmero de lenguajes
00 Entre ellos destaquemos Eiffel, Smalltalk-80, Smalltalk/V, C + + , Actor,
Objective-C y CLOS, as como extensiones 00 de lenguajes tradicionales, tales
como Object Pascal, Object COBOL, etc
Bertran Meyer, el diseador de Eiffel, fue tambin un usuario de Simula, e
incluso lleg a ser presidente de la Asociacin de Usuarios de Simula .Jean
Ichbiah, el diseador jefe de Ada-83, dirigi un equipo que implement un
subconjunto de Simula, y Bjarne Stroustrup, el diseador de C + + , utiliz
Simula y siempre ha agradecido su influencia en el diseo de C + +
Existen varias versiones y dialectos de Smalltalk: Smalltalk-72, -'74, -'76, -78,
-80, y ms recientemente -y seguramente la ms popular- Smalltalk/V de
Digitalk Smalltalk no es un lenguaje tipificado Smalltalk es extraordinariamente rico en conceptos orientados a objetos. En Smalltalk todo es un objeto,
incluyendo clases base y tipo base Esto significa que la potencia de Smalltalk,
como un entorno de programacin completo, se fundamenta en el envo de
mensajes a objetos
Otra caracterstica fundamental que diferencia a Smalltalk es su capacidad
de concurrencia La concurrencia es un aspecto del mundo real Por ejemplo, en
un entorno de oficina, secretarias, administrativos, gerentes y otros empleados
funcionan simultnea e independientemente Se comunican entre s, a travs de
conversaciones, informes, correo electrnico, etc Smalltalk emple la construccin denominada proceso para soportar concurrencia,
Durante la dcada de los ochenta, los conceptos orientados a objetos (tipos
abstractos de datos, herencia, identidad de objetos y concurrencia), Smalltalk,
Simula y otros lenguajes comenzaron a mezclarse y producir nuevos lenguajes
orientados a objetos, as como extensiones y dialectos El desarrollo de lenguajes
de orientacin a objetos en esa dcada se muestra en la siguiente clasificacin:
1
Extenscones, dialectos y ve?siones de Smalltalk Xerox y Textronix incorporaron en sus mquinas, a principios de los ochenta, la versin Smally compatibles,
Extelzsiones orientadas a objetos de lenguajes convencionales Uno de los
lenguajes orientados a objetos ms populares es C + + Este lenguaje
fue diseado por Bjarne Stroustrup en AT&T al principio de los ochenta [Stroustrup, 19861 La primera implementacin del lenguaje C + + se
lanz como un preprocesador a los compiladores C C + + proporcion
dos construcciones para definiciones de clases El primer mtodo es una
extensin de la construccin s t r u c t (estructura de C) y la otra nueva
construccin c l a s s (clase) C + + incorpor jerarqua de clases y permita subclases que podan acceder a mtodos y variables instancias de
4.1.1.
117
otras clases de su jerarqua El lenguaje C + + permita la ligadura dinmica y el polimorfismo, as como sobrecarga de funciones y operaciones
Sin embargo, al contrario que Smalltalk, las primeras versiones de C + +
no se comercializaban en bibliotecas grandes de clases predefinidas
Otro dialecto importante de C f , con propiedades orientadas a objetos, es Objective-C [Cox, 19871 Este lenguaje es un superconjunto
de C, que incorpora caractersticas orientadas a objetos de Smalltalk
Al igual que Smalltalk, Objective-C inclua una gran coleccin de clases
predefinidas que permita simplificar el proceso de desarrollo Objective-C soportaba tipos abstractos de datos, herencia y sobrecarga de operadores Sin embargo, al contrario que C + + , no ampliaba la definicin
de construcciones existentes en lenguajes, y dise nuevas construcciones
y operadores para realizar tareas tales como definicin de clases y paso
de mensajes L.as computadoras NEXT, cuyo xito iio pas de unos aos,
eligieron Objective-C como su principal lenguaje de desarrollo
Niklaus Wirt y un grupo de ingenieros informticos de Apple Computer disearon Object Pascal [Schmucker, 19861 Extendi el lenguaje
Pascal con soporte para tipos abstractos de datos, mtodos y herencia
Incluy el concepto de tipo de objeto y definicin de clases,
Los nuevos lenguajes Ada-95 y Java son totalmente orientados a
objetos
Lenguajes orientados a objetos,fuerteine~ztetipificados Simula fue uno de
10s lenguajes orientados a objetos que se desarrollaron en la dcada
de los ochenta y que fueron implementados en diversas plataformas
Otros lenguajes han emergido en la dcada de los ochenta, con
caractersticas fuertemente tipificadas (con verificacin estricta de tipos) Un lenguaje disponible comercialinente y ms interesante es Eiffel
[Meyer, 19881 de Interactive Software Engineering, Inc Adems de
encapsulamiento y herencia, Eiffel incorpora muchas caractersticas
orientadas a objetos, tales como tipos paraiiztricos y pre y post-condicioizes para mtodos Otro lenguaje fuertemente tipificado que soporta
conceptos orientados a objetos (abstraccin, objetos, tipos paramtricos) es Ada, aunque la versin Ada-83 presenta el inconveniente de no
sopor tar hereizcia
Exteizsioizes orientadas a objetos de LISP Existen diferentes versiones
de LISP, aunque la ms conocida y notable es CL.OS (Common List
Object System) CLOS es un lenguaje 00 que introduce notables mejoras y tiene garantizada larga vida, especialmente desde la creacin del
comit X3J13 de ANSI para la estandarizacin del lenguaje
118
Basado en objetos
Actor
Clipper 5 X
+\
+ clases
Basado en clases
+ herencia
Clu
/ Orientado a objetos /
C++
Eiffel
Simula
Smalltalk
Turbo Borland Pascal
Delphi
Visual Object
Obiect COBOL
119
da-95
Figura 4 2
Esta taxonoma de orientacin a objetos proporciona una definicin estiicta de los lenguajes de programacin orientados a objetos, que ha prevalecido
en la poca actual Segn esta taxonoma, no es suficieiite que un lenguaje
soporte la creacin de objetos; para ser considerado orientado a objetos, es
necesario que existan construcciones de creacin de clases y que soporten herencia adecuadamente
. .~.
C + + soporta la creacin de objetos y clases, as como herencia, y es poi
consiguiente totalmente orientado a objetos. Ada-83 soporta la creacin de
objetos mediante paquetes (tipos abstractos de datos) Un paquete en Ada no
WEGNER,P : The Ohject-Oiiented Clars$calioil Poiadigrii iri Rcsearch Di>ections ilz OhjecrOiieizted Piograrnrning pgs 508-510 MIT Press, Cambiidge, MA 1987
120
10
121
pasar seales entre mdulos, sin necesidad de tener que pasar realmente ningn dato
Polimorfismo. L.os lenguajes deben permitir que existan operaciones
con igual nombre, que se utilicen para manejar objetos de tipos diferentes en tiempo de ejecucin El polimorfismo se implementa, normalmente, en unin con la herencia
Excepciones Se deben poder detectar, informar y manejar condiciones excepcionales utilizando construcciones del lenguaje Esta propiedad aadida al soporte de tolerancia a fallos del software permitir
una estrategia de diseo eficiente
Concurrencia Es conveniente que el lenguaje soporte la creacin de
procesos paralelos independientes del sistema operativo. Esta propiedad simplificar la transportabilidad de un sistema de tiempo real de
una plataforma a otra
Persistencia. Los objetos deben poder ser persistentes; es decir, los
objetos han de poder permanecer despus de la ejecucin del programa
Datos compartidos. Los mdulos se deben poder comunicar mediante memoria compartida, adems del paso de mensajes
122
123
--
Lenguajes puros
Lenguajes hibndos
Mensajes
Mensajes
+
tradicional
* test
Devuelve
un puntero
al objeto test
Mtodo
definir
124
cace 'P' :
funcl0;
break;
cace ' * ' : func2 O :
break;
default : cout <iCdigo desconocido:' c < car <c endl;
y asigna a esa
i
case 'S'
426.
SalirO;
125
126
4.,3.. ADA
Un tipo abstiacto de dato paia iepresentar nmeros completos con diferenles tipos de operacines en Ada es:
Ada fue un lenguaje desarrollado a peticin de D O D (Departamento de Defensa de Estados Unidos) y como fruto de un concurso para disear un lenguaje de
programacin que sirviera para reducir el coste del desarrollo del software
Ada soporta conceptos orientados a objetos, tales como tipos abstractos de
datos, sobrecarga de funciones y operadores, polimorfismo paramtrico (geiiericidad) e iiicluso especializacin de tipos definidos poi el usuario El nico concepto que no implementa Ada es la herencia, aunque es posible emular un tipo
de herencia elemental Las propiedades orientadas a objetos se implementan de
la forma siguiente:
Encapsulamiento, mediante el uso de paquetes
Ocultacin de la informacin, mediante tipos de datos privados y privados
limitados Instancias de estos tipos de datos slo se pueden manipular por
los subprogramas especificados en el paquete que define los tipos de datos
privados; un tipo privado de Ada es un tipo abstracto de datos
Sobrecarga de operadores, funciones y procedimientos
Genericidad, mediante paquetes y subprogramas genricos
Herencia, aunque Ada no soporta la propiedad de la herencia, es posible
emular la pseudoherencia mediante la definicin de tipos de datos derivados, aunque no es posible tener propiedades adicionales de datos o modificacin de las propiedades de datos existentes
espe~ficaci6ndel paquete
end cnombre_pawete> ,
127
package Tipo-Complejo is
type complejo is private
function " + " (izda, dcha:complejo) return complejo;
function " - " (izda, dcha:complejo) return complejo;
function " * " (izda dcha:complejo) return complejo;
function 1 " (izda, dcha:complejo) return complejo;
function " - ' (dcha:complejo) return complejo;
private
type complejo is record
re:float : = O 0;
im:float : = O 0;
end record;
end Tipo-Complejo;
Los tipos privados peiiniteii que se definan nuevos tipos de datos, mientras
se oculta su implementacin real Al igual que otros tipos, los tipos privados
se declaran dentio de una especificacin de paquete Un tipo privado se declara en la parte visible de un paquete, pero la definicin real de su estructura
interna se especifica en la parte privada de la especificacin del paquete La
estructura del tipo definido en la parte privada es accesible slo dentro del
cuerpo del paquete
Las operaciones permitidas en tipos privados son asignacin, pruebas para
igualdad y desigualdad, y cualquier opeiacin definida explcitamente dentio
de la especificacin del paquete
Ada proporciona tambin una definicin de un tipo privado ms limitado,
denominado privado liinitado La diferencia principal es que el tipo privado
limitado no hereda automticaineiite operadores para asignacin y pruebas de
igualdad y desigualdad Una instaiicia de un tipo privado limitado slo se
puede copiar en, o compararlo con, otra instancia si las operaciones necesaiias
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
asignacin, de modo que una iinplementaciii de usuario de esta operaciii
para un tipo de dato privado limitado se ha de especificar como un procedimiento con iiombre
4.3.2.
Genericidad en Ada
128
Ada-83 no soDorta
Tambin se puede instanciar un procedimiento llamado intercambioEmpleado, que intercambia dos registros empleado:
procedure Intercambio-Empleado is new Intercambio(Emp1eado);
Ada-95 sooorta
1
Genericidad
Sobrecarga (no totalmente)
Verificacin esttica de tioos
Encapsulamiento
Ocultacin de la informacin
Herencia
Polimorfismo
Extensibilidad
Herencia
Polimorfismo
Extensibilidad
1
i
Figura 4 5
package Ejemplo i s
type otro_tipo-complejo
129
Complejo;
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 implementar cualquier operacin adicional o redefinida es a travs del uso de operaciones del tipo base; no existe en Ada el concepto de acceso protegido de C++
No es posible especificar nuevas propiedades de datos para un tipo derivado en Ada, y en consecuencia, todos los tipos derivados de un tipo base tienen
la misma representacin
El soporte de herencia de Ada no se puede utilizar para capturar abstracciones generalizadas, como un tipo de dato base abstracto (clase abstracta en
C+f ), de las que se puedan derivar tipos de datos abstractos Ada tampoco
soporta ninguna forma de ligadura dinmica ni de poliinorfismo
130
tersticas han sido prometidas por sus diseadores [Meyer, 19881 y en trabajos
posteriores Las caractersticas de Eiffel se resumen en la Tabla 41,
Tabla 4 . , 1 Caracteristicac de Eiffel
-
Ocultaciii de la iiiformacin
Herencia
Verificacin/ligadura de tipos
Polimorfismo
Recoleccin de basura
Persistencia
Concurreiicia
Genericidad
Biblioteca de objeios
S
S (simple y mltiple)
Tempiana
S
S
Pseudo-persistencia
Prometida
S
Pocas
Eiffel soporta conceptos de ingeniera de software tales como precondiciones, poscondiciones e invariantes de clases Estas caractersticas y las propias de
orientacin a objetos lo hacen muy til para construir, soportar y mantener
proyectos de software grandes
4.4.1 .
El entorno de programacin Eiff'el proporciona una biblioteca de clases predefinidas muy grande, Las clases predefinidas van desde clases de estructura de
datos, apoyo y de ncleo (Keiizel), hasta clases grficas que soportan puntos,
rectngulos, etc
La biblioteca de clases de grficos avanzados sopoita el sistema XWindow,
lo que permite al programador construir interfaces de usuaiio sofisticados
4.4.2.
El compilador Eiffel, un ho,jeador de clases (browser), un editor y las herramientas Jlat y shol t son las partes fundamentales del entorno de programacin
Eiffel.
El compilador Eiffel tiene una caractetstica de recompilacin automtica
Recompila slo aquellas clases que estn afectadas por un cambio El hojeados de clases permite el examen de clases en el contexto de sus jerarquas
(superclases y subclases), pudiendo visualizar las relaciones existentes entre
clases
La gestin de memoria en Eiffel se realiza p o ~el entorno de p~ograinacin
El espacio de ob.ietos se asigna cuando se crean objetos Eiflel proporciona
recoleccin automtica de basura Se coinprueba cuando un objeto se vuelve
obsoleto y libera su espacio asociado Eiffel soporta tambin un mecanismo de
manejo de excepcioiies
131
132
Una de las caiactersticas ms sobresalientes de Eiffel es soportar el concepto de coiltrato entre el proveedor (servidor) de una clase y el usuario de una
clase El proveedor o implementador de una clase es capaz de especificar, como
parte de la definicin de la clase en Eiffel, bajo qu condiciones los objetos de la
clase se comportan correctamente En Eiff'el, estas condiciones se expresan, de
la siguiente forma:
133
Clase
Supeiclase
Subclase
Variable de clase
Variable de instancia
Mtodo de una clase
Mtodo instancia
Clase
Clase base
Clase derivada
Campo miembro esttico
Campo miembro
Funcin miembro esttica
Funcin miembro
4.5.
SMALLTALK
S
Tardia
S
Pobre
S
No
Si
No
No
134
Figura 4 6
135
RESUMEN
El auge de las tecnologas de orientacin a objetos se ha debido fundamentalmente a la existencia y posterior popularidad de numerosos lenguajes de programacin orientados a objetos
En la dcada de los sesenta, los diseadores del lenguaje Simula introdujeron el concepto de objeto Conceptualmente, un objeto contena tantos datos
como operaciones que manipulaban esos datos Simula incorpor tambin la
nocin de clases que se utilizaban para describir la estructura y comportamiento de un conjunto de objetos Otra caracterstica importante soportada por
Simula fue la herencia de clases
Durante la dcada de los setenta y principio de los ochenta, los conceptos
de orientacin a objetos de Simula se pasaron a Smalltalk, uno de los lenguajes
orientados a objetos ms influyentes en el desarrollo de las tecnologas de
objetos Este lenguaje incorporaba muchas de las caractersticas orientadas a
objetos de Simula, incluyendo clases y herencia Pero Smalltalk aadi una
caracterstica muy notable: la incorporacin de un entorno de programacin
completo y un interfaz de usuario interactivo basado en mens,
Smalltalk es muy rico en conceptos orientados a objetos En Smalltalk todo
es un objeto, incluyendo clases y tipos base,
La taxonoina de lenguajes de Wegner clasificaba stos en basados en objetos, basados en clases y orientados a objetos
Los lenguajes basados en objetos ms populaies son Ada, Modula-2, Clipper 5-2 Los lenguajes basados en clases se agrupan en torno a Cla Los lenguajes orientados a objetos se clasifican en dos grandes bloques: puros e hibridos
Lenguajes orientados a objetos puros son Simula, Smalltalk y Eiff'el, y lenguajes orientados a objetos hbridos son Object Pascal (Turbo Pascal y Borland Pascal), Objective-C, Object COBOL, Overon, C + + , Delphi, etc
El lenguaje 00 hbrido por excelencia es C + + , aunque en los ltimos aos
estn apareciendo otros lenguajes hbridos que comienzan a competir con cierto xito, tales como Object COBOL, Visual Object, Visual BASIC 4, Delphi,
etctera
En los lenguajes 00 puros todo es un objeto, incluso las definiciones de
tipos, mientras que en los lenguajes hbridos no todo necesita ser un objeto
136
MODELADO DE OBJETOS:
RELACIONES
EJERCICIOS
4.1. Describa y justifique los objetos que obtiene de cada uno de estos casos:
a) Los habitantes de Europa y sus direcciones de correo.
Cules seran los objetos que han de considerarse en los siguientes sistemas?
a) Un programa para maquetar una revista
b) Un contestador telefnico
c) Un sistema de control de ascensores
d) Un sistema de suscripcin a una revista
4.3.
4.4.
Deducir los objetos necesarios para disear un programa de computadora que permita jugar a diferentes juegos de cartas
Dibujar un diagrama de objetos que represente la estructura de un coche
(cano) Indicar las posibles relaciones de asociacin, generalizacin y
agregacin
CONTENIDO
5 1 Relaciones entre clases
5,,2 Relacin de generalizacin/especializacin (is-a/es-un)
5 , 3 Relacin de agregacin (has-a/tiene-un)
5 . 4 Relacin de asociacin
5 5 . Herencia: jerarqua de clases
5 6 . Herencia repetida
RESUMEN
EJERCICIOS
138
Gerzeralizuci~z/especializaci6n(es-un).,
Agregacin (tndnlparte).,
Asociacin
139
(Mamfero )
Las relaciones se expresan frecuentemente utilizando verbos o frases verbales del lenguaje natural, tales como vive-ea, estudia-en, es-responsable-de
Figura 5 1 , Jerarquia de clases
Booch2, para mostrar las semejanzas y diferencias entre clases, utiliza las siguientes clases de objetos: flores, margaritas, rosas iojas, rosas amarillas y
ptalos Se puede constatar que:
Una margarita es un tipo (una clase) de flor
Una rosa es un tipo (diferente) de flor
140
141
es-un
Vehculo
carga
.
. .
es-un f-'\es-un
de pasajeros
wq
es-un f
t\ es-un
de pasajeros
Camin
L..
1
'
Figura 5 2
eado )
(.~studiante)
6
Vendedor
Figura 5 4
Relacin de generalizacin,
Programacin orientada a
142
Mamfero
objetos
Persona
Vehculo
es-un
es-un
Hombre
&
i
<5
es-un
Generalizacin
lnformtico
143
La jerarqua de generalizacin/especializacin tiene dos caractersticas fundamentales y notables Primero, un tipo objeto no desciende ms que de un
tipo objeto genrico; segundo, los descendientes inmediatos de cualquier nodo
no necesitan ser objetos de clases exclusivas mutuamente Por ejemplo, los
g e r e n t e s y los i n f o r m t i c o s no tienen porqu ser exclusivos mutuamente,
pero pueden ser tratados como dos objetos distintos; es el tipo de relacin que
se denomina gerieralizacii~mltiple,
Especializacin
&
e
es-un
Gerente
Empleado
Lt X
lnformtico
es-un/y
Oficinista
(a)
(c)
(b)
Programador
tiene
tiene
Habitacin
lnformtico
es-u/
tiene
Tejados
\es--
/ es-un
Puertas
/1
Ventanas
Paredes
144
145
0
Transmisin
Cuando se crea un sintagma de la clase (un objeto) 01, se crea una instancia
de la clase 02 (otro objeto) Cuando se destruye un objeto del contenedor 01,se
destruye otro objeto de 02
El objeto agregado COCHE5se compone de un MOTOR,una TRANSMISION,
--
146
i elaciiz
de genei alizaciiz
de agi egaciiz
es-u12
parfe-de
un-tipo-de
tiene-un
Las jerarquas complejas de objetos suelen consta1 de relaciones de agregacin y de generalizacin. Este es el caso de los dispositivos Avin que incluyen
en su jerarqua ambos tipos de relaciones
Avin
147
Una propiedad importante intrnseca a la relacin de asociacin o multiplicidad es la caidinalidad o inultiplicidad La multiplicidad es la propiedad que
expresa el nmero de instancias de una clase que se asocian o conectan con
instancias de la clase asociada Esta propiedad ya fue introducida por Chen
para definir el modelo entidad-relacin (E/R) Existen tres tipos de multiplicidad o cardinalidad:
Una a una
Una a muchas
Muchas a muchas
Una relacin una-a-una implica una relacin estrecha entre objetos Por
ejemplo, una relacin entre una clase Venta de un producto y la clase operacinTC que representa la operacin o pago de la venta mediante una t a ~ j e t ade
crdito
de carga
aterrizaje
Cabina
E
Boeing
Jumbo
Concorde
r;
.
-.
- --
- - . --
. .
Una relacin una a muchas se puede ver entre las clases PAIS y CIUDAD Un
pas tiene muchas ciudades, mientras que una ciudad slo pertenece a un pas
Una asociacin representa una dependencia semntica entre clases e implica la
direccin de esta dependencia En general, las asociaciones son bidireccionales,
aunque pudiesen ser unidireccionales si as se indica expresamente.
Una relacin de asociacin define una relacin de pertenertcia. Para encontrar relaciones de asociacin es preciso buscar frases tales como cpeitenece a,
es iniembro de, est asociado con, *trabaja para, etc
Juan Mackoy
trabaja-para
IBM
Ciudad
FIGURA
Punto
Las clases Venta y Articulo se enlazan tambin por una relacin unanzuchas Una venta puede constar de muchos artculos
148
,,
--'
Venta
...
,
.'1
\.-.'
- *
.-
n :'
,.. Articulas !
,
.. -----,
149
.-..s
tiene
Nombre
Direccin
identifica
1 n , 1-m
+
0,1, 0-1
n , m-n
una-a-muchas
M
Nombre
Direccin
una-a-muchas
Nombre
Direccin
opcionalidad
opcionalidad
muchas-a-muchas
Ventas
muchas-a-muchas
una-a-una
Figura 5 12
150
151
es-un
Polgono
es-un,
\aes-un
,
M
=
Elipse
-f es-un
152
..
- ..
. .
: Profesor
. ..
*.. Persona ;
(d)
..
.......
Figura 5 19
Figura 5 1 7
es-un 1
153
es-un
es-un
Subclase o
clase derivada
v Estudiante
( Robocop )
Figura 5.20
154
Estudiante
%e\
trabajador
general
[p]
Comida
Precio
Calorias
Fertilizar
Comprar
Comer
Guisar
li
Patata
Pelar
Cortar
Figura 5 22
155
La herencia mltiple es til en muchas situaciones Puede ayudar, fundamentalmente, a modelar objetos en su dominio del problema Una aplicacin muy
frecuente de la herencia mltiple se suele dar cuando se crea una nueva clase a
partir del comportamiento de dos o ms clases, incluso aun cuando fueran
desarrolladas independientemente unas de otras Un uso muy comn es aadir
persistencia6 a los objetos,
Otra ventaja apreciable es su alto grado de flexibilidad, simplicidad y elegancia en la definicin de nuevas clases que se crean a partir de clases existentes
La herencia mltiple favorece claramente la reutilizacin, por la razn importante que permite ms libertad en la definicin de nuevas clases a partir de
las existentes Esta construcciii permite crear jerarquas de clases completas
ms fcilmente, sin restringir las relaciones en las jerarquas de clases o casos
singulares. En este sentido, la herencia mltiple favorece un enfoque ms flexible para el diseo de aplicaciones
Adeins, la herencia mltiple facilita el cambio de la implementacin de una
clase, mientras deja inalterado su interfaz. De hecho, puede cambiar simplemente la parte de una clase que corresponda a una de sus clases base, heredando de una clase base diferente que realiza las mismas hncionalidades en diferentes formas, obteniendo, en consecuencia, una implementacin diferente de la
misma abstraccin
Sin embargo, hemos de reconocer que el uso generalizado de plantillas
templat te^) ha reducido significativamente las ventajas de la herencia mltiple
5,.5.,2..2 Inconvenientes de la herencia multiple
156
herencia a partir de clases con mtodos que tienen los mismos nombres pero
significados diferentes; es decir, se produce ambigedad Todo lenguaje que
soporte herencia mltiple ha de tener reglas propias para resolver esta ambigedad Otro inconveniente de la herencia mltiple es el aumento de tiempo
auxiliar que se aade a los programas.
La herencia mltiple est soportada por C + + , CLOS y Objective-C Sin
embargo, Object-Pascal, Turbo Pascal 5.51617 y Smalltalk no soportan esta
propiedad, aunque algunas versiones de Smalltalk tambin permiten esta caracterstica
5 5 . , 2 . , 3 Diseo de clases con herencia multiple
El diseo de una estructura de clases adecuada que implica herencia, especialmente herencia mltiple, es una tarea difcil Suele ser un proceso interactivo e incremental Dos problemas se suelen presentar cuando se manipula
herencia mltiple: jcmo resolver las colisiones de nombre de diferentes superclases? Y cmo manipular herencia repetida o herencia de ascendientes
comunes?
Las colisiones de nombres se producen cuando dos o ms superclases dif'erentes tienen el mismo nombre para algn elemento de sus interfaces, tales
como variables instancia y mtodos Y la herencia repetida se produce cuando
una clase es ascendiente de otra clase por ms de un camino Supongamos que
las clases empleado y estudiante tienen las estructuras de variables instancias que se muestran en la Figura 5 23
Estudiante
Direccin
Salario
157
Booch considera que existen bsicamente tres mtodos para resolver las
colisiones o choque de nombres:
Categora
Atributos: Nombr e
Edad
Estudiante
trabajador
Colisin
158
159
1
ProfesorAutor
u
Figura 526., Grafo de herencia repetida (una copia de la superclase)
160
EJERCICIOS
5.1.
Esta clase tiene el inconveniente de no detectar desbordamientos positivos o negativos de la pila En cousecuencia, se decide disear una nueva
clase PilaDer derivada de Pila, con las mismas funciones miembro
meter y s a c a r , pero que adviertan al usuaiio con mensajes de Pila
vaca o <<Pilallena cuando se intente sacar un elemento de una pila
vaca o meter un elemento en una pila llena Escribir programa que
gestione la pila con ambas clases
RESUMEN
161
c l a s s objgeom (
protected:
f l o a t x c . vc:
- .
public:
o b j q e o m ( f 1 0 a t x = O , f i o a t y =O) { xc = x ; y~ = y ; j
void vercentro O i cout << xC cc " " << yC << end; 1
);
miembros dato
(creacin protegida)
array de enteros
cima de tipo entero
funciones miembro:
s a c a r datos en la pila
pila
cima
162
Persona
Pacieizte
Empleado
nombre
direccin
ciudad
Leer ( )
visualizar(
nombre
direccin
ciudad
cdigo-diagnstico
telfono
fecha denacimiento
Leer ( )
visualizar ( )
enviar- factura
nombre
direccin
ciudad
cdigoempleado
horas -extras
compaade seguros
Leer ( )
visualizar ( )
enviar-salario
provee do^
Plarztilla
Everzlual
nombre
direccin
ciudad
cdigovendedor
saldo
fax
telfono
descuentos
Leer ( )
visualizar
pagar-factura ( )
datos de empleado
salario sumal
aos deantiguedad
pagarsalario
datos de empleado
honorarios/hora
pagar-salario ( )
5.6. Disear 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 visualizacin del nombre complemento Disear otra clase derivada direccin que toine la informacin
de nombre y aada calle, ciudad, provincia y cdigo postal Esta clase
debe tener acceso a las funciones pblicas de la clase base y tres funciones
miembro nueva-direccin, nuevo-nombre i ) y mostrar ( ) . Escribir un programa que cree un objeto de direccin,lea datos y visualice
la informacin
57. Disear una jerarqua de clases: Crculo, Cilindro y CilindroHueco En esencia, se puede decir que un objeto cilindro es un objeto crculo
con una altura, y un cilindro hueco es un cilindro con un espacio hueco
dentro de l La clase Crculo debe tener un dato Radio (tipo double)
y unas funciones miembro LeerRadio, Area y Circunferencia,que
obtienen el valor del radio y calculan el rea del circulo y la longitud de la
circunferencia Escribir un programa que permita crear objetos Crculo, Cilindro y CilindroHueco y calcule la longitud de la circunferencia y las reas del crculo, del cilindro y del cilindro hueco
Frmulas
Crculo
Longitud
Area
2 n
n j2
Cilindro
Area
Volumen
2 n 1 h+2 n
n r2 h
Cilindro hueco
Longitud
2 n (r2 i2iizteino) + 2 n
+ 2 n Ii interno
n ( r Z r2inteino) h
Volumen
1'
163