Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion Orientada A Objetos Luis Joyanes Aguilar
Programacion Orientada A Objetos Luis Joyanes Aguilar
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
McGraw-Hill
MADRID. BUENOS AIRES. CARACAS GUATEMALA LISBOA MEXICO NUEVA YORK PANAMA. SAN JUAN SANTAFE DE BOGOTA SANTIAGO. SAO PAULO AUCKLAND HAMBURGO LONDRES MllAN MONTREAL NUEVA DELHl PARIS SAN FRANCISCO. SIDNEY SINGAPUR ST LOUlS TOKIO TORONTO
Prlogo Parte 1 EL MUNDO DE LA ORIENTACION A OBJETOS: CONCEPTOS, RELACIONES, MODELADO Y LENGUAJES DE PROGRAMACION Captulo 1. El desarrollo de software
11
xvii
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 a en espaol, por DERECHOS RESERVADOS 01996, respecto a la p r i ~ edicin McGRAW-HILL/INTERAMERICANA DE ESPANA, S A Edificio Valrealty, 1 " planta Basauri, 17 28023 Aravaca (Madrid)
ISBN: 84-481-0590-'7 Depsito legal: M 30 121-1996
14 15
16 17
Editor: Jos Dominguez Alconchel Diseo de cubierta: Juan Garcia Compuesto e impreso en Fernndez Ciudad, S I
18 19
L.a complejidad inbeiente al software 1 1 1 La complejidad del dominio del problema .. 1 1 2 L a dificultad de gestionar el proceso de desarrollo 1 1 3 L a flexibilidad a travs del software La crisis del softwate . . Factores en la calidad del software . . 1 1 1 Razones fundamentales que estn influyendo en la imwortancia de la P O 0 Proeramacin v abstraccin El papel (el rolj de la abstraccin 1 5 1 La abstraccin como proceso natural mental 1 5 2 Historia de la abstraccin del software 1 5 3 Procedimientos ., 1 5 4 Mdulos , , 1 5 5. Tipos abstractos de datos 1.5 6 Objetos U n nuevo paradigma de programacin Orientacin a objetos 1 7 1 Abstraccin , , 1 7 2 Encapsulacin 1 7 3 Modularidad 1'7 4 Jerarqua 1 7 5 Polimorfismo 1 7 6 Otras propiedades Reutilizacin de software , . , , Lenguajes de programacin orientados a objetos 1 9 1 Clasificacin de los lenguajes orientados a objetos
vi
Contenido
Contenido
vii
1 10 Desarrollo tiadicioiial frente a oiientado a objetos 1 11 Beneficios de las tecnologas de objetos (TO) Resumen
25 27 29
Captulo 2
21
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 aolicaciii del TAD Pila -. . 6 . Otra . 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
~ ~~
.-
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
Captulo 3
31
12
33 34
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
43
Contenido
44
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
Diseos prcticos de clases 6.'7 1 Clases Reloj y Pre,seiltal . 6 8 Tcnicas de creacin e inicializacin de objetos 6 8 1 Objetos dinmicos neiv y delete 6 9 Inicializacin y limpieza de objetos 6 9 1 Uso de una clase , . . . 6 10 Reglas prcticas para construccin de clases 6 10 1 Funciones miembro . 6 10 2 Una aplicacin sencilla 6 10 3 Control de acceso a los miembros de una clase 610 4 Creacin, inicializacin y destruccin de objetos 6 11 El puntero this Resumen Ejercicios
67
Captulo 8 . Polimorfismo
81
, ,
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
91 92
x
93
Contenido
Contenido
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
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
11 5
321 323 324 325 326 326 327 328 328 329 329 331
Parte 111 DISENO ORIENTADO A OBJETOS Captulo 1 2 Diseo orientado a objetos (Notaciones Booch, Rumbaugli , , , , 335 y CoadlYonrdon) . , , , . , . . , , . . , . . . . . . , , . , . . . . . .
10 1 10 2
Desarrollo de un sistema orientado a objetos 12 1 1 Identifica1 clases y objetos 12 1 2 Asignacin de atributos y coinpoitamiento 12 1 3 Encontiar las ielaciones entre clases y objetos 12 1 4 Interfaz e implementacin de las clases 12 2 Notacioiies grficas . .. 12 2 1 Notacin de Booch'93 12 2 2 Notaciii de Yourdon .. . . . 12 2 3 Notacin de Rumbaugh (OMT) 12 3 Implementacin de clases y objetos en C + + 12 3 1 El modificado1 coiist , .. 12 4 Creacin de funciones mieinbro en C + + 12 4 1 Funcioiies iniiize . 1 2 4 2 Funciones miembro virtuales y virtuales pulas e 124.3 Variables miembro y accesibilidad 12 5 Implementacin de relaciones coi1 C + + 12 5 1 Relaciones de generalizacin-especializacin (es-un) 12 5 2 Relacin de agregacin/composicin (tiene-un) 12 5 3 Relacin de asociacin 12 5 4 Relacin utilizu ( u s e s ) 12 6 Clases abstractas , . 126 1 Abstraccin mediante plantillas 12'7 Una aplicacin orieiitada a objetos 12 7 1 Identificar las clases 12 7 2 Identificar relaciones . . , , 12 7 3 Definir el interfaz de cada clase Resumen Ejercicios
12 1
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 , , , , , ,
, ,
xiii
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
xiv
15 9
Contenido
Contenido
XV
15 10 15 11 15 12 15 13
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
Elementos del lenguaje A 1 1 Caracteres A 1 2 Comentarios A 1 3 Identificadores . A.14 Palabras reservadas A 2 Tipos de datos . , A 2 1 Verificacin de tipos . . A 3 Constantes A 3 1 Declaracin de constantes A 4 Conversin de tipos A 5 Declaiacin de variables A 6 Operadores A 6 1 Operadores aritmticos A 6 2 Operadores de asignacin A 6 3 Operaciones lgicos y relacionales A 6 4 Operadores de manipulacin de bits A 6 5 El operador rizeof , . , . A 6 6 Prioridad y asociatividad de operadores A 6 7 Sobrecarga de operadores A 7 Entradas y salidas bsicas A 7 1 Salida A'7 2 Entrada A 7 3 Manipuladores . . A 8 Sentencias A 8 1 Sentencias de declaracin A 8 2 Sentencias de expresin A 8 3 Sentencias compuestas A 9 Sentencias condicionales i j . . A 9 1 Sentencias ij-else anidadas , . A 9 2 Sentencias de alternativa mltiple: sivitch A 10 Bucles: sentencias repetitivas A 10 1 Sentencia while A 10 2 Sentencia do A 10 3 Sentencia for A 10 4 Sentencias bieak y coi~tinue A 10 5 Sentencia nula A 10 6 Sentencia returiz
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
, ,
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
El nuevo inodelo de objetos Mtodos de clases Definicin de mtodos Tipos de m6todos . Anulacin de un mtodo Self . , . . . . Especificadores de visibilidad de clases Construccin de un nuevo tipo derivado (Herencia) Ligadura esttica y dinmica Diseno de clases , , , , Reutilizacin
559
559 562 566 567 569
xvi
Contenido
Apndice E. Java: el lenguaje orientado a objetos de Internet. Gua de sintaxis 571 E 1 Caractersticas del lenguaje .Java 571 E 2 La sintaxis del lenguaje Java . . . . 572 E 3 Caractersticas eliminadas de C y C++ 5 76 E 4 Los objetos 578 E 5 Herencia de clases 582 E 6 Intertaces 584 E 7 Paquetes 585 E 8 Excepciones 587 58'7 E 9. Bibliografa E 10 Fuente de informacin en Internet 588
, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
PROLOGO
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
Apndice F. Sobrecarga de operadores en C + + F 1 Conceptos generales . . . F 2 Sobrecarga de operadores unitarios F 3 Sobrecarga de operadores binarios . F 4 Sobrecarga de operado~es de inse~ciny extraccin . F 5 Conversin de datos y operadores de conversin forzada de tipos F 6 Sobrecarga de new y delete: asignacin dinmica F 7 Manipulacin de sobrecarga de operadores F 8 Una aplicacin de sobrecarga de operadores F 9 Resumen
, , , , , ,
589 589 597 603 610 614 618 621 623 625
Apndice G
G1 G2 G3 G4 G5
Metodologa de anlisis y diseo orientados a objetos. Notaciones 626 Booch'93 626 OMT (Rumbaugh et a l ) 629 Coad/Yourdon 633 Notacin de R Edge 636 Notacin de 'iaylor 640 642 651 653
xviii
Prlogo
Prlogo
xix
Las clases se organizan pala modelar el mundo real en las siguientes ielaciones:
e
clase Otra visin de la clase es que un tiempo de ejecucin tiene un estado, un comportamiento y una identidad El entorno orientado a objetos oculta los detalles de implementaciu de un objeto Es la propiedad conocida como ocultacin de la informacin La parte que no est oculta de un objeto es su interfaz pblico, que consta de los mensajes que se pueden enviar al objeto L.os mensajes representan operaciones de alto nivel, tales como dibujar un crculo El trmino encapsulamiento se utiliza tambin para enfatizar un aspecto especfico de un tipo abstracto de datos Un I A D combina mtodos (opeiacioizes) y representacin interna (i111pleiizentacin), Un objeto es una instaizcia -ejeinplar o caso- de una clase que encapsula operaciones y representacin Este encapsulamiento contrasta con la separacin tradicional de operaciones (funciones) y representacin (datos) La clase en C + + y el paquete en Ada-95 soportan el eucapsulamiento
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
xx
Prologo
Prlogo
xxi
piado, y se necesita retroceder y volver a reiterar el proceso sucesivamente Se pueden descubrir especificacioiles adicionales que no se conocan al comenzar su trabajo iriicial y encontrar que los atributos o comportamiento de un objeto sean diferentes de lo que se decidi en la etapa de anlisis De cualquier forma, el mejor medio para practicar desarrollo de software orientado a objetos es realizar el anlisis y diseo de ejemplos de todo tipo Por esta causa, en el libro se incluyen numerosos ejemplos que tratan de ayudar al lector a familiarizarse con la P O 0 L.a fase de diseo conduce a la fase de iinplementacin, que consiste en traducir dicho diseo en un cdigo real en un lenguaje de programacin 00 La fase de codificacin del proceso de desarrollo 00 se llama programacin orientada a objetos (POO). El proceso de desarrollo orientado a objetos supone, en sntesis, la construccin de un modelo del mundo real que se pueda traducir posteriormente en un cdigo real escrito en un lenguaje de programacin 00 En realidad, las tres fases, anlisis, diseo y programacin, interactan entre s L.as decisiones de progiamacin pueden cambiar algunos aspectos del modelo o pueden refinar lealmente algunas decisiones anteriores Los objetos pueden cambiar, o incluso modificarse o deducirse de otros objetos; atributos y comportamiento se pueden tambin modificar o aadir a cada objeto En resumen, el anlisis, diseo y programacin no constituyen un proceso nico de tres etapas para la resolucin de un problema, sino que todas las etapas interactan entre s para resolver los problemas del mundo real Sin embargo, como regla general, el anlisis se debe hacer antes del diseo, y ste se ha de hacer antes de la programacin o codificacin
base, que se recogen en el momento oportuno y en la bibliografa, y que recomendamos como lecturas notables y excelentes, as como referencia obligada de todo buen estudioso de las tecnologas de objetos
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:
C + + es esencialmente un superconjunto de C ANSI, C + + tiene las mismas caractersticas de tipificacin que C ANSI para propiedades no 00 Los compiladores de C + + aceptan normalmente cdigo escrito en la versin original de K&R (Kernighan y Ritchie) Generalmente, los co111piladores de C + + propoicionan mensajes de error o advertencia cuando el cdigo C no tiene prototipos Desde el punto de vista especfico de sintaxis, algunas caracteristicas de C han sido mejoradas notablemente:
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
Las constantes #define y las macios han sido sustituidas por el calificador const y las funciones inline Identificadores de tipos en tiempo de ejecucin Espacios de nombre
L.as piincipales diferencias entre los diversos compiladores de C + + son, adeins del precio, entornos integrados de desarrollo (editores, depuradores, etc ), velocidad de compilacin, velocidad del cdigo ejecutable, sistema en tiempo de ejecucin, calidad de mensajes de error e interoperabilidad de cdigo con otro software: tales como sistemas operativos, sistemas de ventana, enlazadores u otros programas de aplicacin Otras diferencias incluyen soporte para inanejadores de excepciones y plantillas (templates) La mayora de los compiladores actuales proporcionan soporte para ambas propiedades Los manejadores (haizdleis) de excepciones son construcciones que permiten a los programas recuperar su control ante eirores en tiempo de ejecuciil no previstos Las plantillas permitirn a las clases ser definidas mediante tipos genricos de datos
dariracin de la versin 3 0, actualmente en fase de estandarizaciii por el comit ANSI Como C + + es una extensin del C estndar, la mayoila de los progiamas C se pueden compilar utilizando un compilador C + + L.a versin actual estandarizada por ANSI -la citada actualizacin 3 0es la que soportan la mayora de los fabricantes mundiales: Borland, Microsoft, Watcom, AT&T, etc., en sus ltimas actualizaciones tales como 4,515 de Borland, Visual C + + 4, la 10 de Watcom, etc
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 inmediatamente superior o el lenguaje C + + se supondra que era una ve~sin 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~rrs y 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
versin Ada-95, y se han lanzado al mercado otros lenguajes de objetos hbridos: Object Pascal, Object COBOL, Delphi, Visual BASIC 4 -con ciertas caractersticas de objetos-, Visual Object, etc Los lenguajes puros clsicos como Eiffel y Smalltalk luchan por hacerse un hueco en el mercado profesional, saliendo de los laboratorios de investigacin y universitarios hacia el mundo profesional Internet, el fenmeno social y tecnolgico de la dcada de los noventa y del futuro siglo XXI, ha trado el advenimiento de Java un lenguaje 00 evolucionado de C + + que la empresa Sum lanz el ao pasado y que promete conveitirse en un duro competidor de C + + Teniendo presente el estado del arte de la ingeniera de software orientada a objetos y nuestra experiencia peisonal en el Departamento de Lenguajes y Sistemas Inf'ormticos e Ingeniera de Software de la Universidad Pontificia de Salamanca en Madrid, donde hemos impartido numerosos cursos de progiamacin, anlisis y diseo orientados a objetos, as como otros cursos, seminarios y conferencias en otras universidades espaolas y latinoamericanas y en empresas informticas inultinacionales y escuelas de la administracin pblica espaola, hemos considerado los numerosos consejos, sugerencias y crticas de alumnos y colegas, y como resultado hemos escrito un contenido para esta obra que contiene los conceptos vitales de las tecnologas de objetos que confiamos permitan una progresin y aprendizaje rpido y eficiente por parte del lector en el inundo de la programacin orientada a objetos Para cumplir estos objetivos, pensamos que sera muy interesante mezclar con el mximo de prudencia conceptos fundamentales tales como:
Tipos abstractos de datos Clases y objetos Relaciones de objetos: generalizaci6n/especializacin, Herencia Modelado de objetos, Diseo orientado a objetos Fundamentos de reutilizacin de software con objetos Bibliotecas de clases,
As pues, la obra considera los conceptos terico-prcticos importantes de la programacin orientada a objetos, junto con los mtodos correspondientes de codificacin en C + + El contenido del libro se ha diseado de modo que pueda permitir al lectoi ya iniciado en objetos y/o C + + , y al no iniciado adentrarse en el mundo de los objetos de un modo gradual y con la mayor eficacia posible, Para ello se ha pensado que el mejor mtodo podra ser ensear al lectoi las tcnicas de modelado del mundo real mediante objetos, de modo que cuando se tuviera el modelo idneo se pudiera pasar fcilmente a la codificacin de un programa que resolviera el problema en cuestin Para conseguir estos objetivos hemos credo conveniente hacer uso no slo de los conceptos tericos ya mencionados, sino recurrir a una herramienta grfica que facilite al lector realizar el anlisis y diseo previo a la programacin que redunde en el mayor grado de eficiencia por parte del progr amador
xxvi
Prologo
Prlogo
xxvii
Iierencia repetida; el captulo se termina con una aplicacin prctica El Captulo 8 presenta la propiedad de polimorfismo, junto con el concepto de ligadura El Capitulo 9 describe las plantillas (te~nplater) y muestra el concepto de genericidad; examina la sintaxis para declarar plantillas de funciones y de clases, as como la definicin de sus funciones miembro y el modo de instanciai las clases El Captulo 10 presenta el concepto de excepcin, junto con su manejo o manipulacin (eirores en tiempo de ejecucin), y examina el mtodo empleado por C + + para lanzar y capturar excepciones; se describe la sintaxis de C + + para implementar estas operaciones y muestra cmo manejar excepciones El Captulo 11 describe la reutilizacin de software con C + + y los diferentes mtodos einpleados para ello Asimismo, se describen las bibliotecas y contenedores de clases La Parte 111 incluye el transcendental Capitulo 12, que describe los principios para el desarrollo orientado a objetos y especialmente su diseo Se describen las notaciones grficas de las metodologas Booch, YourdonJCoad y Ruinbaugh (OMT), junto con las reglas prcticas para la implementacin con C + + de las diferentes relaciones entre clases; se incluye una pequea aplicacin orientada a objetos L.a Parte IV El lenguaje C + + : Sintaxis, construccin y puesta apunto de programas contiene los Captulos 13 a 15 El Captulo 13 describe las caractersticas ms sobresalientes de C + + que lo diferencian de C en el sentido de mejorarlo y ampliarlo. El Captulo 14 explica un sistema pictico para construir programas en C/C++ junto con el concepto de programas multiarchivos y el sistema para construir arcliivos proyecto La puesta a punto de programas en C + + se explica en el Captulo 14; en este captulo se dan reglas picticas para depurar programas con una extensa enumeracin de errores tpicos en el desarrollo de programas Aunque el lenguaje base del texto es C + + se pretende que el lector pueda codificar fcilmente los conceptos fundamentales de objetos y comenzar el aprendizaje de la P O 0 con otros lenguajes Por esta causa los Apndices A a E incluyen guas de referencias de sintaxis de los lenguajes C + + , Delphi, TuiboJBorland Pascal, Ada-95 y lava -el nuevo lenguaje orientado a objetos de Interrzet- El Apndice F explica un concepto importante y especfico de C + i : la sobrecaiga de operadores L.a serie de apndices se coinpleta con el Apndice G, que contiene sntesis de las notaciones grficas de las metodologa~ de anlisis y diseo oiieiitadas a objetos ms populares y usadas en el libro Estas iiotacioiies se han extrado de las fuentes originales de las metodologa~utilizadas: Booch'93, OMT (Rumbaugh et al) y Coad/Yourdon Por ltimo, se incluye un glosario de trminos de objetos que facilitan la comprensin del lector La bibliografa contiene los libros consultados por el autor en la escritura de la obra, incluyendo los libros base de las metodologas de A 0 0 y D O 0 utilizadas en el libio,
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
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
PARTE
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
La dcada de los noventa ser, sin lugar a dudas, la dcada de la programacin orientada a objetos Como Rentsch predijo, la programacin orientada a objetos ser en los ochenta lo que la programacin estructurada fue en la dcada de los setenta. En la actualidad la programacin orientada a objetos se ha hecho enormemente popular Escritores y diseadores de software, junto a compaas importantes en el campo del software, se dedican de modo continuo a producir compiladores de lenguajes, sistemas operativos, bases de datos, etc, orientados a objetos Qu es la programacin orientada a objetos? Por qu es tan popular? La programacin orientada a objetos es algo ms que una coleccin de lenguajes de programacin, tales como Smalltalk, Object Pascal, C++, etc Se podra decir que este tipo de programacin es un nuevo medio de pensar sobre lo que significa computar (computadorizar), es decir, cmo se puede estructurar informacin en un computador
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
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
Los cambios iealizados en la evolucin de un progiama son el punto dbil de los mtodos tradicionales de desarrollo de software, siendo paradjicamente uno de los puntos fuertes de los mtodos de desarrollo de software orientado a objetos En 1986, Fredrick P Brooks', en un famoso artculo, apuntaba que en los ltimos diez aos no se haba pioducido ningn progreso significativo en el desarrollo de software, y analizaba ciiticamente todas las tecnologas ms piometedoras Aunque l confesaba que tena ms confianza en la prograiilacin orientada a objetos que en cualquiei otra tecnologa, mantena dudas sobre sus ventajas efectivas Recientemente, las propuestas de reusubilidud o i eulilizacin, reusability,de coinponeilles soJtiva~e,se considera11 como bloques iniciales para la construccin del prograina, de modo siinilar a la conslruccin de cualquier objeto complejo (tal como un automvil) que se construye ensamblando sus partes En respuesta al artculo de Brooks, Brad Cox2, el inventor de Objective-C, public un artculo en el que esencialmente rebata las tesis de Biooks: Existe una bala de plata Es un arma tremendaineiite potente, impulsada poi vastas fueizas ecouniicas a la aue nuevos obstculos tcnicos slo pueden resistii brevemente La bala de plata es uii cambio culru~ulen lugar de un cambio tecnolgico Es un nuevo paiadigma; una revoluciii industrial basada en partes ieutilizables e intercambiables que modificain el universo del software, de igual modo que la revolucin industrial cambi la fabricacin Por consiguiente, la P O 0 (Prograinacin Orientada a Objetos) no slo son nuevos Ieilguajes de piogramacin, sino un nuevo modo de pensar y diseilai aplicaciones que puede11 ayudar a resolver pioblemas que afectan al desaiiollo del software Sin embargo, el lenguaje debe ser capaz de soportar el nuevo paradigma, siendo por consiguiente uiia parte esencial de esta ievolucin
Muchos investigadores sugiere11que los costes de software requieren ms de la mitad de los costes y recursos globales en el desarrollo de software Implernentacin Depuracin
7%
Anlisis
15 %
Eficiencia
La eficiencia del software es su capacidad pala hacer u11 buen uso de los recuisos que manipula
Mantenimiento
67 %
Figura 1 2
Bnoo~s, Fredeiik P li : N o Silvei Bullet~, Coiiipurei 10-19, abril 1986 Cox, Biad J : Thei-e is a Silver Bulleta, Bi,te 209-218, octubre 1987
El desarrolio de software
Transportabilidad portabilidadl
La transportabilidad o portabilidad es la facilidad con la que un software puede ser tiansportado sobre diferentes sistemas fsicos o lgicos
Verificabilidad
L.a verificabilidad es facilidad de verificacin de un softwaie; es su capacidad para soportar los procedimientos de validacin y de aceptar juegos de test o ensayo de programas
Integridad
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
Facilidad que tienen los productos de adaptarse a cambios en su especificacin Existen dos principios fundamentales para conseguir esto: diseo simple; descentralizacin
Reutilizacin
Capacidad de los productos pata ser reutilizados, en su totalidad o en parte, en nuevas aplicaciones
Compatibilidad
10
E l desarrollo de software
11
Sin embargo, la relacin entre abstraccin y lenguaje de programacin es doble: poi un lado se utiliza el lenguaje de programacin para escribir un programa que es una abstraccin del mundo leal; por otro lado se utiliza el lenguaje de progiamacin para desciibir de un modo abstracto el comportamiento fsico de la computadora que se est utilizando (por ejemplo utilizando nmeros decimales en lugar de nmeros binarios, variables en lugar de celdas de memoria direccionadas explcitamente, etc) En la dcada de los cincuenta, el nico mecanismo de abstraccin era el lenguaje eiisan~blador y de mquina, que ofreca la posibilidad de utilizar nombres simblicos para representar celdas de memoiia Posteriormente, los lenguajes de alto nivel ofrecieion un nuevo nivel de abstraccin El arte de la prograiilaciiz es el mtodo por el que se describir a una computadora (mediante un lenguaje de prograinacin) un fenmeno, una accin, un comportamiento o una idea
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
El desarrollo de sotware
13
alienta el uso de abstracciones de contiol, tales como bucles o sentencias if-then, que se han incorporado en lenguajes de alto nivel Estas sentencias de control permitieron a los programadores abstraer las condiciones comunes para cambiar la secuencia de ejecucin El proceso de abstraccin fue evolucionando desde la aparicin de los primeros lenguajes de programacin El mtodo ms idneo para controlar la complejidad fue aumentar los niveles de abstraccin En esencia, la abstraccin supone la capacidad de encapsular y aislar la informacin del diseo y ejecucin En un determinado sentido, las tcnicas orientadas a objetos pueden verse como un producto natural de una larga progresin histrica, que va desde las estructuras de control, pasando por los procedimientos, los mdulos, los tipos abstractos de datos y los objetos En las siguientes secciones describiremos los mecanismos de abstraccin que han conducido al desarrollo profundo de los objetos: procedimientos, mdulos, tipos abstractos de datos y objetos
otros piopsitos En Pascal existe el mbito local y global Cualquier mbito que permite acceso a los cuatro procedimientos debe permitir tambin el acceso a sus datos comunes Para iesolver este problema se ha desarrollado un mecanismo de estructuracin diferente
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
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
14 1 2
Programacion
orrentada a objetos
El desarrollo de software
15
3
4
Exponei una definicin del tipo Hacer disponible un conjunto de operaciones que se puedan utilizar para manipular instancias de ese tipo Protegei los datos asociados con el tipo de modo que slo se pueda actuar sobre ellas con las rutinas proporcionadas Hacei instancias mltiples del tipo
L.a pei ti~teizciase refiere a la permanencia de un objeto, esto es, la cantidad de tiempo para el cual se asigna espacio y permanece accesible en la memoiia del computador
Los mdulos son mecanisinos de ocultacin de informacin y no cumplen bsicamente ms que los apartados 2 y 1 Los tipos abstractos de datos se implementan con iiidulos en Modula-2 y paquetes en CL.U o Ada
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
I I
Persistencia Polimotiismo Genericidad Entidades bsicas Mtodos Instancias Jerarqua
No existe ningn estilo de progiainacin idneo para todas las clases de programacin La orientacin a objetos se acopla a la simulacin de situaciones del mundo real En POO, las entidades centrales son los objetos, que son tipos de datos que encapsulan con el mismo nombie estructuras de datos y las opeiaciones o algoritmos que maiiipulan esos datos
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)
Una idea fundamental es la coinunicacin de los objetos a travs de paso de iizeizsajes Adems de esta idea, se aaden los mecanismos de heienciu. 11 polimorfisiizo L.a herencia peimite diferentes tipos de datos para compartir el mismo cdigo, peimitiendo una reduccin en el tamao del cdigo y un incremento en la funcionalidad El polimorfismo permite que un mismo mensaje pueda actuar sobre objetos diferentes y comportarse de modo distinto
' '
16
El desarrollo de software
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
f1--
1-
Benjainin/Cumrnings,
18
El desarrollo de soiware
19
1.,7..2. Encapsulacin
La eiicapsulaciii o eiicap~ulaiizieiito es 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~dulos se 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
L,asje~arquas de generalizacin/especializacin se conocen como herencia Bsicamente, la herencia define una relacin entre clases, en donde una clase comparte la estructura o compoitamiento definido en una o ms clases (hereizcia sii~zple y hereizcia iizltiple, respectivamente). L.a agregacin es el concepto que permite el agrupamiento fsico de estructuras relacionadas lgicamente As, un camin se compone de ruedas, rnotoi, sistema de transmisin y chasis; en consecuencia, camin es una agregacin, y ruedas, motor, transmisin y chasis son agregados de camin
1.7.4. Jerarqua
L.a jeiarqua es una propiedad que pei~nite una 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
21
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
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
\
C L U
\/
Ada
Pascal ' X
/ Smalltalk
Actor
Objet Pascal
\\\ / 1
Simula
Y
1 "--1
Orientados a objetos
Figura 1 6
BASlC
1.a clasificacin de Wegnei divide los lenguajes en tres categoras: 1 2 Lenguajes basados en objetos que soportan objetos Es decir, disponen de componentes caracterizados por un coi~junto de operaciones (coinportamiento) y un estado Lenguajes basados en clases que implican objetos y clases Es decir, disponen de componentes tipo clase con operaciones y estado coinii
objective.c
c++
Visual BASlC 3
i 4 Visual BASlC
Figura 1 5
WEGNEK, Petel [1987]: Di~iieiisioiiso j Objecr-Baied Laiiguajer Desigii Nmero especial de SIGPLAN Noti~ev
24
El desarrollo de soffware
25
Una clase de un objeto se construye con un iizte?faz que especifica las operaciones posibles y unecuerpo que implementa dichas operaciones Lenguajes orientados a objetos que adems de objetos y clases ofrecen mecanismos de herencia entre clases Esto es, la posibilidad de derivar operaciones y atributos de una clase (superclase) a sus subclases
cuyos complementos configuran, de liecho, una nueva clasificacin En este sentido, los criterios recogidos por este autor son los siguientes: L.a modularizacin de los sistemas ha de realizarse mediante estructuras de datos apropiadas. 2 Los objetos se describen como la implementacin de tipos abstractos de datos 3 La memoria se gestiona (administra) automticamente 4 Existe una correspondencia entre tipos de datos no elementales y clases 5 Las clases se pueden definir como extensiones o restricciones de otras clases ya existentes mediante herencia 6 Soportan polimorfismo y ligadura dinmica 7 Existe herencia mltiple y repetida De acuerdo con los criteiios de Meyer, recogemos en IaTabla 1 1 el cumplimiento de dichos criterios en los lenguajes 00 y basados en objetos ms populares
La definicin anterior, pese a su antigedad, sigue teniendo vigencia Existen otias clasificaciones similares, pero con la inclusin de la propiedad de polinzorfisino en la categora 1, como requisito para ser lenguaje orientado a objetos De cualquier forma, hoy en da es posible ampliar esa clasificacin de acuerdo a criterios puramente tciiicos y hacer una nueva clasificacin de la categora 3:
31
Lenguajes orieiztados a objetos puros Soportan en su totalidad el paradigma de orientacin a objetos: Smalltalk Eiffel Simula Lenguajes oiientados a objetos hibridos Soportan en su totalidad el paradigma de orientacin a objetos s o b ~ eun ncleo de lenguaje hbrido: C + + (exteizsiiz de C: Borland C + + , Microsoft C + + , Turbo C + + , Visual C + i , Symantec,Watcom ) Objective-C (exteizsiiz de C) Object COBOL. (exteizsin de COBOL). Object Pascal (extensin de Pascal: Turbo/Borland Pascal) Visual Object (extensin de Clipper). Delphi (extensiiz de Turbo Pascal 70) Java (extensiiz de C + + y Ada-95)
32
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
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 S S
S Si S S S S
S S S S S S
No
No
E n parte En paile S
S S
No
No
No
No
De cualquier forma, Meyei, cieadoi del lenguaje Eiffel, proporciona unos criterios para considerar la bondad" de un lenguaje orientado a objetos,
'O MEYER, Bertrand: Objrct Oriei~tedSqfti4:aie Coitrtiuriioii Englewood Clifls NI, PrenticeHall, 1988
+ Algoritnzos = Programar
La idea clave del diseo descendente es rompe1 un programa grande en tareas ms pequeas, ms manejables Si una de estas tareas es demasiado grande, se divide en tareas ms pequeas Se contina con este proceso hasta
26
El desarrollo de software
27
que el programa se compartimentaliza en mdulos ms pequeos y que se programan fcilmente Los subprogramas facilitan el enfoque estructurado, y en el caso de lenguajes como C, estas unidades de programas, llamadasfunciones, representan las citadas tareas o mdulos individuales Las tcnicas de progiamacin estructuradas reflejan, en esencia, un modo de resolver un prograina en trminos de las acciones que realiza Para comprender mejor las relaciones entre los algoritmos (funcioiles) y los datos, consideremos una comparacin con el lenguaje natural (por ejemplo espaol o ingls), que se compone de muchos elementos pero que ieflejar poca expresividad si slo se utilizan nombres y verbos Una metodologa que se basa slo en datos o slo eiz pi.ocedi~izieiztos es similar a un lenguaje (idnea) en el que slo se utilizan nombres o veibos. Slo enlazando nombres o verbos correctos (siguiendo las reglas sen~nticas), las expresiones tomarn formas inteligibles y su proceso ser ms fcil L.as metodologias tradicionales se vuelven poco prcticas cuando han de aplicaise a proyectos de gran tamao El diseo orientado a objetos se apoya en lenguajes orientados a objetos que se sustentan fundamentalmente en los tipos de datos y opeiaciones que se pueden realizar sobre los tipos de datos Los datos no fluyen abiertamente en un sistema, coino ocurre en las tcnicas estructuradas, sino que estn piotegidos de n~odificacionesaccidentales En piogramacin orientada a objetos, los mensajes (en vez de los datos) se mueven -por el sisteina En lugai del enfoque funcional (invocar una funcin con unos datos), en un lenguaje orientado a objetos, se enva un mensaje a un objeto* De acuerdo con Meyer, el diseo orientado a objetos es el mtodo que conduce a arquitecturas de software basadas en objetos que cada sistema o subsistema evala Recordemos qu son los objetos? Un objeto es una entidad cuyo comportamiento se caracteriza por las acciones que realiza Con ms precisin, un objeto se define como una entidad caracterizada por un estado; su comportamiento se define por las operaciones que puede realizar; es una instancia de una clase; se identifica por un nombre; tiene una visibilidad limitada para otros objetos; se define el objeto mediante su especificacin y su implementacin Una definicin muy elaborada se debe a Meyer: Diseo orientado a objetos es la construccin de sistemas de software como colecciones estructuradas de impleinentaciones de tipos de datos abstractos n La construccin de un sistema se suele realizar mediante el ensamblado ascendente (abajo-ariiba) de clases preexistentes Las clases de un sistema pueden tener entie si, como se ver en los siguientes captulos, relaciones de uso (cliente), relaciones de deiivacin (herencia) o relaciones de agregacin (conzposicin) o iiicluso slo relaciones de asociacin As, por ejemplo, con una ielacin de cliente, una clase puede utilizar los objetos de otra clase; con una ielacin de herencia, una clu~e puede heredai. o derivar. sus propiedades definidas en otra clase El haidwaie se ensambla a partii de componentes electrnicos, tales como ciicuitos integrados (clips), que se pueden utilizar repetidamente para disear y construir conjuntos mucho ms grandes, que son totalmente reutilizables La calidad de cada nivel de diseo se asegura mediante componentes del sistema
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
Mtodos
Figura 1 7
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
Figura 1 8 Proceso tradicional de datos, Taylor " considera que los beneficios del modelado y desarrollo de objetos son: 1 Desarrollo ms rpido 2 Calidad ms alta 1 Mantenimiento ms fcil 4 Coste reducido 5 Incremento en escalabilidad 6 Mejores estructuras de informacin 7 Incremento de adaptabilidad Sin embargo, TaylorL2tambin considera algunos inconvenientes, aunque algunos de ellos ya han sido superados o al menos reducido su impacto 1 Inmadurez de la tecnologa (hoy da ya no se puede considerar aso 2 Necesidades de estndares (el giupo OMG es una realidad), 3 Necesidad de mejores herramientas 4 Velocidad de ejecucin 5 Disponibilidad de personal cualificado, 6 Coste de conversin, 7 Soporte para modularidad a gran escala L.a Figura 19 muestra los beneficios genricos de las tecnologas de objetos Reutilizacin Las clases se construyen a partir de otras clases Sistemas ms fiables, Proceso de desarrollo ms rpido Desarrollo ms flexible Modelos que reflejanmejor la realidad Mejor independencia e interoperatividad de la tecnoiogia Mejor informticadfstribuiday cliente-servidor, Bibliotecas de clases comerciales disponibles Mejor relaciones con los clientes Mejora la calidad del producto software terminado Figura 1.9. Beneficios de las tecnologias de objetos
w
Programa Programa Datos
Ei
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
. .
" IAYLOR, David A : Objet-Oriented Trchiioioqy Readirlg MA: Addison-Wesley, 1992, pginas 101-107 " Ibid pgs 108-113
31
2.1.. MODULARIDAD
La ptogramacin inodular trata de descomponer un progiama en un pequeiio nmeio de abstracciones cohereiites que pertenecen al dominio del problema y cuya complejidad interna es susceptible de ser enmascarada por la descripcin de un interfaz Si las abstracciones que se desean representar pueden en ciertos casos corresponder a una nica accin abstracta y se implen~entan en geneial con la nociii de objeto abstiacto ( o tipo abstracto) caracterizado en todo instante por: Un estado actual, definido por un cieito nmero de atributos Un coijuizto de occioiles posibles,
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~eraciones sobre 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
33
se denominan p i ~ i n ~ t ~ u oupuntos s de entiada del mdulo Los tipos lgicos eventualmente definidos en el interfaz permiten iepresentar los parmetros de estas primitivas
lnteraz
Primitivas de acceso Descripcin de propiedades de los datos Atributos Representacin Algoritmos Parmetros actuales
un archivo cuyo nombre tiene el sufijo . c Las dependencias entre archivos se pueden declarar utilizando la macro #include En Turbo Pascal, los ~ndulos se denominan unidades La sintaxis de las unidades dif'eiencia entre el iritetfaz y la implementacin del mdulo Las dependencias entre unidades se pueden declarar slo en un interfaz del mdulo Ada va ms lejos y define el paquete en dos partes: la especificacin del paquete y el cuerpo del paquete Al contrario que Object Pascal, Ada permite que la conexin entre mdulos se declaren independientemente en la especificacin y en el cuerpo de un paquete,
lnterfaces adecuado,^
Seccin privada
2.1.2.
Reglas de modularizacin
En primer lugar, un mtodo de diseo debe ayudar al programador a resolver un problema, dividiendo el problema en subproblemas ms pequeos, que se puedan resolver independientemente unos de otros Tambin debe ser fcil conectar los diferentes mdulos a los restantes, dentro del programa que est escribiendo Cada mdulo tiene un significado especfico propio y debe asegurarse que cualquier cambio en su implementacin no afecte a su exterior (o al menos lo mnimo) De igual modo, asegurar que los errores posibles, condiciones de limites o frontera, comportamientos errticos, no se propaguen ms all del mdulo (o como mximo a los mdulos que estn directamente en contacto con el afectado) Para obtener mdulos con las caractersticas anteriores deben seguirse las siguientes reglas:
Unidades modulares
En la estructuracin de un programa en unidades es beneficioso que existan pocos iilterfaces y que stos sean pequeos Es conveniente que existan pocos enlaces entre los diferentes n~dulosen que se descompone un programa El iizteifaz de un i~~dulo es la parte del mdulo (datos, procedimientos, etc) que es visible fuera del mdulo Los interfaces deben ser tambin pequeos (esto es, su tamao debe ser pequeo con respecto al tamao de los mdulos implicados) De este modo, los mdulos estn acoplados dbilmente; se enlazarn por un nmero pequeo de llamadas (Fig 2 1) Pocos interaces Muchos interaces
El lenguaje debe proporcionar estructuras modulares con las cuales se puedan describir las diferentes unidades De este modo, el lenguaje (y el compilador) puede reconocer un mdulo y debe ser capaz de manipular y gobernar su uso, adems de las ventajas evidentes relativas a la legibilidad del cdigo resultante Estas construcciones modulares pueden, como en el caso de los lenguajes orientados a objetos, mostrar caractersticas que facilitan la estructura del programa, as como la escritura de programas En otras palabras, nos referimos a las unidades modulares lingsticas, que en el caso de C++ se conocen como clases En C/C++ los mdulos son archivos compilados separadamente, aunque la representacin ideal en C + + es la clase La prctica tradicional en C/C++ es situar interfaces del mdulo en archivos cuyos nombres contienen el sufijo . h (archivos de cabecera) Las implementaciones del mdulo se sitan en
34
35
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
! 1
!
11
i
Ocultacin d e la informacin
Todos los mdulos deben seguii el principio de ocultacin de la informacin; cada tridulo debe representar al menos un elemento de diseo (por ejemplo, la estructura de un registro, un algoritmo, una abstraccin, etc) Otro criterio a tener en cuenta es la subdivisin de un sistema en mdulos, es el principio denominado ubierto-cerrado', fotmulado por Meyer Este principio entiende que cada mdulo se considerar cei rudo (esto es, terminado, y por consiguiente til o activo desde dentro de otros mdulos), y al mismo tiempo debe ser abierto (esto es, sometido a cambios y modificaciones) El principio abierto-cerrado debe producirse sin tener que rescribir todos los mdulos que ya utilizan el indulo que se est modificando,
. .-
- -.
.-. .-
- ..
.-
kn lenguajes clc ~ i r o g r c i n ~ ; i ~ I ~ l5~ i l sla ~ modilIar1~.1~611 ~ ~ ~ ~ , hc CCII~K CII ~ 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 SLI~IYC a 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
Sobie el principio abierto-cerrado y su implementacin en C + + y Eiifel, se puede consultar la bibliografia de Miguel Katrib Algunos ttulos destacados sobre orientacin a objetos son: Piogiaiiiaciiz 0i ieiitada a Objetos <i t~.avr de C + + y Eiffel V Escuela Internacional en Temas Selectos de Computacin, Zacatecas, Mxico, 1994 (esta Escuela est organizada por la UNAM, Mixico); Pi.ogi.aiiiaiin 0i.ieiitada a Objeto7 en C i + Iiiiosys, Mxico, 1994; Culieetioiis aiid Irerators iit Eifei Joop, vol 6, n o 7, nov/dic 1993
'
36
37
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 Tabla 2 1 Clasificacin del acoplamiento de mdulos Tipu de ac~~plnmirnio Por contenido Comn De control Por sellado (estampado) Datos Sin acoplamiento < ; r ~ dde o acoplamiento Alto (fuerte) Grado de manrenibilidad Bajo
funcin de un tipo de datos; ocultan la implementacin de las operaciones definidas por el usuario asociadas con el tipo de datos Esta capacidad de ocultar la informacin permite el desarrollo de componentes de software reutilizables y extensibles Un tipo de dato es un conjunto de valores, y un conjunto de operaciones defiizidas por esos valores Un valor depende de su representacin y de la interpretacin de la representacin, por lo que una definicin informal de un tipo de dato es:
Repiesentacin
+ Operaciones
Bajo (dbil)
Alto
La Tabla 2 2 muestra los grados de cohesin: baja cohesin (no deseable) y alta cohesin (deseable), as como los diferentes tipos de cohesin Tabla 2 2
'1 ipo de cohesiiin
Por coincidencia Lgica Temporal Po1 procedimientos Por comunicacioiies Secuencia1 Funcional Info~macional
Alto
Alto
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
Todos los lenguajes de piogramacin soportan algn tipo de datos Por ejemplo, el lenguaje de programacin convencional Pascal soporta tipos base tales como enteros, reales y caracteres, as como tipos compuestos tales como arrays (vectores y matrices) y registros Los tipos abstractos de datos extienden la
+ Operaciones base
38
39
Con el nombre de los subprograinas, un programador puede asigna1 una descripcin abstracta que captura el significado global del subprograma, Utilizando el nombre en lugar de escribir el cdigo, permite al programador aplicar la accin en trminos de su descripcin de alto nivel, en lugar de sus detalles de bajo nivel. L.os subprogramas en Pascal proporcionan ocultacin de la informacin. Las variables locales y cualquier otra definicin local se encapsulan en el subprograma, ocultndolos realmente, de fbrma que no se pueden utilizar fuera del subprograma Por consiguiente, el programador no tiene que preocuparse sobre las definiciones locales; sin embargo, pueden utilizarse los componentes sin conoce1 nada sobre sus detalles L.os parmetros de los subprogramas, junto con la ocultacin de la informacin anterior, permite crear subprogramas que constituyen entidades de software propias Los detalles locales de la implementacin pueden estar ocultos, mientras que los parmetros se pueden utilizar para establecer el interfaz pblico
Otros mecanismos de abstraccin de control
L.a evolucin de los lenguajes de programacin ha permitido la aparicin de otros mecanismos para la abstraccin de control, tales como inanejo de excepciones, coirutinac. unidades coizcurrentes, plantillas (templales) Estas constiucciones son soportadas por los lenguajes de programacin basados y orientados a objetos, tales como Modula-2, Ada, C + + , Smalltalk o Eiffel
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
41
esencia de la abstraccin es similar a la utilizacin de un tipo de dato, cuyo uso se realiza sin tener en cuenta cmo est representado o implementado Los tipos de datos son abstracciones y el proceso de construir nuevos tipos se llaman abstracciones de datos Los nuevos tipos de datos definidos por el usuario se llaman tipos abstractos de datos, El concepto de tipo, tal como se defini eii Pascal y ALGOL 68, ha constituido un hito importante hacia la realizacin de un lenguaje capaz de soportar programacin estructurada Sin embargo, estos lenguajes no soportan totalmente una metodologa La abstraccin de datos til para este propsito no slo clasifica objetos de acuerdo a su estructura de representacin, sino que se clasifican de acuerdo al comportamiento esperado Tal comportamiento es expresable en trminos de operaciones que son significativas sobre esos datos, y las operaciones son el nico medio para crear, modificar y acceder a los objetos. En trminos ms precisos, Ghezzi indica que un tipo de dato definible poi el usuario se denomina tipo abstracto de dato (TAD) si: Existe una construccin del lenguaje que le permite asociar la representacin de los datos con las operaciones que lo manipulan L.a reptesentacin del nuevo tipo de dato est oculta de las unidades de programa que lo utilizan [Ghezzi 871 Las clases en SIMULA slo cumplan la primeia de las dos condiciones, mientras que otros lenguajes actuales cumplen las dos condiciones: Ada, Modula-2 y C+ + Los tipos abstractos de datos proporcionan un mecanismo adicional mediante el cual se realiza una separacin clara entre el interfaz y la implernetztacin del tipo de dato La implementacin de un tipo abstracto de dato consta de:
Un IAD se compone de estructuras de dator y los procedimientos o funciones que manipulan esas estructuras de datos,
Las opetaciones desde un enfoque orientado a objetos se suelen denominar mtodos La estructura de un tipo abstracto de dato (clase), desde un punto de vista global, se compone del interfaz y de la implementacin (Fig 2 4)
Mtodo 3
I
Mtodo 4
I
Interfaz pblico
estructuras de datos
1
2
La representacin: eleccin de las estructuras de datos Las operaciones: eleccin de los algoritmos,
El interfaz del tipo abstracto de dato se asocia con las operaciones y datos visibles al exterior del TAD
Implementacin de mtodos: Cdigo del mtodo 1 Cdigo del mtodo 2 Cdigo del metodo 3 Cdigo del mtodo 4
l
l
Implementacin privada
Figura 2 4 , Estructura de un tipo abstracto de datos (TAD),
Las estructuras de datos reales elegidas para almacenar la representacin de un tipo abstracto de datos son invisibles a los usuarios o clientes. Los algoritmos utilizados para implementar cada una de las operaciones de los TAD estn encapsuladas dentio de los propios TAD La caracterstica de ocultamiento de la informacin del TAD significa que los objetos tienen interfaces pblicos Sin embargo, las representaciones e implementaciones de esos interfaces son privados
42
Programacin
orientada a obletos
Modolaridad
43
2.6.. TIPOSABSTRACTOSDEDATOSENTURBOPASCAL
Una pila es una de las estructuras de datos ms utilizadas en el mundo de la compilacin Una pila es un tipo de dato clsico utilizado frecuentemente para introducir al concepto de tipo abstracto de datos; es una lista lineal de elementos en la que los elementos se aaden o se quitan por un solo extremo de la lista La pila almacena elementos del misino tipo y actan sobre ella las operaciones clsicas de Meter y Sacar elementos en dicha pila, teniendo presente la estructura lgica LIFO (ltimo en entrai, primero e 7 1 salii)
Pila
1
1
2
4 5
6
Permite una mejor coilceptualizacin y modelizacin del mundo real Mejora la representacin y la comprensibilidad Clarifica los objetos basados en estructuras y comportamientos comunes, Mejora la robustez del sistema Si hay caractersticas subyacentes en los lenguajes, permiten la especificacin del tipo de cada variable, los tipos abstractos de datos permiten la comprobacin de tipos para evitar errores de tipo en tiempo de ejecucin Mejora el rendimiento (prestaciones) Para sistemas tipeados, el eonocimiento de los objetos permite la optimizacin de tiempo de compilacin Separa la implementacin de la especificacin Permite la modificacin y mejora de la implementacin, sin afectar al interfaz pblico del tipo abstracto de dato Permite la extensibilidad del sistema Los componentes de software reutilizables son ms fciles de ciear y mantener Recoge mejor la semntica del tipo Los tipos abstractos de datos agrnpan o localizan las operaciones y la representacin de atributos
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
S a c a r ?
7 Meter
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
En estos lenguajes se definen la especflcacin del TAD, que declara las operaciones y los datos ocultos al exterior, y la implementacin, que muestra el cdigo fuente de las operaciones y que permanece oculto al exterior del mdulo, Las ventajas de los TAD se pueden manifestar en toda su potencia, debido a que las dos partes de los mdulos (e,spec@cacine implementacin) se pueden compilar por separado mediante la tcnica de compilacin separada (eseparate compilutiori~),
.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
La implementacin de una pila con capacidad para 1000 elementos del tipo entero es:
unit Pila; interface const MaxPila = 1000; type TipoElemento = integer; ListaElementos = array [l MaxPilal of TipoElernento; tipo = record Elernc : LictaElementoc; Cima 2nd;
:
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;
procedure Crear jvar S:tipo); ( * S se inicializa y se limpia o vaca procedure Destruir (var S:tipo); ( * Se libera memoria asignada a S * ) ( * S no est inicializada *
*)
procedure Meter (var S:tipo; Item: tipoElemento); ( * Se aade un elemento a la cima de la pila * ) procedure Sacar (var S:tipo; 1tem:tipoElemento); ( * quitar un elemento de la pila * ) procedure PilaVacia (var S:tipo):boolean; ( * devuelve true si S es vacia; false en caco contrario implementation procedure Crear (var S:tipo); begin SCima : = O ; end; procedure Destruir (var S:tipo); begin S ( * no hace nada * ) end; procedure Meter (var S:tipo; 1tem:lipoElemento); begin S Cima : = S.cima + 1; S ElemsIS Cima1 : = Item; end; procedure Sacar (var S:tipo; var 1tem:TipoElemento); begin Item : = S Elernscs Cima]; end ;
*)
Esta tarea se consigue metiendo nmeros en la pila y a continuacin vaciando dicha pila
program Nmeros; uses Pila; var S:Pila Tipo; procedure LeeryAlmacenarNumerocjvar NumPi1a:PilaTipo); var Aux:Pila Ti~oElemento: begin while not eof do beain . readln (Aux); Pila Meter (NumPila, Aux) ; end; 2nd; procedure VerNumeros(var NumPila: Pila Tipo); var AUX: Pila TipoElemento; begin while not Pila Pilavacia(NumPi1a) do begin Pila Sacar(NumPila, Aux); WriteLn (Aux) ; end; ( * while * ) end; ( * VerNumeros * )
roced dure PilaVacia (var S:ti~o):boolean; begin PilaVacia : = (S Cima=O); end; end
46
Programacin orientada a objetos begin ( * programa p r i n c i p a l * ) P i l a Crear ( S ) LeeryAlmacenarNumeros(S); P i l a Destruir (S); end ( * f i n de p r i n c i p a l * )
47
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)
Al igual que se ha definido el tipo P ~ l a con estructuras estticas tipo airay, se poda haber realizado con estructuras dinmicas tales como listas enlazadas De igual modo se pueden implementar otros tipos de datos abstractos, tales como, por ejemplo, las colas que se utilizan en muchas aplicaciones: sistemas operativos, sistemas de comunicaciones, etc
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 ;
Datos opacos
Figura 2 6
Ocultamiento de datos,
<declaraciones>
BEGIN
<sentencias>
END i d e n t i f i c a d o i o d
En Modula-2, la especificacin y la implementacin de un tipo abstracto de datos se compilan por separado en uii rndulo de definicin y en un mdulo de iinpleineiztacirz Esta separacin es consistente con el principio fundamental del
48
49
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
PROCEDURE Sacar(Vm S : PilaCar; VAR ch: C m ) ; ( * almacena elemento superior de la pila s en ch. a continuacin saca S ; termina programa si pila est vacia * ) PROCEDURE EsVacia(s: PilarCar): BOOLEAN; ( * devuelve TRUE si s ect vaca * ) END Pilacaracteres
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.
Una versin del tipo abstracto de dato Pila con datos opacos
Una versin mejorada del mdulo de definicin de Pilacaracteres con Piiacar definida como un tipo opaco es:
DEFINITION MODULE PilaCaracterec; ( * exporta tipo PilaCar (pila de caracteres) y procedimientos para manipulacin de variables de tipo PilaCar * ) TYPE PilaCar; ( * exportacin opaca * ) PROCEDURE InicializariVAR S : PilaCar); ( * crea una pila s y la hace vacia * ) PROCEDURE Meter(VAR S: PilaCar; ch: C m ) ; ( * empuja ch en pila S ; termina programa si pila est llena * ) PROCEDURE Sacar(VAR S: PilaCar; VAR ch: C H A R ; ( * almacena elemento superior de pila s en ch, a continuacin saca S ; termina programa si pila est vacia * ) PROCEDURE EsVacia(s: PilaCar) : BOOLEAN; ( * devuelve TRUE si s es vacia, FALSE en caso contrario * ) END Pilacaracteres
Los mdulos que importan PilaCar pueden declarar variables de tipo Piiacar, pero el nico medio para manipular estas variables es a travs de los procedimientos Inicializar,Meter, Sacar y EsVacia La especificacin completa del tipo Pilacar debe aparecer en la seccin de implementacin de Piiacaracteres Dado que PilaCar debe ser un tipo
50
51
puntero, se declara como un puntero a un registro que contiene los campos ArrayPila y CimaPila.E l procedimiento Inicializar asigna espacio para estos registros y despus fija el campo Cimapila a O E l mdulo de implementacin es:
IMPLEMENTAIION MODULE PilaCaracteres; FROM Storage IMPORT ALLOCATE FROM 10 IMPORT WrStr, WrLn; CONST TamanyoPila = 100; ( * tamao mximo de una PilaCar * ) TYPE PilaRea - = RECORD ArrayPila : Array[l TamanyoPila] OF CHAR; CimaPila : 10 Timanvo~ila-+ 11 END ; PilaCar = POINTER TO PilaReg; PROCEDURE Inicializar(VAR S : PilaCar); ( * crea una pila y la hace vaca * ) EEGIN ALLOCATE ( s . SIZE (PilaREg); sA.CimaPila : = O END Inicializar; PROCEDURE Meter(VAR S : PilaCar; ch: CHAR); ( * empuja ch en la pila S ; termina programa si pila llena BEGIN INC (sA.cimaPila); IF S" cimaPila c tamanyoPila THEN Wrstr ( Desbordamiento Pila'' ) ; WrLn; HALT END; SA.UrayPila [ S " cimapila] : = ch END Meter; PROCEDURE Sacar(VAR S : PilaCar; VAR ch: CII4R); ( * almacena elemento superior de la pila s en ch. despus saca S ; termina programa si pila est vaca BEGIN SF S^ cimapila = O THEN Wrstr( Desbordamiento negativo pila"): WrLn;
H?.LT
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 FROM IO IMPORT RdKey, WrChar, WrStr, WrLn; FROM Pilacaracteres IMPORT PilaCar, Inicializar, Meter, Sacar, EsVacia; CONST rc = 15c; VAR s : PilaCar; car: CHAR
(*
retorno de carro
*)
BEGIN Inicializar(s);
(*
vacia pila s
;
*)
*)
WrStr ("Introduzca cadena: " ) car : = RdKeyO; WHILE car # rc Do WrChar (car); Meter(s,car); car : = RdKey END ; WrLn; WrStr("Cadena inversa es: WHILE NOT EsVacia ( S ) DO Sacar(s,car); WrChar(car1 END; WrLn; END Inversa
) ;
*)
END ; ch : = sA.ArrayPila[cA cimapila]; DEC ( S ^ cimapila) END Meter; PROCEDURE EsVacia(5: PilaCar) : BOOLEAN: ( * devuelve TRUE si s est vaca * ) BEGIN RETURN s A cimapila = O END EsVacia; END Pilacaracteres
52
53
procedure meter (var stk:pilatipo; e1emento:integer); procedure quitar (var ctk:pilatipo); roce dure cima (stk:pilatipo):integer; end pilamod implementation module pilamod; from InOut import WriteString, WriteLn; from Starage import allocate const max = 100; type pilatipo = pointer to record lista: arrayil maxlof integer; cimasub: [ O maxl end; procedure vacia (stk:pilatipoi :boolean; begin return stkA cimasub = 0 end vacia; procedure meter (var stk:piiatipo; e1emento:integer); begin if stkA.cimapila = max then WriteString ( "error - desbordamiento pila") ; WriteLn; else Inc (stkA licta[stkA cimapilal : = elemento end end meter; procedure quitar 1stk:piiatipo) :integer: begin if vacia (stk) then WriteString("Err0r - desbordamiento negativo"); WriteLn elce dec (stkA.cimasub) end ( * fin de if vacia * ) end auitar;
El siguiente cdigo crea e inicializa una pila, mete dos valores, 4 2 y 2 7 , luego saca el 2 7 y deja el valor 4 2
module usodepila; from InOut import WriteLn, Writelnt, WriteString; frompilamodimportpilatipo vacia,meter,quitar,cimacrear; var pi1a:pilatipo; var aux:integer; begin crear (pila); meter (pila, 4 2 ) ; meter (pila, 2 7 ) : quitar (pila!; aux : = cima (pila); end usodepila
Subprogramas: procedimientos y funciones anlogos a sus homnimos en Pascal Tareas: unidades de programa diseadas para ejecutarse concurrentemente, que se identifican como colecciones estticas de cdigo y procesos Paquetes: construcciones que soportan abstraccin de datos y son la base de componentes software Unidades genricas: unidades que permiten la creacin de tipos genricos o parametrizados Son plantillas que sirven para construir subprogramas y paquetes y que constituye el mecanismo principal para construir componentes de software reutilizable
Ada es un lenguaje que soporta el tipo abstracto de datos identificado como mdulo en una entidad denominada paquete Un paquete representa en Ada la idea de la encapsulacin, que es la clave para la abstraccin de datos El paquete en Ada representa el nivel ms alto de abstraccin del programa y acta como un mdulo La ocultacin de datos se iealiza a travs del uso de tipos private (privado) o limited private (privado limitado) L.as operaciones de asignacin y verificacin de igualdad son las nicas operaciones que estn definidas en el lenguaje para tipos privados Para tipos privados limitados no existen operaciones predefinidas proporcionadas por el lenguaje El programador debe prever todas las operaciones soportadas, incluyendo asignacin y verificacin de igualdad
54
Modularidad t i p o s abstractos de datos package body TADPila is -cuerpo procedure Meter(x:integer, p: in out Pila) ic begin Cima : = Cimatl; PlCirna) := x; end Meter; procedure Sacar (p: in out Pila, x: out integer) is begin Cima : = Cima-1; x! = P(Cima+l); end Sacar; begin inicializacionec Cima : = 1; end TADPila;
55
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)
Especificacin del paquete
Visible. Los componentes definidos en la parte visible son accesibles fuera de la especificacin del paquete. Privada La parte privada de la especificacin del paquete no es accesible a los clientes del paquete
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
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> . : i m p l ementacin subprogramas> [manejador de excepciones1 begin <inicializaciones> end <nombrepaquete>
La declaracin, en la parte pblica de la declaiacin, de uno o ms tipos privados Cada declaracin debe ser de la f0rma:
typeidentificador i s p r i v a t e
As, el tipo abstracto P i l a ms simple (slo el procedimiento METER y la funcin SACAR) se escribira as:
package TADPila is --ewecificacin Utilizado para declarar type Pila ic private; ~nctanciade la c l a , s e procedure METER(x:integer, p: in out Pila); procedure SACAR (p: in out Pila x : out integer); private max:constant : = 100; type Pila ic record P: array(1 Max) o f integer; Interfaz privado Cima:integer range O max : = 0; end record; end Pila;
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
57
lirniteqila: constant := 100: s~btyperangosila is integer range 1 limitegila; type Pila-ent is record Pila-array:array (rangosila) o integer; Cima:rango-cima; end record; end P ~ l a s ;
tos significativos, pero el operador de asignacin := no se puede redefinir, y en consecuencia, si se requiere una operacin de asignacin, habr que declarar un procedimiento especial a~ignai
Las nicas operaciones disponibles en objetos de tipo privado son igualdad y asignacin
La ventaja de hacei que un tipo privado limitado es que el programador del paquete tiene un control completo sobre los objetos del tipo Se puede vigilar la copia de recursos, etc As, un tipo P i l a definido como un tipo privado (pr i v a t e) limitado:
package Pila ic type Pila-ent is limited Private; procedure Iniciar (S:in out Pila-ent); procedure Meter (S: in out Pila-ent; valor-int:integer); procedure Sacar (S: in out Pila-ent, x: out integer); procedure Cima (S: Cima) return integer; function Es-vacia (S: Pila-ent) return boolean; function Es-llena ( S : Pila-ent) return boolean; function " = " (izda, dcha: Pila-ent) return boolean; private Max : constant := 100; type Vector-~ntero ic array (Integer range o ) of integer: type Pila-ent. is record P: Vector-Entero (1 .Max); Cima:Integer range O Max : = O ; end record; end;
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-
58
59
Punto p2)
Y;
1
/*
1
complejo sumar (complejo a , complejo b) complejo c; c r = a r + b r ; c i = a i + b i ; return
1
C;
restantes ~mplementaciones* /
1
complejo multiplicar(comp1ejo a , complejo b) complejo c; c r = a r * b r - a i * b i ; c i = a r * b i - a i * br: return C ;
{
1
complejo dividir (complejo a , complejo b) com~leio : - . c. float denom = b r * b . r + b.i * b i; C r = ( a r * b r + a i * b iildenom: c i = (a i * b r - a r * bi)/denom; return C :
{
complejo nuevo_complejo(float x, float y); float real(comp1ejo c) ; float imag(comp1ejo c); complejo sumar (complejo a, complejo b) ; complejo rectar(comp1ejo a, complejo b); int igual(comp1ejo a, complejo b); complejo multiplicar(comp1ejo a , complejo b); complejo dividir(comp1ejo a, complejo b); #endi
Una vez definido el tipo de dato coinplejo, se puede invocar a los mismos dentro de un programa principal
/ * FICHERO: principa c * /
60
61
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
La implementacin de la clase (los cuerpos de la funcin) se pueden declarar dentro de una definicin de la clase, pero es ms frecuente incluir los prototipos de la funcin en la especificacin y declarar los cuerpos de la funcin separadamente, aprovechando la propiedad de compilacin separada que posee el lenguaje C + + Adems, cada parte se compila en un archivo: la especificacin con la extensin , h y la implementacin con la extensin , cpp En el caso de la citada clase P i l a , los cuerpos de las funciones se declaran y compilan por separado mediante el operador de resolucin de mbito (: :), que permite asociar los nombres de las funciones miembro con la clase correspondiente As, los cdigos fuente seran:
void pi1a~carac::meterlcharx ) ilista[++cima-de-lasilal = x;) void pila-carac::sacar(char * x ) { * x = lista[cimode-lasila--];) char pila-carac::cima() lreturn l i s t a L c i m a ~ d e _ l a ~ i l ;} a]
Los usuarios de la informacin declarada en una clase se conocen como clientes Las variables de la clase pila-carac se pueden declarar y manipula1 por un cliente de la forma siguiente:
main ( )
1
= -1);
La nueva clase pila-carac contiene las operaciones m e t e r , s a c a r Y c i m a Las clases pueden incluir otras funciones miembro con igual nombre que la clase y que se denominan constructores y destructores, cuya utilidad se ver posteriormente (Captulo 6). El encapsulamiento en C + + se consigue declarando todos los datos como privados (en la seccin privada, por defecto las sentencias que vienen a continuacin de la llave de apertura hasta la primera clusula p u b l i c O p r o t e c t e d ) . A la seccin privada slo se puede acceder mediante las funciones miembro de la clase La seccin pblica es accesible (visible) a cualquier otra clase y sus datos pueden ser modificados por funciones miembros externas a la clase
La clase P i l a se define en el archivo de cabecera p i l a h, de modo que podr ser utilizado por otros programas La implementacin de la pila utiliza un array i t e m s , que contiene los elementos de la pila, y un ndice c u e n t a s , que contiene cuantos elementos existen realmente en la pila. Las funciones que manipulan la pila son m e t e r , s a c a r , c i m a y v a c a Estas operaciones se desea que estn disponibles a los usuarios de la pila y, por consiguiente, se deben definir pblicas (mediante la palabra reservada p u b l i c ) , lo que significa que cualquier usuario de la pila puede llamar a las diferentes funciones miembro que implementan las opeiaciones de la pila Con el tipo s t r u c t , el acceso por omisin en pblico ( p u b l i c ) para todos sus miembros. En la definicin de p i l a existe un prototipo especial denominado p i l a ( ) Cualquier funcin miembro con el mismo nombre que el tipo dato es un constructor Un constructor se llama automticamente siempre que crea-
63
mos una instancia de un tipo de dato particular Su trabajo es inicializar los campos dato dentro de un objeto, ahorrando al programador la molestia de llamar a una rutina de inicializacin especfica De modo similar, se puede especificar un destructor, una funcin miembro con el mismo nombre que la clase, con un smbolo delante
//archivo pila h //definicin de una pila, con operaciones conct int MAXPILA = 100; struct pila //tamao por defecto de la pila
i
pila S ; int i; while (cin >> i) c meter(i) ; for ( ; ! S vacia0; s sacar()) cout < c s cima0 c c '\n"; return 0; //crear una pila
i
private: int cuenta; int itemsIMAXPILA1; public: pila(); void met.er(int item); void sacar ( ) ; int cima ( ) ; int vaca ( ) ; //nmero de elementos de la pila //definicin de la pila //inicializar pila, constructor //meter elementos en la pila //quitar elementos de la pila //devuelve elemento cima de la pila //la pila est vaca?
El ejercicio anterior se puede implementar mediante el tipo ciass La compilacin separada se consigue con el archivo de cabeceia pila h, el archivo de implementacin de funciones pila cpp y el programa principal que hace uso del archivo pila.h
//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 ;
i
cuenta = 0;
1
void pila::meter(int item) //meter un elemento en la pila items[cuenta++l = item;
1
vaid pila: :sacar( ) Cuenta--; //quitar elemento superior de la //pila
1;
1
int pi1a::cirnaO return itemc [cuenta-11; //devuelve elemento superior de la //pila //ARCHIVO: pila cpp #include "pila, h" pila: :pila0 maximo (100) cuenta(0) i itemc = new int [maximo];
)
1
int pila::vacia() //?est la pila vaca?
I
return cuenta == 0;
64
65
1
void pila::meter(int itern) itemc [cuenta++] = item;
)
En la mayora de los lenguajes de progiamacin orientados a objetos, los tipos abstractos de datos se implementan mediante clases (unidades en Pascal, mdulos en Modula-2 paquetes en Ada). En este captulo se analizan y describen las implementaciones de tipo abstractos de datos en los lenguajes Turbo Pascal (versiones 5 5 a 7 ) , Modula-2,
i
Ada, C y C + +
EJERCICIOS
21
Construii un tipo abstracto lista enlazada de nodos que contienen enteros
El operador de resolucin de mbito (::) permite asociar una funcin miembro con su clase, y ha de definirse as cuando se implementa el cuerpo de la funcin
//ARCHIVO:
2.2. Disear un tipo abstracto de datos pila de nmeros enteros y que al menos soporte las siguientes operaciones:
Boi rar: Copiar: Meter: Sacar: Longitud: Llena: Eliminar todos los nmeios de la pila Hace una copia de la pila actual Aadir un nuevo elemento en la cima de la pila, Quitar un elemento de la pila Devuelve un nmero natural igual al nmero de objetos de la pila Devuelve verdadero si la pila est llena (no existe espacio libre en la pila) Devuelve ve~dadero si la pila est vaca y falso en caso contrario Devuelve verdadero si existen dos pilas que tienen la misma profundidad y las dos secuencias de nmeros son iguales cuando se comparan elemento a elemento desde sus respectivas cimas de la pila; fa150 en caso contrario
principa cpp
#include cioctream h> #include "pila, h" int m a i n 0 i pila s; int i: for
(;
c meter();
C O U ~i< 'NUMEROS
Igual:
I N V E R T I D O S " << endl;
23
Crear un tipo abstracto c o l a que sirva para implementar una estiuctura de de datos cola
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
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
Funcin
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 Funcin B
--
Figura 3 2 Variables globales y locales Otro problema es que, dado que muchas funciones acceden a los mismos datos, el medio en que se almacenan los datos se hace ms critico La disposicin de los datos no se pueden cambiar sin modificar todas las funciones que acceden a ellos Si por ejemplo se aaden nuevos datos, se necesitar modificar todas las funciones que acceden a los datos, de modo que ellos puedan tambin acceder a esos elementos
Funcin
Funcin
1 1
Funcin
1 1
Funcin
Grady Booch, autor del mtodo de diseo orientado a obletos, define la piogramac~n oi 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
Figura 3 3
Los programas basados en funciones son difciles de disear El problema es que sus componentes principales -funciones y estructuras de datos- no modelan bien el mundo real Por ejemplo, supongamos que se est escribiendo un programa para crear los elementos de un interfaz grfico de usuario: mens, ventanas, cuadros de dilogo, etc Qu funciones se necesitarn? Qu estructuras de datos? La solucin sera ms aproximada si hubiera una correspondencia lo ms estrecha posible entre los mens y ventanas y sus correspondientes elementos de programa
' Booc~, Giady: Anlisis y diseo orientado a objetos coii aplicacioi~es 2' edicidn AddisonWesleypaz de Santos, 1995
70
1l
71
Un programa puede parecer orientado a objetos, pero si cualquiera de estos elementos no existe, no es un programa orientado a objetos Especificamente, la programacin sin herencia es distinta de la programacin orientada a objetos; se denomina programacin con tipos abstractos de datos o piograrnacin basada en objetos El concepto de objeto, al igual que los tipos abstractos de datos o tipos definidos por el usuario, es una coleccin de elementos de datos, junto con las funciones asociadas utilizadas para operar sobre esos datos Sin embargo, la potencia real de los objetos reside en el modo en que los objetos pueden definir otros objetos Este proceso, ya comentado en el Captulo 1: se denomina herencia y es el mecanismo que ayuda a construir programas que se modifican fcilmente y se adaptan a aplicaciones diferentes Los conceptos fundamentales de programacin son: objetos, clases, herencia, rnensajes y polimorfisino
L.os datos y las funciones (procedimientos en Object-Pascal) asociados se dicen que estn eizcapsulados en una nica entidad o mdulo La encapsulacin de datos y ocultacin de datos son trminos importantes en la descripcin de lenguajes orientados a objetos Si se desea modificar los datos de un objeto, se conoce exactamente cules son las funciones que interactan con el mismo Ninguna otra fuiicin puede acceder a los datos Esta caiacteristica simplifica la escritura, depuracin y mantenimiento del programa
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 1
Pblico
Figura 3 4
Privado
El modelo objeto,
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
r q
Nombre del objeto Nombre del objeto
I
73
Atiibutos Mtodos
Datos o variables que caracterizan el estado de un objeto Procedimientos o acciones que cambian el estado de un objeto
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
Atributos Mtodos
y operaciones (c) (d) Figura 3 5 . Notaciones grficas de objetos: (a) Taylor; (b) Yourdon/Coad; (c) OMT; (d) Booch,,
Los objetos tienen un interfaz pblico y una representacin privada que permiten ocultai la informacin que se desee al exterior
lntertaz pblico
i . ; . . ._
Figura 3 8
Representacin
Consideremos una ilustracin de un coche vendido por un distribuidor de coches El identificado1 del objeto es Cochel Los atributos asociados pueden ser: nmero de m a t r i c u l a , f a b r i c a n t e , precio-compra, p r e c i o a c t u a l , fecha-compra El objeto Cochel se muestra en la Figura 3 6
u
Figura 3 6 El objeto Cochel
74
75
Objeto
3..3. CLASES
Una clase es la descripcin de un conjunto de objetos; consta de mtodos y datos que resumen caractersticas comunes de un conjunto de objetos Se pueden definir muchos objetos de la misma clase Dicho de otro modo, una clase es la declaracin de un tipo objeto Las clases son similares a los tipos de datos y equivalen a modelos o plantillas que describen cmo se construyen ciertos tipos de objetos Cada vez que se construye un objeto a partir de una clase, estamos creando lo que se llama una instancia de esa clase Por consiguiente, los objetos no son ms que instancias de una clase Una instancia es una variable de tipo objeto En general, instancia de una clase y objeto son trminos intercambiables
-..
. . . - -. -
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,
-- .
... .
-. ..
. .
Un objeto cs una instancia de unti cl.isc. 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
Cool denadas
Mtodos Fijar Leer x Leer y
Objeto 3
Objeto 2
/ Funcin
Figura 3.,10 Diagrama orientado a objetos
miembro
Obletos de la clase P u n t o
Mdtodos 1
obleto 1
Mdtodo, 2
obleto 2
Mtodos 3
objeto 3
76
77
En Turbo Pascal se define una clase (en terminologa de Borland se denomina objeto) con la palabra object
tme inomre-clase, = object <lista de campos de datos, <lista de cadenas de funciones y procedimientos> end;
En realidad, una clase es un tipo de dato definido por el usuario que 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
int x; int pesetas;
y el elemplo de un objeto P u n t o
type Punto =
object
X,Y
. Integer,
Punto;
3.3.,2. Sintaxis
En C++ se puede declarar una clase de la siguiente forma:
class Punto int x int v: public: void fijarXY (int a , ~ n t b)
(
x = a; y = b:
La sintaxis anterioi ha definido la clase punto, pero no ha creado ningn objeto Para crear un objeto de tipo P u n t o tendr que utilizarse una declaracin del tipo correspondiente, al igual que se declara cualquier variable de un tipo incorporado C + +
Punto P:
//
78
79
definidas por el usuario se denominan mtodos Para llamar a uno de estos mtodos se hace una peticin al objeto: esta accin se conoce como enviar un mensaje al objeto Por ejemplo, para detener un objeto automvil se enva un mensaje de parada (stop) Obsrvese que esta operacin se basa en la nocin de encapsnlacin (encapsulamiento): se indica al objeto lo que ha de hacer, pero los detalles de cmo funciona se han encapsulado (ocultado)
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
3.4.1.
Definicin de objetos2
Un objeto (desde el punto de vista formal se debera hablar de clase), como ya se ha comentado, es una abstraccin de cosas (entidades) del inundo real, tales que: Todas las cosas del mundo real dentro de un conjunto -denominadas irzrtancias- tienen las mismas caractersticas Todas las instancias siguen las mismas reglas Cada objeto consta de: Estado (atributos) Operaciones o comportamiento (mtodos invocados por mensajes) Desde el punto de vista inforrntico, los objetos son tipos abstvactos de datos (tipos que encapsulan datos y funciones que operan sobre esos datos) Algunos ejemplos tpicos de objetos:
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 )
Matricula Licencia del piloto Nombre de avin Capacidad de carga Nmero de pasajeros
3.4.2.
Identificacin de objetos
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 a especfica (aadir, borrar, cambiar formato ) Operaciones que realizan un clculo o proceso
El primei problema que se nos plantea al analizar un problema que se desea implementar mediante un programa orientado a objetos es identificar los obje""ando se habla de modo genrico, en iealidad se debera hablar de CLASES, dado que la clase en el tipo de dato y objeto es s61o una instancia, ejemplar o caso de la clase Aqu mantenemos el trmino objeto por conservar la rigurosidad de la definicin orientado a objetos, aunque en realidad la definicin desde el punta de vista tcnico sera la clase
' PRESSMAN, Roger: 1izgeniei.a de1 rofrwaie Uii eofoque pi.dctico 3 " edicin McGraw-Hill, 1993
80
81
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
La caja se etiqueta con el nombre del objeto y representa el lmite o f~ontera entre el interior y el exterior de un objeto Objeto
Campos miembro
Funciones miembro
:
+
(zIIIr3
Interior
, L , +
1
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 e os saludo1 Saludol
S 2
Visualizar
Figura 3 12
El objeto Saludol
82
83
Un objeto es un simple elemento, no importa lo complejo que pueda ser Una clase, por el contrario, describe una familia de elementos similares. En la prctica, una clase es como un esquema o plantilla que se utiliza para definir o crear objetos A partir de una clase se puede definir un nmero determinado de objetos Cada uno de estos objetos generalmente tendr un estado particular propio (una pluma estilogrfica puede estar llena, otra puede estar medio llena y otra totalmente vaca) y otras caractersticas (como su color), aunque compartan algunas operaciones comunes (como escribir o llenar su depsito de tinta) L.os objetos tienen las siguientes caractersticas: Se agrupan en tipos llamados clases Tienen dato7 internos que definen su estado actual Soportan ocultaciiz de datos Pueden Izeredar propiedades de otros objetos Pueden comunicarse con otros objetos pasando meiz~ajes Tienen mtodos que definen su coinportamieizto
La Figura 3 13 muestra el diseo general de diagramas que representan a una clase y a objetos peitenecientes a ella
Clase
rnove-hor rnove-ver
);
Campo miembro
Funciones miembro
Las variables de estado pueden sei las coordenadas actuales de la ventana y sus atributos de color actuales En muchos casos, las variables de estado se utilizan slo indirectamente As, en el caso del ejemplo de la ventana, suponga que una orden (mandato) tpica a la ventana es:
reducir en 5 filas y 6 columnas
Esto significa que la ventana se reducir en tamao una cantidad dada por 5 filas y 6 columnas:
mensaje reducir
Una clase es un tipo definido que determina las estructuras de datos y operaciones asociadas con ese tipo L.as clases son como plantillas que describen cmo ciertos tipos de objetos estn construidos. Cada vez que se construye un objeto de una clase, estamos creando lo que se llama una instancia (modelo o ejemplar) de una clase y la operacin correspondiente se llama instanciacin (creacin de instancias) Por consiguiente, los objetos no son ms que instancias de clases En general, los trminos objeto e inrtai~ciade una clase se pueden utilizar indistintamente
Afortunadamente, no necesita tener que guaidar la posicin actual de la ventana, ya que el objeto hace esa operacin por usted La posicin actual se almacena en una variable de estado que mantiene internamente la ventana Naturalmente, se puede acceder a esta variable estado cuando se desee, enviando un mensaje tal conlo:
indicar posicion actual
84
Programacin
orientada a objetos
85
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
87
3.5..1. Sintaxis
1
Dado que derivada hereda todos los datos y mtodos de base, no se necesita redefinirlos; simplemente indicar al compilador que desea derivar un nuevo tipo (derivado) de un tipo base (base) y aadir el nuevo mtodo. L.a herencia permite construir tipos de datos complejos sin repetir mucho cdigo El nuevo tipo hereda unas caractersticas y comportamiento de un ascendiente o antepasado Puede tambin reimplementar o sobrescribir cualquier mtodo que elija Esta reimplementacin de mtodos del tipo base en los tipos derivados es fundamental el concepto de polimorfismo, que se ver ms tarde,
En lenguaje Pascal orientado a objetos (versiones Turbo 5 5 a 7 O), la sintaxis de una clase (objeto en su terminologa) es:
tme
<nombre-clase, = object (clase ascendiente) <campos propios de nuevo objeto> <mtodos propios del nuevo objeto,
end;
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 {
;
Herencia simple
Herencia mltiple
void hacerOtraCosa ( 1
1;
En Turbo Pascal,
derivada = object (base) procedure hacerotracosa;
end;
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
89
LOS MENSAJES
(11) derivada de base (01) (111) derivada de (11) (12) derivada de base (01) (13) derivada de base (01) Ya se ha mencionado en secciones anteriores que los objetos realizan acciones cuando ellos reciben mensajes El mensaje es esencialmente una orden que se enva a un objeto para indicarle que realice alguna accin. Esta tcnica de enviar mensajes a objetos se denomina pasal. mensajes Los objetos se comunican entre s enviando mensajes, al igual que sucede con las personas Los mensajes tienen una contrapartida denominada mtodos Mensajes y mtodos son dos caras de la misma moneda Los mtodos son los procedimientos que se invocan cuando un objeto recibe un mensaje En terminologa de programacin tradicional, un mensaje es una llamada a una funcin Los mensajes juegan un papel crtico en P O 0 Sin ellos los objetos que se definen no se podrn comunicar entre s Como ejemplo, consideramos enviar un mensaje tal como subir 5 lheas el objeto ventana definido anteriormente El aspecto importante no es cmo se implementa un mensaje, sino cmo se utiliza Consideremos de nuevo nuestro objeto ventana Supongamos que deseamos cambiar su tamao, de modo que le enviamos el mensaje
Reducir 3 columnas p o r la derecha
Herencia mltiple Base (01) (11) derivada de base (01) (111) derivada de (11) (12) derivada de (02)
1
Observe que no le indicamos a la ventana cmo cambiar su tamao, la ventana maneja la operacin por s misma De hecho, se puede enviar el mismo mensaje a diferentes clases de ventanas y esperar a que cada una realice la misma accin Los mensajes pueden venir de otros objetos o desde fuentes externas, tales como un ratn o un teclado
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 " --
7
1
Calcular precio ( )
l
Figura 3 20
Estructura de un mensaje
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,
Cuando un objeto est inactivo (durmiendo) y recibe un mensaje se hace activo El mensaje enviado por otros objetos o fuentes tiene asociado un mtodo que se activar cuando el receptor recibe dicho mensaje La peticin no especifica cmo se realiza la operacin Tal informacin se oculta siempre al emisor El conjunto de mensajes a los que responde un objeto se denomina comportamiento del objeto No todos los mensajes de un objeto responden; es preciso que pertenezcan al interfaz accesible,
Nombre de un mensaje
C ~ b j e t emisor o
l J -
- .I[_->
Prueba ( ) Objeto receptor Calcular-precio (100) Producto Objetos emisor y receptor 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
Figura 3 19
Estructuralmente, un mensaje consta de tres partes: Identidad del receptor El mtodo que se ha de ejecutar
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.
Paso de mensajes
A b r i t " I l
.....
~~~
~~.~ . ..
~~~~
~~...
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:
. .....
.. . .....
~~~~~
Mtodos Clase
Objetos
1 2 3
Figura 3 2 1 Notacin grfica OMT de una clase y de u n objeto Alimento Atributos Servicios -
En primer l u g a ~ , un objeto receptor que ha de recibir el mensaje que se ha especificado Los objetos no especificados por el emisor no respondern El receptor trata de concordar el nombre del mensaje con los mensajes que l entiende Si el mensaje no se entiende, el objeto receptor no se activar Si el mensaje se entiende por el objeto receptor, el receptor aceptar y responder al mensaje invocando el mtodo asociado Los parmetros o argumentos pueden ser:
1
Figura 3 22
3.7.1. Atributos
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
El ejemplo siguiente muestra algunos mensajes que se pueden enviar al objeto Cochel El primero de stos invoca al mtodo Precio-Coche y no tiene argumentos, mientras que el segundo, F i j a r q r e c i o , enva los parmetros 8-10-92, y p o n e r - e n b l a n c o no tiene argumentos
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
3.7.2.
Mtodos
3.7.
Los mtodos (operaciones o servicios) describen el coinportamiento asociado a un objeto Representan las acciones que pueden realizarse por un objeto o sobre un objeto La ejecucin de un mtodo puede conducir a cambiar el estado del objeto o dato local del objeto Cada mtodo tiene un nombre y un cuerpo que realiza la accin o comportamiento asociado con el nombre del mtodo En un LOO, el cuerpo de un mtodo consta de un bloque de cdigo procedimental que ejecuta la accin requerida Todos los mtodos que alteran o acceden a los datos de un objeto se definen dentro del objeto Un objeto puede modificar directamente o acceder a los datos de otros objetos
94
95
Un mtodo dentro de un objeto se activa por un mensaje que se enva por otro objeto al objeto que contiene el mtodo De modo alternativo, se puede llamar por otro mtodo en el mismo objeto por un mensaje local enviado de un mtodo a otro dentro del objeto
m
Objeto A
Cul es la diferencia entre una clase y un objeto, con independencia de su complejidad? Una clase verdaderamente describe una familia de elementos similares En realidad, una clase es una plantilla para un tipo particular de objetos Si se tienen muchos objetos del mismo tipo, slo se tienen que definir las caractersticas generales de ese tipo una vez, en lugar de en cada objeto A paitir de una clase se puede definir un nmero de objetos Cada uno de estos objetos tendr generalmente un estado peculiar propio (una pluma puede estar rellenada, otra puede estar medio-vaca y otra estar totalmente vaca) y otras caractersticas (como su color), aunque compartirn operaciones comunes (como <<escribir, llenar, poner el capuchn, etc) En resumen, un objeto es una instancia de una clase
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
Instancia (objeto) de la clase Figura 3.,24 Una clase y una instancia (objeto) de la clase (Notacin Booch), Clase Instancias corno registros Servicio Horas Frecuencia I>eicucnro
96
97
(Cuenta Ahorro)
ramente un soporte poderoso para reutilizacin y extensibilidad, dado que la definicin de nuevos objetos se pueden basar en clases existentes Como ejemplo, considrese la jerarqua de herencia mostrada en la Figura 1 2 6
Clase
Instancia
Los objetos ocupan espacio en memoria, y en consecuencia existen en el tiempo, y debern crearse o instanciarse (probablemente a partir de otros objetos) Por la misma razn, se debe liberar el espacio en memoria ocupado por los objetos Dos operaciones comunes tpicas en cualquier clase son: Constructor: una operacin que crea un objeto y/o inicializa su estado Destructor: una operacin que libera el estado de un objeto y10 destruye el propio objeto En C + + los constructores y dest~ucto~es se declaran como parte de la definicin de una clase La creacin se suele hacer a travs de operaciones especiales (constructores en C + + , p i l a ) ; estas operaciones se aplicarn implcitamente o se debern llamar explcitamente por otros objetos, como sucede en C + + Cuando se desea crear una nueva instancia de una clase, se llama a un mtodo de la propia clase para realizar el proceso de construccin Los mtodos constructores se definen como mtodos de la clase De modo similar, los mtodos empleados para destruir objetos y liberar la memoria ocupada (destructores en C + + , - p i l a ) tambin se definen dentro de la clase
..
Figura 3 2 6
Jerarqua de herencia
Las clases de objeto mamifero, pjaro e insecto se definen como subclases de animal; la clase de objeto persona, como una subclase de mamifero, y un hombre y una mujer son subclases de persona Las definiciones de clases para esta jera~quapuede tomar la siguiente estr nctura:
clase criatura atributos tipo : ctring; peco : real; algun tipo de habitat 1 habitat : 1 operaciones crear ( ) +criatura; predadorescriatura) -fijarlcriatural; esperanza-vidacriatura) -entero; end criatura clase mamifero inherit criatura; atributos (propiedades) periodo-gestacion: real; ogeraciones end mamifero clase persona inherit mamifero, propiedades
-- - .-.-
---
- - .--
-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.
Las clases se organizan como jerarquia de clases La ventaja de definir clases en una jerarqua es que a travs de un mecanismo denominado herencia, casos especiales comparten todas las caractersticas de sus casos ms generales La herencia es una caracterstica por la que es posible definir una clase, no de un borrador, sino en trminos de otra clase Una clase hereda sus caractersticas (datos y funciones) de otra clase Esta caracterstica proporciona cla-
98
99
En la Figura 3 28 la clase C tiene dos superclases, A y D Por consiguiente, la clase C hereda las propiedades de las clases A y D Evidentemente, esta accin puede producir un conflicto de nombres, donde la clase C hereda las mismas propiedades de A y D
clase mujer inherit persona; propiedades esposo: man; nombre: ctring; end mujer
La herencia es un mecanismo potente para tratar con la evolucin natural de un sistema y con modificacin incremental [Meyer, 19881 Existen dos tipos diferentes de herencia: simple y mltiple,
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~as que la clase C puede hetedar selectivamente algunas propiedades de la superclase A y algunas de la superclase D
Herencia mltiple
3.9.1.
Problemas 1 La propiedad referida solo est en una de las subclases padre No hay problemas Atributos Nombre Direccin Estudios Salario Das-Vacaciones Mtodo Aumento Salario ~ t o d oheredados s Aumento-Salario
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
Figura 3.,29 Herencia de atributos y mtodos Existen diferentes tipos de conflictos que pueden ocurrir:
Conflictos de nombres
100
101
Una clase abstracta es COCHE-TRANSPORTE-PASAJEROS Una subclase es SEAT, que puede tener instancias directamente, por ejemplo Coche1 y
Coche2
Por ejemplo,
Conflicto de nombres Nombre Nombre-estudiante
+ inyectores
lmpresora matricial Figura 3.31. La clase abstracta impresora, Las clases derivadas de una clase base se conocen como clases concretas, que ya pueden instanciarse (es decir, pueden tener instancias)
1 Una lista de precedencia de clases, como sucede en LOOPS y FLAVORS 2 Una precedencia especificada por el usuario para herencia, como en
Smalltalk 3 Lista de precedencia del usuario, y si no sucede as, la lista de precedencia de las clases por profundidad
Figura 3 30
Como se ha comentado anteriormente, los atributos y mtodos definidos en la superclase se heredan por las subclases Sin embargo, si la propiedad se define nuevamente en la subclase, aunque se haya definido anteriormente a nivel de superclase; entonces la definicin realizada en la subclase es la utilizada en esa subclase Entonces se dice que anulan las correspondientes propiedades de la superclase Esta propiedad se denomina anulacin o sustitucin (overriding)
102
103
Supongamos que ciertos atributos y mtodos definidos en la clase A se redefinen en la clase C Las clases E, F, G y H heredan estos atributos y mtodos La cuestin que se produce es si estas clases heredan las definiciones dadas en la clase A o las dadas en la clase C El convenio adoptado es que una vez que un atributo o mtodo se tedefine en un nivel de clases especfico, entonces cualquier hijo de esa clase, o sus hijos en cualquier profundidad, utilizan este mtodo o atributo redefinido Por consiguiente, las clases E, F, G y H utilizarn la redefinicin dada en la clase C, en lugar de la definicin dada en la clase A
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,
><
Empleado
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
para sumar:
= a
naci;n A[i]
:=
Al[il + A2[il
//para todo i
Ingeniero Beneficios Calcular_Comisin = 0,05 * Presupuesto Salario [40-801 Edad [25-651 Incrementar CalcularComisin = 0.03 * Presupuesto
Figura 3 3 3 Sobrecarga,
como unin de dos conjuntos SI y s2 j,Cino se asocia una operacin particulai o mensaje a un mtodo? La respuesta es mediante la ligadura dinmica (dyizainic birzding),que se ver posteriormente
104
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,
Mtodo virtual
2
Mtodos o funciones virtuales
Figura 3 34
Los objetos contenidos pueden cambiar en tamao y composicin, sin afectar al objeto compuesto que los contiene Esto hace que el mantenimiento de sistemas complejos de objetos anidados sea ms sencillo, que sera el caso contrario,, Los objetos contenidos estn libres para participar en cualquier nmero de objetos compuestos, en lugar de estar bloqueado en un nico objeto compuesto
106
107
c5
Figura 3.,37 Relacin de agregacin (tiene-un)
Un objeto compuesto
Objetos compuestos
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 Sistema transmisin Chasis Articulo Cliente Artculo Figura 3 38 Objetos compuestos (dos objetos orden-compra7)
3.13.2.
Niveles de profundidad
que La relacin palte-de puede representarse tambin por has-a (tieize-UII), indica la relaciri que une al objeto agregado o co~ztiize~zte En el caso del objeto compuesto COCHE se leer: COCHE tiene-un MOTOR, lieize-un SISTEMA-DEFRENOS, etC
TAYLOR, Davld Ol>jcir-Oiialred Infoiiiiatioi, Syrrciii Wiley, 1992
Los objetos contenidos en objetos compuestos pueden, por s mismos, ser objetos compuestos, y este anidamiento puede ir hasta cualquier profundidad Esto
Este ejemplo esta citada en: TAYLOK, David: up cir pg 45 Asimismo, la notacidn de objetos empleada por Taylor se ha mantenido en varios ejeinplos de nuestra obra, ya que la consideramos una de las ms idneas para reflejar el concepto de objeto; esta obra y otras suyas sobie el tema son consideradas como aportaciones muy notables al mundo cientfico de los objetos
'
108
109
significa que puede construir estructuras de cualquier complejidad conectando objetos juntos Esto es importante debido a que normalmente se necesita ms de un nivel de modulariracin para evitar el caos en sistemas a gran escala, Un objeto compuesto, en general, consta de una coleccin de dos o ms objetos relacionados conocidos como objetos componentes Los objetos componentes tienen una relacin una parte-de o un componente-de con objeto compuesto Cuando un objeto compuesto se instancia para producir un objeto instancia, todos sus objetos componentes se deben instanciar al mismo tiempo Cada objeto componente puede, a su vez, ser un objeto compuesto, resultando, por consiguiente, una jerarqua de componentes-de Un ejemplo de un objeto compuesto es la clase COCHE Un coche consta de diversas partes, tales como un motor, un sistema de frenos, un sistema de transmisin y un chasis; se puede considerar como un objeto compuesto que consta de partes diferentes: MOTOR, SISTEMA-FRENOS, SISTEMA-TRANSMISION,CHASIS Estas partes constituyen los objetos componentes del objeto COCHE,de modo que cada uno de estos objetos componentes pueden tener atributos y mtodos que los caracterizan
La jerarqua componente-de ( p u fte-de) pueden estar solapadas o anidadas Una jerarqua de solapamiento consta de objetos que son componentes de ms de un objeto padre Una jerarqua anidada consta de objetos que son componentes de un objeto padre que, a su vez, puede actuar como componente de otro objeto. El objeto Z es un componente del objeto B, y el objeto B es un componente de un objeto complejo ms grande, A
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
1
MOTOR
Figura 3 4 0
Tipo:
ABS:
Anidamiento de objetos,
Atributos:
Nmero-cilindras Potencia Cilindrada Vlvulas-cilindro Proveedor:
Un ejemplo tpico de un objeto compuesto anidado es un archivador Un archivador contiene cajones, un cajn contiene carpetas y una carpeta contiene documentos El ejemplo COCHE, citado anteriormente, es tambikn un objeto compuesto anidado
3.14.
Atributos:
Tipo: Color:
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
111
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
terstica El smbolo +, cuando se utiliza con enteros, representa un conjunto de instrucciones mquina distinto de cuando los operadores son valores reales de doble precisin De igual modo, en algunos lenguajes el smbolo + sirve para realizar sumas aritmticas o bien para concatenar (unir) cadenas, La utilizacin de operadores o funciones de formas diversas, dependiendo de cmo se estn operando, se denomina poliilzo~fisilzo(mltiples formas) Cuando un operador existente en el lenguaje tal como +, = o x; se le asigna la posibilidad de operar sobre un nuevo tipo de dato, se dice que est sob~ecargado La sobiecaiga es una clase de polimorfismo, que tambin es una caracteistica importante de P O 0 Un uso tpico de los operadores aritmticos es la sobrecarga de los mismos para actuar sobre tipos de datos definidos por el usuario (objetos), adems de sobre los tipos de datos predefinidos Supongamos que se tienen tipos de datos que iepresentan las posiciones de puntos en la pantalla de un computador (coordenadas x e y) En un lenguaje orientado a objetos se puede realizar la operacin aritmtica
posicin1 = origen
posicin2
donde las variables posicinl, posicin2 y o~igen representan 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
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-
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: La programacin orientada a objetos incorpora estos seis componentes importantes: Objetos Clases Mtodos Mensajes Herencia. Polimorfismo Un objeto se compone de datos y funciones que operan sobre esos objetos La tcnica de situar datos dentro de objetos de modo que no se puede acceder directamente a los datos se llama ocultacin de la informacin Una clase es una descripcin de un conjunto de objetos Una instancia es una variable de tipo objeto y un objeto es una instancia de una clase, La herencia es la propiedad que permite a un objeto pasar sus propiedades a otro objeto, o dicho de otro modo, un objeto puede heredar de otro objeto Los objetos se comunican entre si pasando mensajes La clase padre o ascendiente se denomina clase base y las clases descendientes clases derivadas La reutilizacin de software es una de las propiedades ms importantes que presenta la programacin orientada a objetos El polimorfismo es la propiedad por la cual un mismo mensaje puede actuar de diferente modo cuando acta sobre objetos diferentes ligados por la propiedad de la herencia
CAPITULO
CONTENIDO
4 1 Evolucin de los LPOO 4 , 2 Clasificacin de lenguajes orientados a objetos 4 , 3 Ada
4.4
Eiffel
~ ~~ ~
RESUMEN EJERCICIOS
Este capitulo describe: La evolucin de los lenguajes de programacin orientados a objetos, desde Simula a Object COBOL,, Las caractersticas de un lenguaje orientado a objetos, La clasificacin de los lenguajes orientados a objetos basados en objetos, orientados a objetos (puros e hbridos) basados en objetos, orientados a objetos basados en clases, Una descripcin breve de los lenguajes ms utilizados: Smalltalk, C++, Objective-C, Eiffel, Object Pascal, Visual BASlC y Ada,
114
115
41.
Al principio de la dcada de los sesenta, Kristen Nygaard y Ole-Johan Dhal desarrollaron Simula en el Norwegian Computer Center (NCC), un lenguaje que soportaba modelizacin para simulacin de procesos industriales y cientficos Fue un lenguaje de propsito general que ofreca capacidad de simulacin de sistemas Sin embargo, sus usuarios descubrieron pronto que Simula proporcionaba nuevas y poderosas posibilidades parafiizes distintos de la simulacin, como la elaboracin de prototipos y el diseo de aplicaciones. L.as sucesivas versiones de Simula fueron mejorndose hasta llegar a Simula-67 (aparicin en diciembre de 1966) Simula-67 se derivaba de Algol 60, donde tiene sus races, y se dise fundamentalmente como un lenguaje de programacin de diseo; tom de Algo1 el concepto de bloque e introdujo el concepto de objeto 1.0s objetos de Simula tenan su propia existencia y podan comunicarse entre s durante un proceso de simulacin Conceptualmente, un objeto contena tanto datos como las operaciones que manipulaban esos datos Las operaciones se llamaron mtodos Simula incorporaba tambin la nocin de clases, que se utilizaron para describir la estxuctura y comportamiento de un conjunto de clases La herencia de clases fue tambin soportada por Simula La herencia organiza las clases en jerarquas, permitiendo la compartimentacin de implementacin y estructura. En esencia, Simula sent la base de los lenguajes orientados a objetos y defini algunos de los conceptos clave de la orientacin a objetos Adems, Simula era un lenguaje fuertemente tipificado Esto significa que el tipo de cada variable se conoce en tieinpo de compilacin, de modo que los errores que implican tipos se encuentran en esta etapa y no cuando el programa se ejecuta Simula-67 fue el piimer lenguaje de programacin que incorpor mecanismos para soportar los conceptos orientados a objetos ms sobresalientes:
Ericapsulai~zientoy objetos, que agrupan juntos atributos de datos y acciones (mtodos) que procesen esos datos Verificaciiz e~ttica de 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>ning Languager Addison-Wesley, 2nd edil 1993
116
117
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
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~zte tipificados 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
4.1.1.
La dcada de los ochenta lanz la orientacin a objetos como base de la futura ingeniera de software orientada a objetos de la dcada de los noventa En 1982 se predijo que la piogramacin orientada a objetos sera en la dcada de los
118
119
ochenta lo que la programacin estructurada fue en los setenta [Rentsch, 19821 La piofeca se cumpli y la dcada de los ochenta se consagr como el origen de la explosin de la orientacin a objetos que se producira en la dcada de los noventa Sin duda, el desarrollo de conferencias internacionales sobre orientacin a objetos y, en especial, OOSPLA (Object-Oriented Programming Systems and LAnguages) han sido los detonantes de la explosin de la 00 en la dcada de los noventa La primera conferencia se celebr en el ao 1986 Otros hitos que han influido considerablemente en el enorme desarrollo de los LPOO han sido la aparicin de diferentes publicaciones peridicas exclusivamente dedicadas a orientacin a objetos En 1988 apareci la primera revista de prestigio: Ihe Iournal of Object-Oriented Programming En la dcada de los noventa, los lenguajes, tcnicas, interface5 grficos y bases de datos se estn haciendo muy populares Sin duda, los noventa ser la dcada de la proliferacin de tecnologas y lenguajes orientados a objetos Microsoft, IBM, Borland, Sun, A'I&T, Digitalk, Symantec y otras grandes compaas estn lanzando productos orientados a objetos de modo continuo y progresivo Los lenguajes ms implantados en la actualidad son Smalltalk y Eiffel, junto con C + + , Object Pascal (Turbo/Borland Pascal especialmente), Visual BASIC y Object Visual como lenguajes hbridos C f + es, sin lugar a dudas, el lenguaje ms popular, aunque Smalltalk est ganando adeptos da a da Tanto C + + como Smalltalk han sido implementados en diferentes plataformas: DOS, UNIX, OS/2, Windows e incluso en sistemas grandes; su importancia reside en la gran cantidad de desarrolladores y vendedores que comercializan estos lenguajes,
1 Basado en objetos Un lenguaje de programacin es basado en objetos si su sintaxis y semntica soportan la creacin de objetos que tienen las piopiedades descritas en los captulos anteriores 2 Basado en clases Si un lenguaje de programacin es basado en objetos y soporta adems la creacin de clases, se considera basado en clases, 3 O~ientacin a objetos. Un lenguaje de programacin orientado a objetos es un lenguaje basado en clases que soporta tambin herencia
Objetos
Basado en objetos
+\
Clu
+ clases
+ herencia
Actor Clipper 5 X
Basado en clases
/ Orientado a objetos /
C++ Eiffel Simula Smalltalk Turbo Borland Pascal Delphi Visual Object Obiect COBOL
da-95
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
121
es una definicin de tipos como la clase C + + , y en consecuencia Ada es un lenguaje basado en objetos Ada-95 soporta, adems de las propiedades de Ada-83, clases y herencia, y se puede considerar orientado a objetos De acuerdo a la taxonoma de Wegner, se podra actualizar la clasificacin de los lenguajes pensando en la segunda dcada de los noventa: Ada-83, Actor, Clipper 5 2, Visual Basic 4 Leizguajes basados erz objetos Lerzguajer basados eiz clase? Clu Lenguajes o1,ientados a objetos C + + , Objective-C, Object Pascal, Delphi, Visual Object, Object COBOL,, Overon Eiffel, Smalltalk, Simula, Prolog++, CL.OS, Ada-95
10
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
1 lipificacin estricta (fuerte) Iipificacidiz es el proceso de declarar el tipo d'e informacin que puede contener una variable Los errores de programacin ielacionados con el nmero de parmetros, tipos de parmetros e interfaces de mdulos, se detectan durante las fases de diseo e implementacin, en lugar de en tiempos de ejecucin 2 Encapsulamiento. Es deseable que el lenguaje soporte ocultacin de la informacin, mediante partes independientes, para la especificacin y la implementacin Esta caracterstica proporciona un diseo dbilmente acoplado que cumple con rigor el principio bsico de la inferencia de software: acoplamiento d6bil y fuerte cohesin entre los mdulos de un programa 3 Compilacin incremental Caracterstica en el desarrollo de sistemas grandes, en los que las porciones del sistema se crean e implementan de un modo sistemtico (poco a poco, etapa a etapa) Esta caracterstica complementa la caracterstica de tipificacin estricta, que soporta partes independientes de implementacin y especfica. 4 Genericidad L,as clases parametrizadas (mediante plantillas -templates- o unidades genricas) sirven para soportar un alto grado de reusabilidad (reutilizacin) Estos elementos genricos se disean con parmetros brmales, que se instanciarn con parmetros reales, para crear instancias de mdulos que se compilan y enlazan y ejecutan posteriormente 5 Paso de mensajes.. El lenguaje es conveniente soporte paso bidimensional de mensajes entre mdulos, lo que implicar mdulos dbilmente acoplados y diseos flexibles Esto significa que se deben poder
Los lenguajes de programacin disponibles actualmente no cumplen todas las caractersticas citadas anterioimente En geneial, los lenguajes orientados a objetos no soportan concurrencia; este es el caso de C + + , aunque las versiones de C++que siguen el futuro estndar 4 0 comienzan a incorporar propiedades de concurrencia e incluso persistencia Asimismo, Ada-95, adems de concurrencia, soporta ya herencia y polimorfismo
122
123
+
tradicional
Figura 4.3, Lenguajes 00 purosihibridos,, construye sobre la base de los objetos, se pueden realizar cambios profundos si son necesarios Existe un piecio, sin embargo, a la potencia y flexibilidad de los lenguajes puros L.a mayora de los lenguajes puros no son tan rpidos como los hbridos y son difciles de codificar en toda clase de operaciones fundamentales Esto les hace perder eficiencia en tiempo de ejecucin. En contraste, los lenguajes hbridos pierden con frecuencia alguna de las caractersticas de los lenguajes puros y normalmente no permiten modificar caractersticas de construccin del lenguaje base; aunque, como ya se ha comentado, son normalmente ms rpidos para operaciones construidas en el lenguaje base Los lenguajes puros e hbridos difieren tambin en la facilidad de aprendizaje, si bien esta facilidad depender del nivel de cada persona As, para un programador la enseanza de un lenguaje puro normalmente es ms fcil, ya que es ms sencillo: slo ha de aprenderse un lenguaje y no dos, como en el caso de un lenguaje hbrido Sin embargo, para un piogramador experimentado, el movimiento o emigtacin hacia un lenguaje hbrido puede ser ms fcil si est ya familiarizado con el lenguaje base, pues entonces s61o necesita dominar las extensiones orientadas a objetos En la actualidad, C + + es el lenguaje ms popular y utilizado; sin embargo, Smalltalk est ganando da a da en aceptacin, debido esencialmente a estar soportado por las plataformas DOS, UNIX y Windows El hecho de que en 1994 IBM lanzase versiones de Smalltalk para sus sistemas OS12 y AIX har crecer el nmero de usuarios de este lenguaje
quier intento de situat otra clase de datos en la variable producir un mensaje de errot Algunos lenguajes de objetos requieren que a todas las variables se les asigne un tipo antes de que se pueda utilizar Otros lenguajes no requieren esos requisitos, petmitiendo que las variables puedan tomar sus tipos adecuados en cualquier instante dado Estas dos opciones se denominan tipificacin fuerte, estricta o esttica, y tipificacin dbil, no estricta o diizmica La tipificacin fuerte o sistemas de tipos estticos exige que el progtamador asocie explcitamente un tipo con cada nombre declarado en un programa, de modo que el coinpilador del lenguaje puede verificar que los nombres y expresiones compuestas de estos nombres se refieren siempre a los objetos del tipo especificado El tipo de cada objeto se ha de determinar y comprobai antes que se ejecute el programa Lenguajes con sistemas de tipos estticos son los tradicionales FORTRAN, COBOL y PASCAL.. L.a tipificacin fuerte es menos flexible pero ms segura, ya que el lenguaje puede realizar comprobaciones de iutinas para asegurar que los parmetros de los mensajes sean de tipo correcto L.as ventajas considerables de un lenguaje tipificado estticamente son que los eirores relativos a tipos se capturan (detectan) durante la compilacin, antes de que se ejecute el programa, y el programa se puede ejecutar ms eficientemente, dado que no hay necesidad de hacer ninguna veiificacin de tipos en tiempo de ejecucin, Los lenguajes con un sistema de tipos dinmicos (lenguajes de tipificacin dbil) no exigen que el programador haya de especificar el tipo de objeto que puedan contenei las variables cuando se escribe el programa Cada objeto conoce su propio tipo cuando se crea durante la ejecucin Las ventajas de los lenguajes con un sistema de tipos dinmicos son que los programas son ms flexibles y puede disponer de nuevos tipos de objetos que no fueion previstos cuando se escribi el programa Esta flexibilidad se hace a costa de una prdida de eficiencia durante la ejecucin del programa, debido a la necesidad de mantener y comprobar el tipo de todos los objetos durante la ejecucin Los lenguajes de objetos puros normalmente utilizan tipificacin dbil, ya que este enfoque les proporciona mxima flexibilidad, especialmente durante el desarrollo, cuando se crean nuevos tipos objetos Los lenguajes hibridos, en contraste, tienden a construirse como lenguajes fuertemente tipificados Es posible especificar el tipo de un aigumento, de modo que haya flexibilidad en tiempo de ejecucin, pero esta tarea requiere esfuerzos especiales
* test
Mtodo
definir
124
125
funcl0; break; cace ' * ' : func2 O : break; default : cout <i Cdigo desconocido:' c < car <c endl;
1
cace 'P' :
En este caso, la funcin invocada en respuesta a cada orden se conoce cuando el programa se est compilando, ya que cada funcin se llama explcitamente por el nombre En el caso de propiedades orientadas a objetos, la ligadura se considera como el proceso mediante el cual se determina el receptor de un mensaje En lenguajes que requieren ligadura esttica, la identidad del receptor se debe especificar cuando se crea el programa Si un lenguaje soporta ligadura dinmica, la identidad del receptor se puede dejar indeterminada hasta que se enva realmente el mensaje en tiempo de ejecucin La ligadura dinmica permite la implementacin de una de las caractersticas ms sobresalientes de la orientacin a objetos: el polimorfismo,
426.
el valor 3 se enlaza estticamente al nombre n, mientras que el tipo de dato i n t e g e r se enlaza al nombre x Por otra parte, consideremos la sentencia de asignacin x := 3; en este caso, se enlaza 3 dinmicamente a x cuando se ejecuta la sentencia de asignacin Y la sentencia
new (y1 ;
enlaza dinmicamente una posicin de almacenamiento a posicin el valor de y Ejemplo de ligadura esttica
yA
y asigna a esa
Se desea procesar una determinada funcin, segn sea un determinado carcter (cdigo) Mediante una sentencia s w i t c h se podra realizar el programa correspondiente en C + + :
static vaid salir O funcl O , func2 0 ; char car; 11; //czar, contiene el cdigo de carcter int codigo = toupper(car1; switch (codigo)
i
case 'S'
:
SalirO;
Los dos lenguajes ms utilizados en el desarrollo 00 y ms introducidos en el mercado son Eiffel, Smalltalk (en sus versiones 80 y V), C + + , Actor, ObjectiveC, CLOS, Object Pascal (especialmente 'Turbo Pascal) y Visual BASIC El lenguaje Ada se suele considerar por muchos autores como basado erz objetos, debido esencialmente a que soporta el concepto de abstraccin de datos mediante el paquete y la genericidad mediante unidades genricas; tainbin es considerado basado en objetos, debido a que Grady Booch, autor del famoso mtodo de diseo Booch, se apoy en dicho lenguaje en su primera versin del mtodo; la metodologa HOOD tambin se apoya en Ada como lenguaje fundamental La nueva versin Ada-95 ya es totalmente orientada a objetos El lenguaje Eiffel se examina brevemente, debido a que fue diseado para soportal totalmente la orientacin a objetos y otras caractersticas de ingeniera de software El uso de precondiciones, poscondiciones e invariantes mejoran significativamente la robustez y documentacin de programas desarrollados en Eiffel Smalltalk, como heredero directo de Simula, es el prototipo de lenguaje de programacin orientado a objetos puro Adems de estos lenguajes, realizaremos una sntesis de los lenguajes Objective-C, Object Pascal y Visual BASIC Por la importancia del lenguaje C + + y dado que es el lenguaje utilizado en este libro para la implementacin de los conceptos orientados a objetos, se dedicarn captulos especficos para ensear la escritura y sintaxis del lenguaje, as como reglas y consejos para mejorar el estilo de programacin y reglas y consejos para la depuracin de progiamas
126
127
4.,3.. ADA
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
Un tipo abstiacto de dato paia iepresentar nmeros completos con diferenles tipos de operacines en Ada es:
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
Ada sopoita genericidad Las unidades genricas son subprogiamas o paquetes parametiizados que permiten al usuario desarrollai cdigo reutilizable El foimato de una unidad genrica es:
128
129
La instanciacin de una unidad genrica crea una copia de la unidad genrica, Los parmetros genricos se corresponden con los parmetros reales durante la iustanciacin Se especifican tipos reales para todos los tipos formales genricos Una variable o una constante se especifica para todos los objetos genricos brmales Un nombre de funcin o subprograma se da a cualquier subprograma genrico As, por ejemplo, para instanciar un subprograma genrico I n t e r c a m b i o , que intercambia entre s el contenido de unas variables:
procedure Intercambio_INrEGER is new Intercarhio(1NTEGER);
como un leizguaje basado en objetos, en base a que soporta todo el concepto de tipo abstracto de datos La Figura 4 5 muestra las caractersticas de 00 de Ada, as como sus carencias
Ada-83 soporta
Tambin se puede instanciar un procedimiento llamado intercambioEmpleado, que intercambia dos registros empleado:
procedure Intercambio-Empleado is new Intercambio(Emp1eado);
Genericidad Sobrecarga (no totalmente) Verificacin esttica de tioos Encapsulamiento Ocultacin de la informacin Herencia Polimorfismo Extensibilidad Herencia Polimorfismo Extensibilidad
Figura 4 5
1
i
Un mtodo acreditado de diseo basado en Ada se denomina Hierurchical Object Oiieizted Design (HOOD), por lo que puede inducir a confusin entre descomposicin jerrquica de objetos, nica posibilidad con Ada, y las verdaderas jerarquas de clases que soportan abstracciones mediante generalizaciones y especializaciones El proyecto Ada 9x, cuyo borrador definitivo se conoce como Ada-95, ha definido un nuevo estndar de Ada publicado e11 1995, tanto por ISO como por ANSI, que propoiciona soporte completo orientado a objetos, aunque con ciertas restricciones todava sobre C + + , pero tambin con notables ventajas, como es el caso de la concurrencia
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
Eiffe13es un lenguaje orientado a objetos puro desaiiollado por Bertran Meyer de Interactive Software Environments Inc Su diseo se inspir en Simula, pero tambin muestra la influencia de Smalltalk y Ada Adems incorpora modernas tcnicas de ingeniera de software, que lo hacen idneo para construccin de software para grandes aplicaciones, permitiendo desarrollar aplicaciones robustas, exactas, transportables y eficientes. Eiffel es un lenguaje compilado tipificado fuertemente, que soporta la mayora de los conceptos orientados a objetos descritos en los captulos anteriores, tales como abstracciil de datos mediante clases, genericidad, herencia (simple y mltiple), ligadura dinmica y polimorfismo 'Tambin proporciona una amplia biblioteca de clases y soporta recoleccin de basura (garbage collection) El entorno Eiffel est especialmente concebido pala reas de ingeniera de software, tales como bases de datos o inteligencia artificial, y tiene un soporte muy limitado para objetos persistentes y concurrencia, aunque ambas carac-
130
131
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
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
132
Programacin orientada a objetos nombrepersona : = n; end imprimir is do e s putctring ("Estudiante: 1 ; imprimirpersona; end; end
133
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:
que expresa cmo un mensaje se enva a un receptor con un argumento Smalltalk es un lenguaje totalmente dinmico Los mtodos se buscan cuando un objeto recibe un mensaje La ligadura esttica no es una opcin en Smalltalk La 'Tabla 4 2 relaciona los trminos equivalentes entre C + + y Smalltalk Tabla 4,,2. C++ frente a Smalltalk,,
Piecoizdiciones, que se deben cumplir untes de que se invoque un mtodo Poscoizdicioizes, que se garantizan han de cumplirse despus de que un mtodo se ha ejecutado Invariantes, que siempre son verdaderas para todas las iuptancias de una clase
El contrato eiitre el proveedor y el usuario de una clase espera que: El usual io de una clase asegurar que las precondiciones de un mtodo se cumplan antes de que el mtodo se invoque El pioveedoi de la clase gaiantizar que las poscondiciones se cumplan despus que se ha aplicado el mtodo
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
Tabla 4 3. Caractersticas d e Smalltalk Polimorfismo Ligadura/Verificacin de tipos Ocultacin de la informacin Concurrencia Herencia simple Herencia mltiple Recoleccin de basura Genericidad Persistencia
S
Tardia S
Smalltalk es el primer lenguaje creado con tecnologa de objetos puros Fue desairollado al piincipio de los setenta por Alan Kay y Adele Golberdg en el Software Concepts Group de Xerox Palo Alto Research Center En la actualidad Smalltalk comienza a imponerse como uno de los primeros lenguajes de programacin orientados a objetos. La primera versin comercial de Smalltalk se lanz en 1983 con el nombre de Smalltalk-80 En u11 principio slo estuvo disponible para potentes estaciones de trabajo grficas Smalltalk, en el sentido ms estricto, es un entorno de progiamacin interactivo y requiere gran cantidad de memoria En la actualidad las versiones de Smalltalk corien bajo entornos Windows, OS12 y UNIX En esencia, el entorno de progiamacin Smalltalk tiene tres componentes: el lenguaje b~ico Snzalltalk, una coleccin de clases, que se utilizan para implementar el sistema Smalltalk completo, y el eiztorno leal de progranzaciiz, que permite a un programador introducir, comprobar y ejecutar aplicaciones Smalltalk,
Pobre
S
No
Si
No
No
Smalltalk no es un lenguaje hbrido, como C + + , sino un lenguaje puro, que no permite un estilo de programacin convencional Es el lenguaje de programacin ms dinmico de los conocidos y dispone de un entorno de programacin excelente, aunque tiene el inconveniente de teneI una velocidad de ejecucin pequea Otro inconveniente de Smalltalk es ser un sistema de un solo usuario
134
135
Por el contrario, el desariollo de aplicaciones en Smalltalk tiende a ser muy rpido Adems, dado que el cdigo de Smalltalk se compila incrementalmente, las nuevas definiciones de clases y objetos se vuelven eficaces tan pronto como se introducen El alto grado de interactividad del entorno Smalltalk lo hace altamente productivo para desarrollos rpidos
aersiiz hibrida de Pascal Turbo Pascal (Object Pascal) vei siii Iiihrida de Clipper Visual Object uei siiz hibrida de Iui,bo Parcal Delphi versin lzihrida de COBOL, Object COBOL Visual BASIC 4 (no iizcorpoia propiedades de heleizcia ni de polinzorfisnzo) versin hibrida de C C++
El lenguaje C + + se estudia y analiza en profundidad en la segunda y tercera parte de este libro, y es la base fundamental de todo el desarrollo del mismo. Los Apndices A, B, C, D y E muestran unas guas rpidas de los lenguajes C + + , Turbo/Borland Pascal 7, Delphi, Ada-95 y lava
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
Figura 4 6
136
Las grandes ventajas de los lenguajes hbridos son: Perodo de aprendizaje (los programadores ya experimentados en versiones no orientadas a objetos pueden comenzar con facilidad a utilizar las versiones 00). Se pueden utilizar las enormes cantidades de cdigo puente existente (cdigo heredado) C++se dise de modo que pudie~a compilar cdigo estndar C con pocas o ninguna modificacin; de igual forma, Delphi se ha diseado para compilar programas anteriores de Turbo/Bo~land Pascal con cambios mnimos
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.
b) Los clientes de un banco que tienen una caja fuelte alquilada c ) Las direcciones de correo elect~nico de una universidad d) Los empleados de una empresa y sus claves de acceso a sistemas de seguridad
42
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
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
4.5. Dibujar diagramas de objetos que representen la je~arquade objetos del modelo Figura
La orientacin a objetos (POO) intenta modelar aplicaciones del mundo real tan fielmente como sea posible, apoyndose para ello en una gran facilidad de reutilizacin y extensibilidad del software El potente concepto 00 que proporciona todas estas caractersticas e s la herencia, A travs de la herencia, los disetiadores pueden construir mdulos de software (tales como clases) Las nuevas clases pueden heredar tanto el comportamiento (behaviour, operaciones, mtodos, e t c ) como la representacin (variables de instancia, atributos, e t c ) a partir de las clases existentes,, La herencia e s la caracterstica que diferencia esencialmente la programacin orientada a objetos de la programacin tradicional, debido fundamentalmente a que permite extender y reutilizar el cdigo existente sin tener que rescribir el cdigo, En este capitulo analizaremos las relaciones fundamentales entre clases el concepto de herencia y su modo d e implementacin en un lenguaje orientado a objetos, as como las otras relaciones entre clases, agregacin y asociacin.,
138
139
Las rosas rojas y amarillas son tipos de rosas Un ptalo es una parte de ambos tipos de flores Como Booch afirma, las clases y objetos no pueden existir aislados, y en consecuencia existirn entre ellos relaciones Las relaciones entre clases pueden indicar alguna fotma de comparticin, as como algn tipo de conexin semntica Por ejemplo, las margaritas y las rosas son ambas tipos de flores, significando que ambas tienen ptalos coloreados brillantemente, ambas emiten fragancia, etc La conexin semntica se materializa en el hecho de que las rosas rojas y las margaritas y las rosas estn ms estrechamente relacionadas entre s que lo estn los ptalos y las flores Las clases se pueden organizar en estructuras jerrquicas La herencia es una relacin entre clases donde una clase comparte la estructura o comportamiento, definida en una (herencia simple) o ms clases (herencia mltiple). Se denomina superclase a la clase de la cual heredan otras clases. De modo similar, una clase que hereda de una o ms clases se denomina subclase Una subclase heredar atributos de una superclase ms elevada en el rbol jerrquico La herencia, por consiguiente, define un tipo de jerarqua entre clases, en las que una subclase hereda de una o ms supe~clases La Figura 5 1 ilustra unaje~arqua de clases Animal, con dos subclases que heredan de Animal, Mamferos y R e p t i l e s
La primera de ellas es la generalizacin, que representa una relacin un tipo de Por ejemplo, una rosa es un tipo de flor, significando que una rosa es una subclase especializada de la clase ms general, flor Este tipo de relacin se conoce como relacin es-un (ir-a) La segunda es agregacin, que representa urza parte de la relacin. Por consiguiente, un ptalo no es una clase de flor; es una parte de una flor Esta relacin tambin se conoce como relacin tiene (has) La tercera relacin es la asociacin, que representa conexin semntica eiitie clases no relacionadas As, por ejemplo, rosas y velas son clases independientes, aunque ambas representan cosas que se pueden utilizar para decorar una mesa para cenar Las relaciones se expresan frecuentemente utilizando verbos o frases verbales del lenguaje natural, tales como vive-ea, estudia-en, es-responsable-de
(Mamfero )
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
' Booc~, Grady: Objeit-Oriented Aiialysis nnd Desiyiz ivith Appiicatioiis Benjamin/Cummings, 2 " edicin, 1994 "ooc~, Giady: Object-Oriented Deriyn ivith Appliiationr Benjamin/Cummings, 1991, pgs 96-100
Herencia es la propiedad por la cual instancias de una clase hija (o subclase) puede acceder tanto a datos como a comportamientos (mtodos) asociados con una clase padre (o superclase) La herencia siempre es transitiva, de modo que una clase puede he~edar caractersticas de superclases de nivel superior Esto es, si la clase p e r r o es una subclase de la clase mamfero y de a n i m a l Una vez que una jerarqua se ha establecido es fcil extenderla Para describir un nuevo concepto no es necesario describir todos sus atributos Basta describir sus diferencias a partir de un concepto de una jerarqua existente La herencia significa que el comportamiento y los datos asociados con las clases hija son siempre una extensin (esto es, conjunto estrictamente ms grande) de las propiedades asociadas con las clases padres Una snbclase debe tener todas las propiedades de la clase padre y otras El proceso de definir nuevos tipos
140
141
y reutilizar cdigo anteriormente desarrollado en las definiciones de la clase base se denomina plogramacin por herencia Las clases que heredan propiedades de una clase base pueden, a su vez, servir como clases base de otras clases, Esta jerarqua de tipos normalmente toma la estructura de rbol, conocido como jerarquia de clases o jerarqua de tipos La jerarqua de clases es un mecanismo muy eficiente, ya que se pueden utilizar definiciones de variables y mtodos en ms de una subclase sin duplicar sus definiciones Por ejemplo, consideremos un sistema que representa varias clases de vehculos manejados por humanos Este sistema contendr una clase genrica de vehculos, con subclases para todos los tipos especializados La clase v e h c u l o contendr los mtodos y variables que fueran propios de todos 10s vehculos, es decir, nmero de matrcula, nmero de pasajeros, capacidad del depsito de combustible La subclase, a su vez, contendr mtodos y variables adicionales que sern especficos a casos individuales
wq
t\ es-un
Camin
L . .
1 '
Figura 5 2
L.a flexibilidad y eficiencia de la herencia no es gratuita; se emplea tiempo en buscar una jerarqua de clases para encontrar un mtodo o variable, de modo que un programa orientado a objetos puede correr ms lentamente que su correspondiente convencional Sin embargo, los diseadores de lenguajes han desarrollado tcnicas para eliminar esta penalizacin en velocidad en la mayora de los casos, permitiendo a las clases enlazar directamente con sus mtodos y variables heredados de modo que no se requiera realmente ninguna bsqueda,
Relacin de generalizacin,
eado )
(.~studiante)
6
Vendedor
Figura 5 3 . Una jerarqua Persona
Una superclase representa una generalizacin de las subclases Una subclase de la clase dada representa una especializaci~zde la clase ascendente (Figura 5.5), En la modelizacin o modelado orientado a objetos es til introducir clases en un cierto nivel que puede no existir en la realidad, pero que son construcciones conceptuales tiles Estas clases se conocen como clases abstractas y su propiedad fundamental es que n o se pueden crear instancias de ellas Ejemplos de clases abstractas son VEHICULO DE PASAJEROS y VEHICULO DE MERCANCIAS Por otra parte, de las subclases de estas clases abstractas, que corresponden a los objetos del mundo real, se pueden crear instancias directamente por s mismas Por ejemplo, de BMW se pueden obtener, por ejemplo, dos instancias, Coche1 y Coche2, La generalizacin, en esencia, es una abstraccin en que un conjunto de objetos de propiedades similares se representa mediante un objeto genrico El mtodo usual para construir relaciones entre clases es definir generalizaciones buscando propiedades y funciones de un grupo de tipos de objetos similares, que se agrupan juntos para formar un nuevo tipo genrico Consideremos el
142
Programacin orientada a
143
Mamfero
Vehculo es-un
Hombre
& i < 5
es-un Generalizacin lnformtico es-un Empleado
A
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
Gerente
es-un/y
Lt X
lnformtico
Oficinista (a)
(b)
(c)
Figura 5 5. Relaciones de jerarqua es-un (1s-al: (a), (c) generalizacin; (b) especializacin. caso de empleados de una compaa que pueden tener propiedades comunes (nombre, nmero de empleado, direccin, etc) y funciones comunes (calcular-nmina), aunque dichos empleados pueden ser muy diferentes en atencin a su trabajo: oficinistas, gerentes, programadores, ingenieros, etc En este caso, lo normal ser crear un objeto genrico o superclase empleado, que definir una clase de empleados individuales Po1 ejemplo, a n a l i s t a s , programadores y o p e r a d o r e s se pueden generalizar en la clase i n f o r m t i c o , Un programador determinado ( ~ o r t i m e r ser ) miembro de las clases proarama. dor , l n f o r m t i c o y empleado; sin embargo, los atributos significativos de este programador variarn de una clase a otra
~
0
Programador Figura 5 7 . Una jerarqua de generalizacin multiple, Una agregacilz es una relacin que representa a los objetos compuestos Un objeto es colnpuesto si se compone a su vez de otros objetos Una casa se compone de habitacioiies, tejados, suelos, puertas, ventanas, etc Una habitacin, a su vez, se compone de paredes, techos, suelo, ventanas y puertas (Figura 5 8)
es-u/
u
lnformtico
Habitacin
\es--
/ es-un
Puertas
/1
Ventanas
Paredes
144
145
La agregacin de objetos permite describir modelos del mundo real que se componen de otros modelos, que a su vez se componen de otros modelos La agregacin es un concepto que se utiliza para expresar tipos de relaciones entre objetos parte-de (par t-of) o tiene-un (has-a) El objeto componente, tambin a veces denominado continente o contenedor, es un objeto agregado que se compone de mltiples objetos La agregacin es una forma especfica de asociacin y no un comportamiento independiente, que aade significados o connotaciones semnticas en ciertos casos Dos objetos forman un agregado, o existe entre ellos una relacin de agregacin, si existe entre ellos una relacin todo-parte, continente-contenido (whole-part) Si dos objetos se consideran normalmente como independientes, sus relaciones se consideran normalmente una asociacin Rumbaugh et al3,en la obra ya citada, sugiere las siguientes pruebas para determinar si una relacin es una agregacin: Se utiliza la frase parte-de (tiene-un, consta-de , ) para describir la relacin? L.as operaciones del todo, se aplican automticamente a sus partes? Los valores de los atributos, se propagan del todo (completo) a todas o algunas partes? Existe una asimetra intrnseca a la asociacin en la que una clase de objetos se subordina a la otra? Si se responde afirmativamente a cualquiera de estas preguntas, se tiene una agregacin La agregacin puede ser de dos tipos: por contenido fisico4, o por contenido por referencia o conceptual La agregacin por contenidofisico (Fig 5 9 ) o por valor implica que un objeto contenido no existe independientemente del objeto contenedor La vida de ambos objetos est ntimamente relacionada,
un CHASIS,etc , que son a su vez parte-de COCHE,representa un ejemplo de una agregacin con contenido fsico (Fig 5 9)
0
Transmisin
Figura 5 9 . Agregacin con contenido fisico,
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,
En la agregacin por referencia, conceptual o sin contenidofisico existe fuerte dependencia entre objetos de las clases continenteJcontenido y no estn acoplados entre ellos Eso significa que se pueden crear y destruir instancias de clase independientemente
' En la obra Object-Oi iented Modeiiiig and Desigii, de JAMES RUMBAUGH et al se muestra uno de los meiores estudios existentes sobre modelos de obietos GRADY BOOCHdefine estos dos trminos en su obra, ya citada, Object-Oriented Analyiir and ' edicin Design 2. En Latinoamrica se utiliza como acepcin usual de autor>~uii la palabra carro
~~
146
147
Una agregacin relaciona instancias de objetos: un objeto es parte de otro objeto Las jerarquas de agregacin se componen de ocurrencias'de objetos que a su vez son parte de un objeto contenedor (relacin parte-de, tiene-triz)
i elacziz
i elaciiz
es-u12 parfe-de
un-tipo-de tiene-un
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 a de crdito
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
de carga
aterrizaje
Cabina Cada venta se corresponde coi1 una operacin de una tarjeta de crdito y a la inversa Otio ejemplo es la relacin entre PAIS y CAPITAL Un pas tiene una capital y slo una, y una ciudad que es capital de un pas slo pertenece a un pas
E
Boeing Jumbo Concorde
. .
r ;
.
-.
--
. .
. .
-- . -
I
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
Otro ejemplo se da entre la clase LINEA, CIRCUNFERENCIA,o en general y la clase PUNTO Cualquier figura puede tener muchos (infinitos) puntos, y un punto se asocia a una figura
Las asociaciones pueden ser unitarias, binarias, ternarias o de cualquier otro orden, aunque la mayora sern binarias
Punto
Las clases Venta y Articulo se enlazan tambin por una relacin unanzuchas Una venta puede constar de muchos artculos
148
149
--'
..-\
. . .
;
.'1
- *
.-
Venta
n: '
\ . . '
, . . Articulas ! , .. -----,
,
. . . s
Por ltimo, la multiplicidad muchas-a-nzuchus implica que una instancia de una clase puede corresponder con muchas instancias de otra clase, y viceversa Las clases Estudiante y Asignatura pueden estar relacionadas con asociaciones de multiplicidad muchas-a-muchas Un estudiante puede estar matriculado en muchas asignaturas, y en una asignatura determinada pueden estar matriculados muchos alumnos
Figura 5 , 1 3 Asociacin una-a-una, El rol (papel) representado en la lnea (una persona tiene-un NSS) se lee de izquierda a derecha; sin embargo, la relacin inversa (un NSS identifica a una persona) est tambin implicada y se lee de derecha a izquierda Una asociacin una-a-muchas se ilustra en la Figura 5 14 entre una Persona y la Compaa (empresa) para la que trabaja, suponiendo que una persona no est pluriempleada y s610 trabaja para una compaa
Las relaciones de multiplicidad o cardinalidad se indican de muy diversas formas, segn sea la metodologa de anlisis y diseo orientada a objetos que se utilice Las notaciones ms usuales son:
1 n , 1-m
M
Nombre Direccin Nombre Direccin Figura 5,,14. Asociacin una-a-muchas,, Una asociacin nzuchas-a-muchas entre la clase Ventas y los Productos que se compran en cada operacin de venta
+
0,1, 0-1
opcionalidad
n , m-n
Ventas
Figura 5,.15 Asociacin muchas-a-muchas Las asociaciones se implementan mediante punteros o referencias a objetos de las clases
Figura 5 12
150
151
L.a herencia es la propiedad que implementa una relacin de generalizacin/ especializacin (es-un; ir-a), en la que una snbclase hereda de una o ms superclases La herencia significa que el comportamiento de los datos asociados con las clases hijas son siempre una extensin (es decir, estrictamente hablando, un conjunto ms grande) de las propiedades asociadas con las clases padres Una subclase debe tener todas las propiedades de la clase padre y otras Por otro lado, dado que una clase hija es una forma ms especializada de la clase padre, es tambin, en un cierto sentido, una contraccin del tipo padre La herencia significa que las subclases heredan la estructura y el comportamiento de sus superclases La mayora de los lenguajes de la programacin orientados a objetos permiten que los mtodos de una superclase se puedan heredar, as como excluir, y tambin se permite aadir y redefinir mtodos en una subclase
La herencia se puede utilizar para ayudar a escribir cdigo reutilizable y representar las relaciones entre tipos y subtipos (clases y subclases) Existen dos tipos de herencia: heiencia sinzple y he~encia mltiple
\ a es-un
, M =
Elipse
-f es-un
152
153
. .
- ..
..
: Profesor
. ..
;
(d)
*.. Persona ;
..
.......
Figura 5 19 Figura 5 1 7
Herencia simple: (a) notacin de Yourdon; lb) notacin genrica; lc) notacin OMT; (d) notacin de Booch,,
La herencia simple no puede expresar ~elacionesmltiples, por ejemplo aquellas personas que sean a la vez empleados y estudiantes En realidad, existen numerosos ejemplos en la vida diaria de relaciones de herencia mltiple: un F a b r i c a n t e de m o t o c i c l e t a s japonesas tiene propiedades (variables instancia y mtodos) que pertenecen a Compaa laponesa y a F a b r i c a n t e de m o t o c i c l e t a s ; una ventana VentanaTextoBordeada permite editar texto en una ventana con bordes que hereda de VentanaTexto y de v e n t a naConBordes; por ltimo, Robocop acta tanto de r o b o t como de p o l i c a
es-un 1
es-un
v Estudiante
( Robocop )
Figura 5.20
154
155
El mecanismo que permite a una clase heredar de ms de una clase se llama hel.encia mltiple; se dice entonces que una clase es una extensin de dos o ms clases Con herencia mltiple se pueden combinar diferentes clases existentes para producir combinaciones de clases que utilizan cada una de sus mltiples superclases La representacin gifica en este caso se suele hacer con un grafo dirigido no simtrico, ya que una clase puede tener ms de una predecesora inmediata La Figura 5 21 proporciona un ejemplo de la jerarqua de clase Persona utilizando herencia mltiple Como en ella se ilustra, el Gerenteventas hereda de Gerente y Vendedor; de modo similar, EstudianteTrabajador hereda de Estudiante; DirectorDeProyectos hereda de ~ e r e n t e y de Ingeniero;por ltimo, SecretarioTcnico hereda de Secretario y de Ingeniero,
es un alimento y a la vez una planta La herencia mltiple es una herramienta muy potente, pero es fcil abusar de ella y caer en graves errores; por el contrario, utilizada con precaucin, es una ayuda valiossima en el desarrollo orientado a objetos De cualquier forma, la herencia mltiple ha sido y sigue siendo tema de debate entre expertos de programacin y de lenguajes orientados a objetos,
5.,5,.2,,1.Ventajas de la herencia multiple
Estudiante
% e \ /
trabajador
general
Figura 5 2 1 Jerarqua de clases P e r s o n a con herencia rnultiple,
[p]
Fertilizar Patata Pelar Cortar
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
Figura 5 22
li
Existen problemas asociados al uso de la herencia mltiple Con frecuencia se produce confusin y comportamiento impredecible, debido al uso de la
"os objetos persistentes - e n contraposicin a los objetos transitorios- son aquellos que permanecen activos entre ejecuciones El tiempo de vida de un objeto es la duracin de la ejecucin del programa; una vez que el programa termina su ejecucin, todos los objetos que estaban activos se vuelven inaccesibles Los objetos persistentes son aquellos que al almacenarse en disco permdnecen intactos entre ejecuciones La perrirrencia o mejor el soporte de objetos persistentes es fundamental en los sistemas de gestin o administracin de bases de datos orientadas a objetos Para ampliar conceptos sobre objetos persistentes se puede estudiar a Booch, Rbosafian y Abnous, Graham y Mary Loomies, entre otros
156
157
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
La clase EstudianteTrabajador hereda de Empleado y Estudiante Una variable instancia de Estudiante puede contener las variables {Nombre, Edad, Direccin, Carrera, Curso, Grupo, Turno) yunavariable instancia de Empleado contendr las variables {Nombre, Edad, Direccin, Salario, Categora, Departamento)
Booch considera que existen bsicamente tres mtodos para resolver las colisiones o choque de nombres: L.a semntica del lenguaje puede considerar una colisin de nombres como ilegal y rechaza la compilacin de la clase. Este es el mtodo utilizado por Smalltalk y Eiffel Sin embargo, en Eiffel es posible renombrar elementos de modo que no exista ambigedad 2 La semntica del lenguaje puede considerar el mismo nombre introducido por clases diferentes con referencia al mismo elemento conflictivo Es el mtodo de CLOS 3 La semntica del lenguaje puede permitir el choque o conflicto, pero requiere que todas las referencias de nombres califiquen la fuente de su declaracin Es el mtodo utilizado por C + +
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
Categora
Edad
Estudiante trabajador
Colisin
La mayora de los lenguajes de programacin no permiten la duplicacin esttica de la superclase, pero eso no se producir siempre, y as se puede dar el caso de que el compilador duplique la clase que se hereda dos o ms veces En
158
159
la Figura 5 25 se muestran grafos de herencia repetida, con lo que se crea una copia o dos copias (instancias), segn el caso
Por el contrario, si consideramos una clase que describa a una pareja o matrimonio que se derive de dos clases, Hombre y Mujer, respectivamente, la clase P e r s o n a debe estar presente dos veces, ya que el matrimonio lo constituyen dos personas y no una La Figura 5 27 muestra otro ejemplo de herencia repetida,
Figura 5 25 Grafos de herencia repetida: (a) creacin de dos copias de la superclase; (b) creacin de una sola copia de la superclase Estas dos clases diferentes de herencia repetida corresponden a dos significados muy diferentes de esta construccin, como se ilust~aen los ejemplos siguientes El primer ejemplo es una clase que describe una P e r s o n a (con atributos de datos de la persona y otra informacin) Se crean dos nuevas clases a partir de la clase P e r s o n a por herencia: la clase P r o f e s o r de universidad (se aaden datos adicionales relativos a la universidad donde imparte docencia, asignaturas y cursos a su cargo); la otra clase que se crea por herencia es Autor de libros (con algunos nuevos atributos, tales como ttulos de libros publicados, aos de publicacin y editoriales) En esta situacin se pueden considerar profesores que son autores de libros, y cuya estructura jerrquica se muestra en la Figura 5 2 6 En este caso es ms correcto utilizar el caso de la herencia mltiple de la Figura 525b, ya que un Pro e s o r A u t o r es slo una persona (iy no dos!), y en consecuencia sus datos privados se han de duplicar Figura 5.,26. Grafo de herencia repetida (dos copias de la superclase) El grafo de la Figura 5 28 muestra cmo la clase D tiene dos copias, instancias o subobjetos de la clase A: una copia A de W y otra copia -llamada virtual en C++- compartida por B y C
Figura 5,,28. Otro caso de herencia repetida, Existen tres mtodos para tratar el problema de la herencia iepetida:
1
ProfesorAutor u Figura 526., Grafo de herencia repetida (una copia de la superclase)
Tratar la ocurrencia de herencia repetida como ilegal Este es el enfoque de Smalltalk y Eiffel (aunque Eiffel tambikn permite el cambio de nombre para evitar las ambigedades) Se permite la duplicacin de supeiclases, pero requiere el uso de nombres cualificados totalmente para referirse a los miembros de una copia especifica Este es el mtodo empleado por C + +
160
161
Se puede tratar referencias a la misma clase como si fueran la misma clase Este es el mtodo empleado por C + + cuando se introducen superclases repetidas como clases base virtual Una clase base virtual existe cuando una subclase nombra a otra clase como su superclase y marca la superclase como virtual, para indicar que es una clase compartida
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 <<Pila llena 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
5.2. Se dispone de la clase obj-geom:
RESUMEN
Los modelos de objetos describen la estructura de datos esttica de los objetos, clases y sus relaciones entre s Una clase de objetos describe un grupo de objetos con atributos, operaciones y semntica comunes Un atributo es una propiedad de los objetos de una clase; una operacin es una accin que se puede aplicar a objetos de una clase Las relaciones entre clases pueden ser: generalizacin/especializaci6n, agregacin y asociacin L,as asociaciones establecen relaciones entre objetos y clases Un enlace conecta dos o ms objetos La multiplicidad especifica cuntas instancias de una clase se pueden relacionar con cada instancia de otra clase, Una agregacin es una relacin en la que un objeto de una clase se compone de una serie de objetos de diferentes clases; as, un motor de un coche (carro) se compone de bujas, vlvulas, cilindros, etc, El trmino generalizacin es til para construir modelos conceptuales de datos e implementacin Durante el modelo conceptual, la generalizacin permite al desarrollador organizar clases en una estructura jerrquica basada en sus semejanzas y diferencias Durante la implementacin, la herencia facilita la reutilizacin de cdigo El trmino generalizacin se refiere a las relaciones entre clases; el trmino herencia se refiere al mecanismo de obtener atributos y operaciones utilizando la estructura de generalizacin La generalizacin proporciona los medios para redefinir una superclase en una o ms subclases La superclase contiene caractersticas comunes a todas las clases; las subclases contienen caractersticas especficas de cada clase La herencia puede prodncirse a travs de un nmero arbitrario de niveles, en donde cada nivel representa un aspecto de un objeto La herencia entre clases puede ser simple y mltiple
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
);
Disear clases c i r c u l o y cuadrado derivadas del obj-geom que permitan calcular sus reas Una vez diseadas todas las clases, escribir un programa que cree un objeto de cada clase, visualice los centros de cada figura y a continuacin calcule y visualice las reas de cada figura
5.3. Una editorial de libros y discos desea crear fichas que almacenen el ttulo y el precio (de tipo f l o a t ) de cada publicacin, Crear la correspondiente clase (denominada Publicacin) que implemente los datos anteriores A partir de esta clase, disear dos clases derivadas: Libro, con el nmero de pginas (tipo i n t ) , ao de publicacin (tipo i n t ) y precio (tipo f l o a t ) ; y d i s c o , con duracin en minutos (tipo f l o a t ) y precio (tipo i n t ) Cada una de las tres clases tendr una funcin y otra funcin mostrar ( ) , para visualizar sus datos Escribir un programa que cree instancias de las clases Libro y d i s co, solicite datos del usuario y a continuacin los visualice 5.4.
EJERCICIOS
5.1. Crear una clase P i l a con la siguiente estructura:
Se dispone de la clase p u b l i c a c i n del ejercicio 5 3 y se desea crear una nueva clase base llamada v e n t a s que contenga un array con las ventas del ltimo semestre de una determinada publicacin. Esta clase debe tener funciones miembros L e e r ( ) y mostrar ( ) que obtenga y visualice las citadas ventas Modificar las clases L i b r o y d i s c o , lea y visualice las publicaciones
pila cima
s a c a r datos en la pila
5.5. El departamento de informtica de un hospital est realizando un nuevo registro de datos del personal, pacientes y proveedores del hospital y desea realizar la jerarqua de clases siguientes: Escribir las clases correspondientes de acuerdo a las siguientes estructuras:
162
163
Persona
nombre direccin ciudad Leer ( ) visualizar(
Pacieizte
nombre direccin ciudad cdigo-diagnstico telfono fecha denacimiento Leer ( ) visualizar ( ) enviar- factura
Empleado
nombre direccin ciudad cdigoempleado horas -extras compaade seguros Leer ( ) visualizar ( ) enviar-salario
Frmulas
2 n n j2
2 n 1 h+2 n n r2 h
-
1'
provee do^
Plarztilla
datos de empleado salario sumal aos deantiguedad pagarsalario
Everzlual
datos de empleado honorarios/hora pagar-salario ( )
nombre direccin ciudad cdigovendedor saldo fax telfono descuentos Leer ( ) visualizar pagar-factura ( )
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