Está en la página 1de 95

CONSULTORES EDITORIALES AREA D E I N F O R M A T I C A Y C O M P U T A C I O N Antonio Vaquero Snchez Catedrtico de Lenguajes y Sistemas Informticos Escuela Superior de Informtica Universidad Complutense

de Madrid ESPANA Gerardo Quiroz Vieyra Ingeniero en Coinunicaciones y Electrnica por la ESIME del Instituto Politcnico Nacional Profesor de la Universidad Autnoma Metropolitana Unidad Xochimilco MEXICO Willy Vega Glvez Universidad Nacional de Ingeniera PERU

PROGRAMACION ORIENTADA A OBJETOS


Luis Joyanes Aguilar
Director del Departamento de Lenguajes y Sistemas Informticos e Ingeniera de Software Facultad de Informtica Universidad Pontificia de Salamanca Cainpus Madiid

McGraw-Hill

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: tipos abstractos de datos


31 31 32 35 35 35 36 38 38 19

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 4. Lenguajes de programacin orientados a objetos


41 42 Evolucin de los LPOOS . . 4 1 1 Estado actual de los leiiguajes orientados a objetos en la dcada de los noventa Clasilicaciii de lenguajes orientados a objetos . 4 2 1 Taxonoma de lenguajes orieiitados a objetos . 4 2 2 Caractersticas de los lenguajes oiientddos a objetos . . 4 2 3 Puros frente a hbridos 4 2 4 Tipificacin esttica freiite a diiimica 4 2 5 Ligadura esttica frente a dinmica 4 2 6 Revisin de lenguajes orientados a objetos Ada , . . . 4 3 1 Abstraccin de datos en Ada 4 3 2 Genericidad eii Ada .. 4 3 3 Sopoite de herencia en Ada-83 4 3 4 Soporte Ada para orientacin a objetos

Captulo 3
31

Conceptos fundamentales de programacin orientada a objetos

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

Captulo S. Modelado de objetos: relaciones


51 52 Relaciones entre clases . . , . .. . Relacin de generalizacin/especializacin(is-des-un) 52.1 Ierarquas de generalizacin/especializacin 5 3 Relacin de agregacin (has-a/tiene-un) 5 3.1 Agregacin frente a generalizacin 5 4 Relacin de asociaciii 5.4 1 Otros ejemplos de cardinalidad 5 5 Herencia: jerarqua de clases 5 5 1 Herencia simple 5 5 2 Herencia mltiple . , , 5 5 2 1 Ventajas de la herencia mltiple 5 5 2 2 Inconvenientes de la herencia mltiple 5 5 2 3 Diseo de clases con herencia mltiple 5 6 Herencia repetida 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 7. Clases abstractas y herencia


Abstraccin de la geneializacin y especializacin de clases Clases abstractas . ,. , Herencia en C++: clases derivadas 7 3 1 Sintaxis de la herencia simple 7 3 2 Sintaxis de la herencia mltiple 7.3 3 Ambigedad y resolucin de mbito 7 4 Herencia repetida y clases base virtuales 7 5 Funciones virtuales puras ., 7.5 1 Otro ejemplo de clase abstracta '7 6 Diseo de clases abstractas 7 7 Una aplicacin prctica: jerarqua de figuras 7 7 1 La clase Figura Resumen Ejercicios 71 72 '7 3

Parte 11 PROGRAMACION ORIENTADA A OBJEIOS CON C + + Captulo 6


61 62 63 64 65 66

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

Captulo 9 . Genericidad: plantillas (templates)


, ,

91 92

Genericidad Conceptos fundamentales de plantillas en C++

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) . , , , . , . . , , . . , . . . . . . , , . , . . . . . .

Capitulo 10. Excepciones


Concepto de excepciii Manejo de excepciones 10 2 1 Medios tpicos pala el manejo de excepciones 10 3 El mecanismo de excepciones en C + + 10 4 L.anzamiento de excepciones 1 0 4 1 Foiinatos de thiow 10 5 Manejadores de excepciones 10 5 1 Bloques 1rj) 10 5 2 Captura de excepciones 10 5 3 Relanzamiento de excepciones 10 6 Especificacin de excepciones 10 7 Aplicaciones prcticas de manejo de excepciones , . 10 7 1 Calculai las races de uiia ecuacin de segundo grado 10 7 2 Control de excepciones en una estructura tipo pila Resuineu Ejercicios

10 1 10 2

Captulo 11.. Reutilizacin de software con C + i


11 1 11 2 11 3 11 4
Mecanismos de reutilizacin 11 1 1 Herramientas tradicionales de reutilizacin Reutilizacin por herencia . . 11 2 1 Ventajas de la reutilizacin a travs de la herencia Las recompilaciones en C + + Reutilizacin mediante plantillas o tipos genricos 11 4 1 Polimorfismo frente a geuericidad
, ,

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

Parte IV EL LENGUAJE C + + : SINTAXIS, CONSTRUCCION Y PUESTA A PUNTO DE PROGRAMAS Captulo 13. De C a C + +


13 1 13 2 13 3 13 4 13 5 13 6
, , , , , , , , ,

13 7 13 8 13 9 13 10 13 11 13 12 13 13

13 14

13 15 13 16 13 17

13 18

Limitaciones de C . . ., Mejora de caractersticas de C en C i + El primer programa C + + . .. 13 3 1 Comparacin de programas C y C + + Nuevas palabras reservadas de C + + Comentarios Declaraciones de variables , . . . 13 6 1 Declaracin de variables en un bucle foi , , , 13 6 2 Declaraciones externas 13 6 3 El mbito de una variable El especificador de tipos conrt . ,, 13 7 1 Diferencias entre coiist de C + + y conrt de C 13 '7 2 Las variables voltiles Especificador de tipo uoid 11 8 1 Punteros void L.os tipos char . . 13 9 1 Inicializacin de caracteres Cadenas , , . , Conversin obligatoria de tipos (Castiilg) , ,, El especificador de tipo volatile Estructuras, uniones y enumeraciones 13 13 1 Estructuras y uniones 13 13 2 Uniones annimas 13 13 3 Enumeraciones , . 13 13.4 Enumeraciones annimas Funciones en C + + 13 14 1 i?~aii%() , , 13 14 2 Prototipos de funciones . 13 143 Una declaracin tpica de funciones y prototipos 13 144 Funciones en lnea , , 13 14 5 Ventajas sobre las macros 13 14 6 Argumentos por omisin . . . 13 147 Funciones con un nmero variable de parmetros (el parmetro ..) . .. . . .. , , , , Llamada a funciones C Programas mixtos C/C++ El tipo ieferencia , , Sobrecarga 13 17 1 Sobiecarga de funciones 13 172 Aplicacin de sobrecarga de funciones 13 1'7 3 Sobrecarga de operadores Asignacin diiimica de memoria 13 18 1 El operador new 13 18 2 El puntero nulo/cero 13 18 3 El operador delete 13 184 Ventajas de nen' y delete , ,

Captulo 14. Construccin de programas en C + + / C


Compilacin separada de programas , 14 1 1 Programas multiarcbivo 14 1 2 Bibliotecas de clases 14 2 Almacenamiento extern y static 142 1 extern 14 2 2 static 143 Estructura de un programa C , , 144 Compilacin separada de clases 145 Estructura de un programa C + + . 14 5 1 Qu son archivos de cabecera? 14 5 2 Inclusin de archivos 146 Programas multiarchivo , , 14 6 1 Qu se debe poner en un archivo fuente? 14 6 2 Referencias externas 14'7 Construccin de archivos proyecto 147 1 Abrir un proyecto , , 14 7 2 Aadir archivos fuente . .. 148 Transporte de aplicaciones desde C a C t + 148 1 Enlace entre programas C y C + + Resumen Ejercicios 14 1
,

, ,

Captulo 1 5 Puesta a punto de programas en C++,. Errores de programacin tpicos , , , , , , ,


15 1 15 2 15 3 154 15 5 15 6 Depuracin de programas 15 1 1 Errores durante la depuracin , , , Errores en arrays Errores en cadenas . . . . , ., , 15 3 1 Clculo incorrecto de la longitud de una cadena , , , , Errores en comentarios , , , Errores en corchetes y llaves Errores en funciones , , ., 15 6 1 Pasar un argumento por valor en lugar de por variable 15 6 2 Fallos en el valor de retorno de la funcin , , , , 15 6 3 No incluir el archivo de cabecera de una funcin en tiempo de ejecucin , , Errores en macros . , . ,. , , , 15 7 1 Omisin de parntesis en los argumentos de macros 15 '7 2 Especificacin no vlida de macros tipo funcin Errores con operadores . , , , 15 8 1 Mal uso de operadores de incremento (++) y decremento (--) 15 8 2 Confusin de operadores de asignacin , , , , 15 8 3 Fallos en la precedencia de operadores

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

Gua de referencia de sintaxis del lenguaje C + + (Estndar C + + ANSI) 503

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
, ,

Propiedades de objetos de Turbo/Borland Pascal 7.0 (Object Pascal) 542


542 544 545 547
, , ,

Objetos Herencia Polimorfismo y mtodos virtuales Objetos dinmicos

Apndice C
C1 C2 C3 C4 C5 C6 C7 C8 C9 C 10 C 11
, ,

El lenguaje Delphi (Object Pascal) frente a C + +


,

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

Apndice D . El lenguaje Ada-95. Gua de referencia


D1 D2 D3 D4 D5 Caractersticas basadas en objetos de Ada-83 Propiedades orientadas a objetos de Ada-95 .. Clases, polimorfismo y ligadura dinmica de Ada-95 Clases abstractas Aplicaciii completa
, , ,

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

Apndice H. Glosario Bibliografa Indice

xviii

Prlogo

Prlogo

xix

Y las caracteristicas que ayudan a definir un objeto son:


e e

Encapsulamiento Modularidad Abstraccin Polimorfismo

Las clases se organizan pala modelar el mundo real en las siguientes ielaciones:
e

Herencia (generalizacin/especializacin) Agregacin Asociacin uso

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

ANALlSlS Y DISENO ORIENTADO A OBJETOS


El problema fundamental que debe asumir un equipo de desarrollo de software es convertir el mundo real en un programa informtica. En esencia, la tarea clave de la piogramacin es describir las tareas de especificacin del programa que lesuelve el problema dado, Un problema de programacin se desciibe normalmente con un conjunto de especificaciones (detalles que constituyen el problema real) Las especificaciones son parte de lo que se denomina anlisis orientado a objetos (AOO), que iesponde en realidad a la pregunta Qu hace? Durante la fase de anlisis se piensa en las especificaciones en trminos intuitivos y con independencia del lenguaje y de la mquina La etapa crtica de esta actividad es deducir los tipos de objetos del mundo real que estn implicados y obtenei los atributos de estos objetos deteiminando su comportamiento e interacciones La siguiente fase del proceso de desarrollo de software es el diseo orientado a objetos (DOO), que responde a la pregunta j,Cmo lo hace? Durante esta fase se comienza a crear un modelo de computadora basado en el anlisis que realice la tarea especfica concreta En esta etapa se piensa en objetos del mundo real que pueden ser representados como objetos del mundo inforintico Se deben especificar los objetos con mayor precisin especificando en detalle lo que los objetos conocen y lo que pueden hacer, y describe con prudencia sus interacciones Durante la fase de diseo se pueden encontrar atributos tiles adicionales y comportamiento de los objetos que no.aparecieron en la fase de anlisis o no estaban definidos con claridad La diferencia entre A 0 0 y D O 0 no es clara, y es difcil definir la transicin entre ambas etapas De hecho, ninguna de las metodologas de 00 clsicas, como Yourdon/Coad, Booch o Rumbaugh (OMT) proporcionan reglas precisas para pasar de una etapa a otra De hecho, las fases A 0 0 y D O 0 no representan un proceso estricto de dos etapas, y a veces se funden en una sola Normalmente, ocurrir que el modelo inicial que se selecciona no es el apro-

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

PROGRAMACION ORIENTADA A OBJETOS


La programacin orientada a objetos es una extensin natural de la actual tecnologa de programacin, y representa un enfoque nuevo y distinto al tradicional Al igual que cualquier otro programa, el diseo de un programa orientado a objetos tiene lugar durante la fase de diseo del ciclo de vida de desarrollo de software El diseo de un programa 00 es nico en el sentido de que se organiza en funcin de los objetos que manipular De hecho, probablemente la parte ms difcil de la creacin de software orientado a objetos es identificar las clases necesarias y el modo en que interactan entre s Desgiaciadamente, no hay reglas fciles para determinar las clases de un programa dado L.a identificacin de clases puede ser tanto arte como ciencia El proceso es algo impreciso, y por esta causa han surgido numerosos mtodos que propoicionan reglas para la identificacin de clases y las relaciones que existen entre ellas; estos mtodos son los citados anteriormente

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:

NOTACIONES ORIENTADAS A OBJETOS


El mejor sistema para modelar el mundo real con objetos de un modo prctico es disponer de una notaciii grfica consistente y eficiente Cada metodologa de anlisis y diseo orientado a objetos posee su propia notacin Nuestra experiencia en estos cinco ltimos aos impartiendo c u ~ s o sde A 0 0 y D O 0 a estudiantes de pregrado, postgrado y profesionales nos ha llevado a seleccionar las notaciones que personalmente hemos comprobado que son las ms idneas, tanto desde el punto de vista pedaggico como profesional Pensando en un aprendizaje rpido y gradual, hemos seleccionado tres metodologas de las ms populares: Coad/Yourdon Booch'93 OMT (Rumbaugh et al) Junto con otras dos notaciones, que si bien no son tan conocidas, a nosotros nos han resultado de gran valor y podemos considerarlas excelentes para el aprendizaje de objetos Son las notaciones de Raimund K Ege y David T'aylor, que hemos incluido en el texto y con ejemplos inspirados en sus textos

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

OBJETIVOS DEL LIBRO


Piogiaiizatin Oiieiztada a Objetos Coiiceptor, rizodelado, diseio y codificaciiz eiz C + + , es una obra, como su nombre indica, esencialmente de objetos.. Trata fundamentalmente de ensear a programar con tecnologas de objetos, pero al contrario que otras obras -incluso algunas nuestras- centradas exclusivamente en un lenguaje de programacin orientada a objetos -casi siempre C++-, hemos pensado que sera muy interesante -sin abandonar el estudio de C++- dar mayor importancia a los conceptos tericos y prcticos fundamentales del mulido de objetos, que slo son tratados por libros especficos de las metodologas de A O O / D 0 0 e incluso ingenieria de software 00 y otros de caicter avanzado Desde finales de los ochenta, en que decidimos adentiarnos en las emergentes tecnologas de objetos, se ha producido un cambio radical en el mundo de la ingenieria de software L,os objetos que los aos 1988 a 1990 se centraban en experiencias sobre el primitivo lenguaje C + + y Sinalltalk e incipientes trabajos en Eiffel, comenzaron a pasar en los aos 1990 a 1992 al campo profesional, y as nacieron las inetodologas de anlisis y diseo orientadas a objetos de primera generacin y que han facilitado la transicin al nuevo paradigma Las metodologas pioneras se deben a Shlaer y Mellor, que, junto con Rebeca WirkBrocks, se consideran como creadores del modelado de objetos; Yourdon/Coad, autores consolidados de metodologas estrnctuiadas que se pasaion a metodologas de objetos, y lanzan en esos aos dos excelentes libros sobre anlisis y diseo 0 0 ; Grady Booch, uno de los pioneros del mundo de ingeniera de software en tiempo real con Ada, que aprovecha su experiencia para lanzar una metodologa de diseo 00 que se ha hecho muy popular y cuya ltima edicin se public en 1993; Rumbaugh et al, autores de la metodologa OMT, seguramente la metodologa ms utilizada en el mundo del software en estos ltimos aos La siguiente frontera se produce en 1995, cuando se publica el borrado1 0.8 del mtodo unificado diseado por la unin en una misma empresa (Rational), de Grady Booch y James Rumbaugh, que han contado tambin con la colaboracin de Ivar Jacobson, creador del use case -caso de uso-, concepto terico fundamental que se ha impuesto en todos los buenos desarrollos de 00 de los ltimos aos Desde el punto de vista del lenguaje se est estandarizando C + + con la versin 3 0 de AT&T y se ha estandarizado Ada con la

HISTORIA

DEL LENGUAJE C++

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,

CONTENIDO DEL LIBRO


Este libro se apoya fundamentalmente en el emergente paradigma de la orientacin a objetos y trata de ensearle sus conceptos bsicos, as como las tcnicas de programacin de dicho paradigma. Supone que el lector tiene experiencia anterior en programacin en algn lenguaje, tal como BASIC, C o Pascal; tambin supone que el lector tiene experiencia en editar, compilar, enlazar y ejecutar programas en su computadora De cualquier forma, pensando en los lectores que no conocen C ni C + + , hemos incluido un apndice que contiene una gua de referencia del lenguaje C + + , junto con una parte completa (Paite IV) que incluye tres captulos que pretenden ensear al lector la transicin de C a C + +, o simplemente el lenguaje C + + , caso de no conocer C/C++, as como reglas picticas para poner a punto programas en C + + , con una amplia relacin de errores tpicos cometidos en piogramas, El libro consta de cuatro partes que contienen quince captulos, todos ellos con una estructura muy similar: teora y ejeilzplos prcticos desarrollados en la versin 1 0 de C + + de ANSI, de modo que prcticainente podr utilizar con cualquier compilador de los coinercializados en la actualidad de las empresas propuesBorland, Microsoft, Watcom, etc; un reyuiizeiz del capitulo y eje~cicios tos al lector, de modo que pueda practicar los conceptos aprendidos en el captulo correspondiente La Parte 1, El mundo de la orientacin a objetos, describe los conceptos fundamentales de objetos, relaciones, modelado y lenguajes de programacin orientada a objetos (LPOO) El Capitulo 1 ofrece una visin general del desarrollo del software, con una revisin de los conceptos clave del mismo, que abarcan desde los factores de calidad del software a la reutilizaciiz de software, pasando poi conceptos clave, como abstraccin de datos, encapsulamiento, jerarqua y polimorfismo, entre otros El Captulo 2 es una revisin del iinportante concepto de modularidad y su pieza clave los tipos abstractos de datos Se han utilizado como herramientas de programacin los lenguajes Modula-2, Ada, Turbo Pascal, C y C + + El Captulo 3 es una descripcin exhaustiva de los conceptos fundamei~talesde la programacin orientada a objetos (clases, objetos, lenguajes, herencia, sobrecarga, ligadura, objetos compuestos y reutilizaciii) El Capitulo 4 describe los lenguajes de POO, los clasifica y realiza una sntesis de las propiedades orientadas a objetos de los lenguajes seleccionados, en este caso Ada, Eiff'el y Smalltalk El Captulo 5 trata el importante concepto de ruodelado El proceso de desarrollo de un sistema de software comienza con la construcciil de un modelo del mundo real Este modelo captura normalmente las caractersticas ms significativas del problema, y para ello se apoya en el concepto de relaciones entre clases Las diferentes relaciones junto con la importante propiedad de la herencia y sus tipos, se describen tambin en el Captulo 5 L.a Parte II incluye los Captulos 6 al 11 y explica los fundamentos de la programacin orientada a objetos (POO) con C + + El Capitulo 6 describe cmo declarar y construir clases, diseos y reglas prcticas para la construccin de clases El Captulo 7 examina las clases abstractas y la propiedad de la herencia, junto con la sintaxis para su implementacin y el problema de la

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 M U N D O DE LA ORlENTAClON A OBJETOS: CONCEPTOS, RELACIONES, MODELADO Y LENGUAJES DE PROGRAMACION

EL DESARROLLO DE SOFTWARE

CONTENIDO
1 1 La complejidad inherente al software 1 2 La crisis del software 1 3 Factores en la calidad del software 1 , 4 Programacin y abstraccin 1 , 5 El papel (el rol) de la abstraccin 1 6 Un nuevo paradigma de programacin 1 7 Orientacin a objetos 1 8 Reutilizacin de software 19. Lenguajes de programacin orientados a objetos 1 , 1 0 Desarrollo tradicional versus orientado a objetos 111. Beneficios de las tecnologas de objetos (TO) RESUMEN

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

Programacin orientada a objetos

1.1.. LA COMPLEJIDAD INHERENTE AL SOFTWARE


Como Brooks sugiere, la coinplejidad del software es una propiedad esencial, no accidental Esta complejidad inherente al software, como dice Booch, se deriva de cuatro elementos: la complejidad del dominio del problema, la dificultad de gestionar el proceso de desarrollo, la posible flexibilidad a travs del software y los problemas de caracterizacin del comportamiento de sistemas discretos

1.1.1. La complejidad del dominio del problema


Los pioblemas que se intentan resolver con software implican normalmente elementos de ineludible coinplejidad, en los que se encueiitran una gran cautidad de requisitos, en muchas ocasiones contiadictorios Esta complejidad se produce por las dificiles interacciones entre los usuarios de un sistema y sus desarrolladores: los usuarios encuentran generalmente muy difcil dar precisin sobre sus necesidades de forma que los desarrolladores puedan comprender En casos extremos, los usuarios pueden tener slo ideas vagas de lo que se desea en un sistema software Por otra parte, los usuarios y desarrolladores tienen diferentes perspectivas de la naturaleza del problema y hacen suposiciones diferentes sobre la natnraleza de la solucin El medio comn de expresar los requisitos hoy da es utilizar un giaii volumen de textos, en ocasiones acompaados por esquemas y dibujos Tales documentos son difciles de comprender, estn abiertos a diferentes interpretaciones y con frecuencia contienen elementos que son diseos en lugar de requisitos esenciales Otra complicacin frecuente es que los requisitos de un sistema software cambian durante su desariollo Esto supone que un sistema grande tiende a evolucionar con el tiempo y el mantenimieiito del software en ocasiones es un trmino que no siempre est bien acuiado Para ser ms preciso, existen diferentes trminos a definii: el mantenimiento busca errores; la evolucin responde a cambios de requisitos, y la conservacin, cuando se utilizan medios para mantener piezas de software en funcionamiento Desgraciadamente, la realidad sugiere que un porcentaje alto de los recursos de desarrollo de software se gastan en la conservacin del software

incluso millones de lneas de cdigo Esta caracterstica se facilita descomponiendo nuestia implementacin en centenales y a veces millones de mdulos independientes Esta cantidad de trabajo exige el uso de un equipo de desarroIladores, aunque se trata por todos los medios de que este equipo sea lo ms pequeo posible Ahora bien, a medida que haya ms desarrolladores, se producen comunicaciones entre ellos ms complejas, e incluso con coordinacin difcil entre ellos, particularmente si el equipo est disperso geogrflcamente, como suele ser el caso de proyectos grandes La rotura de una aplicacin en entidades y relaciones que son significativas a los usuarios es un anlisis convencional y tcnicas de diseo Con la programacin orientada a objetos, este pioceso de descomposicin se extiende a la fase de implementacin. Es ms fcil disear e implementar aplicaciones orientadas a objetos, ya que los objetos en el dominio de la aplicacin se corresponden directamente con los objetos en el dominio del software

1.1.,3.. La flexibilidad a travs del software


El software ofrece flexibilidad, de modo que es posible para un desarrollador expresar prcticamente cualquier clase de abstraccin. Los sistemas orientados a objetos proporcionan el rendimiento, la flexibilidad y funcioualidad requerida para implementaciones prcticas La programacin se puede hacer con extensiones de lenguajes comerciales, tales como Object-Pascal (Turbo Pascal, Borland Pascal, Mac Pascal, etc) y C + + , que incorporan a sus tpicas propiedades las propiedades oiientadas a objetos, y lenguajes 00 puros, como Smalltalk y Eiffel Por otra parte, las ayudas de programacin actual mejoran la capacidad del programador para administrar y modificar sistemas mientras se desarrollan La programacin orientada a objetos expande tambin la variedad de aplicaciones que se pueden programar, debido a que se Iiberan las restricciones de los tipos de datos predefinidos L.a programacin orientada a objetos acomoda estructuras de datos heterogneo~y complejos Se pueden aadir nuevos tipos de datos sin modificar cdigo existente

1.,2.. LA CRISIS DEL SOFTWARE


En 1968 una conferencia sobre software, patrocinada por la OTAN, asumi los trminos iizgenieiia del roftware y ciisis del software Con estos trminos se quera expresar que el software era caro, poco fiable y escaso Las metodologas y tcnicas estructurales que han reinado en la dcada de los setenta y ochenta no han eliminado el problema, y de hecho la crisis del software contina hoy en da Pese a las muchas herramientas y mtodos utilizados, los problemas del diseo descendentes permanecen igual, posiblemente debido a que la complejidad del problema ha crecido considerablemente

1..1.2. La dificultad de gestionar el proceso de desarrollo


El tamao de un piograma no es una gran virtud en un sistema de software Sin embargo, la esciitura de un gran programa requiere la escritura de grandes cantidades de nuevo software y la rentilizaciu del software existente Recordemas que hace dos o tres dcadas los progiamas en lenguaje emsamblador se construan a base de centenares de lneas Sin embargo, hoy es usual encontrar sistemas en funcionamiento cuyo tamao se mide en centenares de millares, o

Programaoon orientada a objetos

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

Figura 1 1 Ciclo de vida del software,

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 %

1..3. FACTORES EN LA CALIDAD DEL SOFTWARE


La constiuccin de software requiere el cumplimiento de iiumeiosas caiacteristicas Entre ellas se destacan las siguientes:

Eficiencia
La eficiencia del software es su capacidad pala hacer u11 buen uso de los recuisos que manipula

Mantenimiento
67 %

Figura 1 2

Costes de las diferentes fases del ciclo de vida de un proyecto software.

Bnoo~s, Fredeiik P li : N o Silvei Bullet~, Coiiipurei 10-19, abril 1986 Cox, Biad J : Thei-e is a Silver Bulleta, Bi,te 209-218, octubre 1987

Prograrnacion orientada a objetos

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

1..3.1.. Razones fundamentales que estn influyendo en la importancia de la PO0


Algunas de las causas que estn influyendo consideiablemente en el notable desarrollo de las tcnicas orientadas a objetos son: L.a 00 (Orientaciii a Objetos) es especialmente adecuada para iealizar determinadas aplicaciones, sobre todo realizacin de prototipos y simulacin de programas Los mecanismos de encapsulacin de P O 0 soportan un alto grado de reutilizacin de cdigo, que se incrementa por sus mecanismos de herencia En el entorno de las bases de datos, la 00 se adjunta bien a los n~odelos semnticos de datos para solucionar las limitaciones de los modelos tradicionales, incluido el modelo relaciona1 Aumento espectacular de L.POO (Lenguajes de Programacin Orieiltados a Objetos) Interfaces de usuario grficos (por iconos) y visuales Los interfaces de usuario de una aplicacin manipulan la entrada y salida del usuaiio Por consiguiente, su funcin principal es la comunicacin con el usuario final L.a entrada al sistema se puede controlas a travs de lneas de rdenes (enfoque utilizado por DOS y UNIX), o alternativamente el usuario puede interactuar con el sistema, con construccioiies de programacin visuales, tales como iconos de mens, Windows, Macintosh, etc Estas razones hacen fundamentalmente que dentro de las tendencias actuales de la ingeniera de software, el marco de P O 0 se revela como el ms adecuado para la elaboracin del diseo y desarrollo de aplicaciones Este marco se caracteriza por la utilizacin del diseo modular 00 y la reutilizacin del software Los T'AD (Tipo Abstracto de Dato) ha11 aumentado la capacidad para definir nuevos tipos (clases) de objetos, cuyo significado se definir abstractamente, sin necesidad de especificar los detalles de implementacin, tales como la estructura de datos a utilizar para la representacin de los objetos delinidos Los objetos pasan a ser los elementos fundamentales en este nuevo marco, en detrimento de los subprograinas que lo han sido en los marcos tradicionales

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

Un software es fcil de utilizar si se puede comunicar con l de manera cmoda


Correccin

Capacidad de los productos software de realiza1 exactamente las tareas definidas por su especificacin
Robustez

Capacidad de los productos soflwaie de funcionar incluso en situaciones anormales


Extensibilidad

Facilidad que tienen los productos de adaptarse a cambios en su especificacin Existen dos principios fundamentales para conseguir esto: diseo simple; descentralizacin
Reutilizacin

1..4. PROGRAMACION Y ABSTRACCION


Para comprender mejor el significado de la revolucin que suponen las tecnologas orientas a objetos, se va a examinar uno de los elementos fundamentales: p~oyiamacinpol. abst~accin En general, un programa no es ms que uiia descripcin abstracta de un procedimiento o fenmeno que existe o sucede en el mundo real Frecuentemente, un programa imita un comportamiento o accin humana; otras veces simula (es decir, lo reproduce) un fenmeno fsico

Capacidad de los productos pata ser reutilizados, en su totalidad o en parte, en nuevas aplicaciones
Compatibilidad

Facilidad de los productos para ser combinados con otros

10

Proqrarnacin orientada a objetos

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

1.5.. EL PAPEL (EL ROL) DE LA ABSTRACCION


Los piograinadores han tenido que luchar con el problema de la complejidad durante mucho tiempo desde el nacimiento de la informtica Para comprender lo mejor posible la importancia de las tcnicas orientadas a objetos, reviseinos cules han sido los dif'eientes mecanisinos utilizados por los programadores para controlar la complejidad Entre todos ellos destaca la abstracciiz Como describe Wulft: Los humanos hemos desarrollado una tcnica excepcionaliliente potente paia tratar la complejidad: abstraernos de ella. Incapaces de dominar en su totalidad los objetos complejos, se igiioia los detalles no esenciales, tratando en su lugar con el modelo ideal del objeto y centrndonos en el estudio de sus aspectos esenciales En esencia, lu abstracciiz es la capacidad para encaprulai y aislar la iizforinaciiz del direizo y ejecucin En otro sentido, las tcnicas orientadas a objetos se ve como iesultado de una larga progiesin histrica que comienza en los procedimientos y sigue en los mdulos, tipos abstractos de datos y objetos,

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

1..5.2.. Historia de la abstraccin del software


L.a abstraccin es la clave para disear buen software En los primeros dias de la informtica, los programadores enviaban instrucciones binarias a una computadora, manipulando directamente interrupciones en sus paneles fiontales Los ileinotcnicos del lenguaje ensamblados eran abstracciones diseadas para evitar que los programadores tuvieran que recordar las secuencias de bits que componen las instrucciones de un programa El siguiente nivel de abstracciii se consigue agrupando instrucciones primitivas paia formar macroinstrucciones Por ejemplo, un conjunto se puede definir por abstraccin como una coleccin no ordenada de elementos en el que no existen duplicados Utilizando esta definicin, se pueden especificar si sus elementos se almacenan en un array, una lista enlazada o cualquier otia estructura de datos Un coi~junto de instrucciones realizadas por un usuario se pueden invocar por una macroinstiuccin; una macioinstruccin instruye a la mquina para que realice inuchas cosas Tras los lenguajes de prograiiiacin ensambladores aparecieron los lenguajes de prog~amacin de alto nivel, que supusieron un nuevo nivel de abstraccin Los lenguajes de programacin de alto nivel permitieron a los programadores distanciarse de las interioridades arquitectnicas especficas de una mquina dada, Cada instiuccin en un lenguaje de alto nivel puede iiivocai varias instrucciones mquina, dependiendo de la mquina especfica donde se compila el programa Esta abstraccin permita a los programadores escribir software pala propsito genrico, sin preocuparse sobre que mquina corre el programa Secuencias de sentencias de lenguajes de alto nivel se pueden agrupar en procedimientos y se invocan por una sentencia La programaci6n estructurada

1..5.1.. La abstraccin como proceso natural mental


Las personas noiinalmente comprenden el mundo construyendo modelos mentales de partes del mismo; tratan de comprender cosas con las que pueden interactuar: un modelo mental es una vista siinplificada de cmo funciona de modo que se pueda inteiactuar contra ella En esencia, este proceso de construccin de modelos es lo mismo que el diseo de software, aunque el desarrollo de software es nico: el diseo de software produce el modelo que puede ser manipulado poi una computadora Sin embargo, los modelos mentales deben ser ms sencillos que el sistema al cual imitan, o en caso contrario sern intiles. Por ejemplo, consideremos un mapa como un modelo de su territorio A fin de ser til, el mapa debe ser ms sencillo que el territorio que modela Un mapa nos ayuda, ya que abstrae slo

12

Programacin orjentada a objetos

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

1.5.5.. Tipos abstractos de datos


Un tipo abstiacto de datos (TAD) es un tipo de dato definido poi el programador que se puede manipular de un modo similai a los tipos de datos definidos por el sistema Al igual que los tipos definidos por el sistema, un tipo de dato abstr.acto corresponde a un conjunto (puede ser de tamao indefinido) de valores legales de datos y un nmero de operaciones primitivas que se pueden realizar sobre esos valores Los usuarios pueden crear variables con valores que estn en el rango de valores legales y pueda operar sobre esos valores utilizando las operaciones definidas Por ejemplo, en el caso de la pila ya citada se puede definir dicha pila como un tipo abstracto de datos y las operaciones sobre la pila como las nicas operaciones legales que estn permitidas para ser realizadas sobre instancias de la pila Los mdulos se utilizan frecuentemente como una tcnica de implementacin para tipos abstractos de datos, y el tipo abstracto de datos es un concepto ms terico Para construir un tipo abstracto de datos se debe poder:

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

1.6. U N NUEVO PARADIGMA DE PROGRAMACION


La piogiaiizaciiz oiientada a objetos (POO)* se suele conocer como un nuevo paradigiiza de programacin Otros paradigmas conocidos son: el paiadigiiza de la prog~aiizaciiziiizpeiativa (con lenguajes tales como Pascal o C), el paiadigiiia de la prograiilacin lgica (PROLOG) y el paiadigiiza de la progiaiiiaciiz fuizcioiza1 (Lisp) El significado de paiadigiizu3 (paradigiiza en latn; paradeigiiza e11 griego) en su oiigen significaba un ejemplo ilustrativo, en particular enunciado modelo que mostraba todas las inflexiones de una palabra En el libro Tlie St~u(tu1eo j Scieiztzfic Revolutioizs, el historiador Thomas Kuhn4 describa un paradigma como un conjunto de teoras, estndar y mtodos que juntos representan un medio de organizacin del conocimiento: es decir, u 1 1 medio de visualizar el mundo En este sentido, la piogramacin orientada a objetos es un nuevo paradigma La orientacin a objetos berza a reconsideiar nuestro peiisamiento sobre la computacin, sobre lo que significa realizar computacin y sobre cmo se estructura la informacin dentio del computador5 Jenkins y Glasgow observan que la mayoia de los programadores trabajan en un lenguaje y utilizan slo un estilo de programacin Ellos programan en un paradigma forzado por el lenguaje que utilizan Con frecuencia, no se enfrentan a mtodos alternativos de resolucin de un problema, y por consiguiente tienen dificultad en ver la ventaja de elegir un estilo ms apropiado al problema a manejai Bobrow y Stefik definen un estilo de programacin como un medio de organizacin de piogramas sobre la base de algn modeloconceptual de programacin y un lenguaje apiopiado pala hacer programas en un estilo claro Sugieren que existen cuatro clases de estilos de programacin: Orientados Orientados Oiientados Orientados a a a a procedimientos objetos lgica reglas Algoritmos Clases 11 objetos Expre~adoeiz clculo de piedicadf~r Reglas if-then

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

Conceptos clave Abstraccin Encapsulacin

I I
Persistencia Polimotiismo Genericidad Entidades bsicas Mtodos Instancias Jerarqua

Figura 1 . 3 Principios bsicos de la orientacin a objetos

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

Programacion orientada a objetos

El desarrollo de software

17

1.7.. ORlENTAClON A OBJETOS


L.a orientacin a objetos puede describiise como el conjunto de dircipliizas (ingeizielia) que derari,ollail y iizodelizaiz softivare que facilitan la construccin de sisteiizay cori~plejosa pal tii de coinpoizeiztes El atractivo intuitivo de la orientacin a objetos es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible Las ventajas de la orientacin a objetos son muchas en programacin y modelacin de datos Como apuntaban Ledbetter y Cox (1985): La programacin orientada a objetos permite una representacin ms directa del modelo de inundo tea1 en el cdigo El resultado es que la transformacin radical noimal de los requisitos del sistema (definido en trminos de usuario) a la especificacin del sistema (definido en trminos de coinputador) se reduce consideiablemente La Figura 1 4 ilustra el problema Utilizando tcnicas convencionales, el cdigo generado para un problema de mundo real consta de una primera codificacin del problema y a continuacin la transformacin del problema en trminos de un lenguaje de coinputador Von Newmann Las disciplinas y tcnicas orientadas a objetos manipulan la transformacin autornticamente, de inodo que el volumeil de cdigo codifica el problema y la transformacin se minimiza. De hecho, cuando se compara con estilos de programacin convencionales (plocediiizerztales por procedinzie~ztor),las reducciones de cdigo van desde un 40 por 100 hasta un orden de magnitud elevado cuando se adopta un estilo de piogiamacin orientado a objetos. Los conceptos y herramientas orientados a objetos son tecnologas que permiten que los problemas del inundo real sean expresados de modo fcil y

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--

Transformacin de "017 Newrnan

1-

Codificacin del programa Booc~; Giady: Objert-Oiientcd


1994
Arzalysis and Deiiyn with 4pplications

Figura 1 . 4 Construccin de software,

Benjainin/Cumrnings,

18

Programacion orientada a objetos

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.5. Polimorfismo 1.7.3. Modularidad


L,a modularidad es la propiedad que permite subdividii una aplicacin en partes ms pequeas (llamadas nzdulos), cada una las cuales debe ser tan independiente como sea posible de la aplicacin en s y de las restantes partes La modulaiizacin, como indica Liskov, consiste en dividir un programa en mdulos que se puedan compilar por separado, pero que tienen conexiones con otros mdulos Al igual que la encapsulacin, los lenguajes soportan la modularidad de diversas formas. Por ejemplo, en C + + los mdulos son archivos compilados poi separado L.a prctica usual (se ver en el Captulo 2) es situar los inteifaces de los mdulos en archivos con nombres con extensin , h (aiclzivos de cabecera) y las implementacioiies de los mdulos se sitan en archivos con nombres con extensin cpp En Ada, el mdulo se define como paquete (package) Un paquete tiene dos partes: la espec@cacin del paquete y el cuerpo del paquete; tambin se pueden compilar por separado Como se ver en el Captulo 2, la i~zodulai idod es la propiedad de un sistema que peiinite su descomposicin en un conjunto de indulos cohesivos y dbilmente acoplados La quinta propiedad significativa de los leiiguajes de programacin orientados a objetos es el poliiizorfisino Esta propiedad no suele ser considerada como fundamental en los diferentes modelos de objetos propuestos, pero, dada su importancia, no tiene sentido considera1 un objeto nzodelo que no soporte esta propiedad, Polimo~fismo es la propiedad que indica, literalmente, la posibilidad de que una entidad tome rnuclzar foriizar En triiiinos prcticos, el polimorfismo permite iefeiirse a objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma opeiacin de diferentes formas, segn sea el objeto que se referencia en ese momento Por ejemplo, cuando se desciibe la clase rilainjel.os se puede observar que la operacin coiizer es una operacin fundamental en la vida de los mamferos, de modo que cada tipo de mamfero debe poder realizar la operacin o funciii corizei Por otra parte, una vaca o una cabra que pastan en un campo, un nio que se come un bombn o caramelo y un len que devora a otro animal, son diferentes formas que utilizan los distintos mamferos para realizar la misma funcin (conzel.). El polimorfismo implica la posibilidad de tomar un objeto de un tipo (mamfero, por ejemplo) e indicarle que ejecute conzer; esta accin se ejecutar de diferente foima, segn sea el objeto mamfero sobre el que se aplica Clases, herencia y polimorfismo son aspectos claves en la programacin orientada a objetos, y se reconocen a estos elementos como esenciales en la orientaciiz a objetos El polimorfismo adquiere su mxima expresin en la del ivacin o exteizsiiz de clases, es decir, cuando se obtiene una clase a partii de una clase ya existente, mediante la propiedad de derivacin de clases o herencia As, por ejemplo, si se dispone de una figura que represente figuras genricas, se puede enviar cualquier mensaje, tanto a un tipo derivado (elipse, crculo, cuadrado, etc) como al tipo base Por ejemplo, una clase,figuia puede acepta1 los mensajes dibujar, bor~ary nzover Cualquier tipo derivado de una figura es un tipo de figura y puede recibir el inirino mensaje Cuando se enva un mensaje,

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

Programacrn orientada a objetos

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

1.8. REUTlLlZAClON DE SOFTWARE


Cuando se construye un automvil, un edificio o uii dispositivo electinico, se ensamblan una serie de piezas independientes, de modo que estos componentes se reutilicen, en vez de fabricarlos cada vez que se necesita construir un automvil o un edificio En la construccin de software, esta pregunta es continua Por qu no se utilizan programas ya construidos para formar programas ms grandes? Es decir, si en electrnica los computadores y sus perifricos se forman esencialmente con el ensamblado de circuitos integrados, jexiste algn mtodo que permita realizar grandes programas a partir de la utilizacin de otros programas ya realizados? Es posible reutilizar estos componentes de software? L.as tcnicas orientadas a objetos proporcioiian un mecanismo para construir cornporzentes de rofrware reutilizables que posterioimente puedan ser inteiconectados entre s y formar grandes proyectos de software8 En los sistemas de programacin tradicionales, y en particular en los basados en lenguajes de programacin estructuiadas (tales como FORTRAN, C, etc ), existen las bibliotecas de funciones, que contienen funciones (o procedimientos, segn el lenguaje) que pueden ser incorporados en diferentes programas En sistemas orientados a objetos se pueden constiuir componentes de software reutilizables, al estilo de las bibliotecas de funciones, normalmente denominados bibliotecas de softivare o paquetes de softivare reutilizables Ejemplos de componentes reutilizables comercialmente disponibles son: 'Turbo Visin de Turbo Pascal 0L.E 2.0 de C + + , jerarqua de clases Smalltalk, clases MacApp para desarrollo de interfaces grficos de usuario en Object Pascal, disponibles en Apple, la coleccin de clases de Objective-C, etc. En el futuro inmediato, los ingenieros de software dispondrn de catlogos de paquetes de software reutilizable, al igual que sucede con los catlogos de circuitos integrados electrnicos, como les ocurie a los ingenieros de hardware Las tcnicas orientadas a objetos ofrecen una alternativa de escribir el mismo programa una y otra vez El programador orientado a objetos modifica una funcionalidad del programa sustituyendo elementos antiguos u objetos por nuevos objetos, o bien conectando simplemente nuevos obietos en la aplicacin La reutilizacin de cdigo en reprogramacin tradicional se puede realiza1 copiando y editando, mientras que en programacin orientada a objetos se puede reutilizar el cdigo, creando automticamente una subclase y anulando alguno de sus mtodos Muchos lenguajes orientados a objetos fomentan la reutilizacin mediante el uso de bibliotecas iobustas de clases preconstruidas, as como otias herramientas, como hojeadores (broivse~), para localizar clases de intesks y depuradores interactivos para ayudar al programador
BRADCOX, en su ya clsico libro Objecr-Oiieilted Piograi>irniiig An Eoo1utioiiai.v Approa~lf [Con, Novobilski, 911, acu el trmino chip de rqftiuaie (Software-IC), o ioinpoiienter de software para definir las clases de objetos como componentes de software reutilizables Existe versin en espaol de Addisoii-Wesley/Daz de Santos, 1993, con el ttulo Prograrnacibri oiiei~tadaa objetor Uii eif<,yue evolurivo

1.7.6.. Otras propiedades


El modelo objeto ideal no slo tiene las propiedades anteriormente citadas al principio del apartado, sino que es conveniente que soporte, adems, estas otras propiedades:

Concurrencia (multitarea) Per sistencia Geizer icidad Manejo de excepciones


Muchos lenguajes soportan todas estas propiedades y otros slo algunas de ellas As, por ejemplo, Ada soporta concurrencia y Ada y C + + soportan genericidad y manejo de excepciones La persistencia o propiedad de que las variables -y por extensin a los objetos- existan entre las invocaciones de un programa es posiblemente la propiedad menos implantada en los L P O 0 7 , aunque ya es posible considerar la persistencia en lenguajes tales como Smalltalk y C i , lo que facilitar el advenimiento de las bases de datos orientadas a objetos, como as est sucediendo en esta segunda mitad de la dcada de los noventa,

' Lenguaje de Programacin Orientado a Objetos

22

Programacion orientada a objetos

El desarrollo de software

23

1..9.. LENGUAJES DE PROGRAMACION ORIENTADOS A OBJETOS


El priinei lenguaje de progiamacin que introdujo el concepto de clase fue Simula-67, como entidad que contena datos y las operaciones que maiiipulaban los datos Asimisino, introdujo tambin el concepto de herencia El siguiente lenguaje orientado a objetos, y seguramente el ms popular desde un enfoque conceptual exclusivamente de objetos, es Sinalltalk, cuya primera versin comercial se desarroll en 1976, y en 1980 se populariz con la aparicin de Smalltalk-80. Posteiiormente se ha populaiizado gracias al desarrollo de Smalltalk/V de la casa Digital Y, que iecientemente se lid implementado bajo entorno Windows El lenguaje se caracteriza por soportar todas las propiedades fundamentales de la orientacin a objetos, dentro de un entorno integrado de desarrollo, con interfaz interactivo de usuario basado en mens Entre los lenguajes orientados a objetos que se han desarrollado a partir de los ochenta destacan extensiones de lenguajes tradicionales tales como C + + y Objective-C (extensiones de C), Modula-2 y Object Pascal (extensin de Pascal) y recientemente Object Cobol, que a lo largo de 1994 han aparecido sus primeras veisiones comeiciales, y lava, el nuevo lenguaje para programaciii en Internet. Otro lenguaje orientado a objetos puros es Eiffel, creado por Bertrand Meyer y que soporta todas las propiedades fundamentales de objetos Hasta ahora no ha adquirido popularidad ms que eii ambientes universitarios y de investigacin Sin embargo, la prevista aparicin para el ao 1995 de la versin 3, que coirer bajo Windows, segurameilte aumentar su difusin Ada ha sido tambin un lenguaje -en este caso basado en objetos- que sopoita la mayora de las propiedades orientadas a objetos Sin embargo, la nueva veisin Ada-95 ya soporta herencia y polimorfismo Algol

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.

Clasificacin de los lenguajes orientados a objetos

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

Clasificacin de lenguajes 00 de Wegner

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

v Ada-95 'E~i:!a~d Pascal


Java

objective.c

c++

Visual BASlC 3

i 4 Visual BASlC

Figura 1 5

Evolucin de los lenguajes orientados a objetos,

WEGNEK, Petel [1987]: Di~iieiisioiiso j Objecr-Baied Laiiguajer Desigii Nmero especial de SIGPLAN Noti~ev

24

Programacin orientada a objetos

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

1..lo. DESARROLLO TRADICIONAL FRENTE A

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

Tabla 1 . , 1 Criterios de Meyer en lenguajes 00 y basados en objetos,,

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

Programacion or~entada a obletos

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

1.11. BENEFICIOS DE LAS TECNOLOGIAS DE OBJETOS (TO)


Una pregunta que hoy da se hacen muchos informticos es: Cul es la ~ a z n pura introducir mtodos de TO en los procesos de desariollo? L.a principal razn, sin lugar a dudas, son los beneficios de dichas TO: aumento de la fiabilidad y productividad del desarrollador La fiabilidad se puede mejorar, debido a que cada objeto es simplemente una caja negra con respecto a objetos externos con los que debe comuiiicarse L.as estructuras de datos internos y mtodos se pueden refina1 sin afecta1 a otras partes de un sistema (Fig 1 7 )
Objeto
//

Mtodos

Figura 1 7

El objeto como cala negra

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

Programacin orientada a objetos

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

Modularidad tipos abstractos de datos

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

2.1.1. La estructura de un mdulo


Un mdulo se caiacteriza fundaiiientalmente por su iiztelfaz y por su iinpleirieiztacin Parnas define el mdulo como un conjunto de acciones denominadas, luiiciones o submdulos que coiresponden a una abstraccin coherente, que compartan un conjunto de datos comunes implantadas estticamente llamadas atributos, eventualmente asociadas a definiciones lgicas de tipos Las acciones o funciones de un mdulo que son susceptibles de ser llamadas desde el exterior

32

Programacin orientada a objetos

Modularldad tipos abstractos de datos

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

Figura 2 , l Estructura de u n mdulo,

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

Figura 2 2 lnterfaces adecuados (pocos-muchos)

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

Figura 2 3 lnterfaces adecuados (grandes-pequeos),

34

Modularidad tipos abstraclos de dalos

programacron orientada a oblelos

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
!

2..2. DISENO DE MODULOS


Aunque el diseo modular persigue la divisin de un sistema grande en mdulos ms pequeos y a la vez manejables, no siempre esta divisin es garanta de un sistema bien organizado Los mdulos deben disearse con los criterios de acoylariiiento y cohesrdri El primer criterio exige independencia de mdulos y el segundo criterio se corresponde con la idea de que cada mdulo debe realizarse con una sola funcin relacionada con el problema Desde esta perspectiva, Booch2 define la modularidad como la propiedad de uiz sisteiizu que ha sido descoiizpuerto en un coiijunlo de nzdulos colzeiiuor ); dbilnieilte ucoplados

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,
. .-

221. Acoplamiento de mdulos


El ocoplamieizto es una medida del grado de inteidependencia eritre mdulos, es decir, el modo en que un mdulo est siendo afectado por la esti.uctura irlteliia de otro mdulo El grado de acoplamiento se puede utilizar para evaluai la calidad de un diseo de sistema El objetivo es minimizar el acoplamiento entie mdulos, es decir, minimirar su iute~dependencia, de modo que un mdulo sea afectado lo menos posible por la estluctura de otro indulo El acoplamiento entre mdulos vara en un amplio rango Por un lado, el diseo de un sistema puede tener una jeiaiquia de mdulos totalmente desacoplados Sin embaigo, dado que un sistema debe realizar un conjunto de funciones o tareas de un inodo organizado, no puede constar de un conjunto de mdulos totalinente desacoplados En el otro extremo se tendr una jeraiqua de indulos estrechamente acoplados; es decir, hay un alto grado de dependencia entre cada pareja de mdulos del diseo Tal como define Booch, un sistema modular dbilmente acoplado facilita: La sustitucin de un mdulo por otro, de modo que slo unos pocos mdulos sern afectados por el cambio 2 E.1 seguimiento de un erior y el aislamiento del n~dulo defectuoso que produce ese error Existen varias clases de acoplainiento entre dos mdulos (Tabla 2 1) Examinaremos los cinco tipos de acoplamiento, desde el menos deseable (esto es, acoplamiento estrecho o impermeable) al ms deseable (esto es, acoplamiento ms dbil) La fuerza de acoplamiento entre dos mdulos est influenciada por el tipo de conexin, el tipo de comunicacin entre ellos y la complejidad global de su interfaz
1

- -.

.-. .-

- ..

.-

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

2.2..2. Cohesin de mdulos


La cohesin es una extensin del concepto de ocultamiento de la iiiforinacin Dicho de otro modo, la cohesin describe la natulaleza de las interacciones
Booc~, Grady: Ohjeit Oiiri?ted Desigil ittii appiicurioiir Benjarnin/Cummings 1991, py 52

'

36

Programacion onentada a obletos

Modularidad tipos abstractos de datos

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

Clasificacin de cohesin de mdulos <;rddo de cnhesin Bajo tirado dc manteniniiento Bajo

Por coincidencia Lgica Temporal Po1 procedimientos Por comunicacioiies Secuencia1 Funcional Info~macional

Alto

Alto

Idealmente, se burcalz rndulor altarnerzte cohesivos y dbilmente acoplados

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

2.3. TIPOS DE DATOS


=

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

Algunos tipos de constructores incluyen registros, arrays, listas, conjuntos, etctera

38

Programacin orientada a objetos

Modularidad tipos abstractos de datos

39

2.4.. ABSTRACCION EN LENGUAJES DE PROGRAMACION


Los lenguajes de programacin son las herramientas mediante las cuales los diseadores de lenguajes pueden implementar los modelos abstractos La abstraccin ofiecida por los lenguajes de programaciu se puede dividir en dos categoras: abstracciil de datos (perteneciente a los datos) y abstraccin de coiztrol (perteneciente a las estructuras de control), Desde comienzo del decenio de los sesenta, en que se desarrollaron los primeros lenguajes de programacin de alto nivel, ha sido posible utilizar las abstiacciones ms primitivas de ambas categoras (variables, tipos de datos, procedimientos, control de bucles, etc) Ambas categoras de abstracciones han producido una gran cantidad de lenguajes de programacin no siempre bien definidos

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

2..4.1. Abstracciones de control


Los microprocesado~esofrecen directamente slo dos mecanismos para controlar el flujo y ejecucin de las instrucciones: secuencia y salto Los primeros lenguajes de programacin de alto nivel introdujeron las estructuras de control: sentencias de bifurcacin ( i f ) y bucles ( f o r , while, do-loop, etc). L.as estructuras de control describen el orden en que se ejecutan las sentencias o grupos de sentencia (unidades de progi ama) Las unidades de programa se utilizan coino bloques bsicos de la clsica descomposicin descendente En todos los casos, los subprogramas constituyen una herramienta potente de abstraccin, ya que durante su implementacin el programador describe en detalle cmo funcionan los subprogramas Cuando el subprograma se llama, basta con conocer lo que hace y no cmo lo hace De este modo, los subprogramas se convierten en cajas negras que amplan el lenguaje de progiamacin a utilizar En general, los subprogramas son los mecanismos ms ampliamente utilizados para reutilizar cdigo, a travs de colecciones de subprogramas en bibliotecas, Las abstracciones y estructuras de control se clasifican en estructuras de control a nivel de sentencia y a nivel de unidades Las abstracciones de control a nivel de unidad se conoce coino abstraccin procedinzental
Abstraccin procedimental (por procedimientos)

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

2..4.2. Abstraccin de datos


Los primeros pasos hacia la abstraccin de datos se crearon con lenguajes tales como FORTRAN, COBOL y AL.GOL 60, con la introduccin de tipos de variables diferentes, que manipulan enteros, nmeros reales, caracteres, valores lgicos, etc Sin embargo, estos tipos de datos no podan ser modificados y no siempre se ajustaban al tipo de uno para el que se necesitaban Por ejemplo, el tratamiento de cadenas es una deficiencia en FORTRAN, mientras que la precisin y fiabilidad para clculos matemticos es muy alta La siguiente generacin de lenguajes, incluyendo Pascal, SIMULA-67 y ALGOL 68, ofreci una ainplia seleccin de tipos de datos y permiti al piogramador modificar y ampliar los tipos de datos existentes mediante construcciones especficas (por ejemplo arrays y registros) Adems, SIMULA-67 fue el primer lenguaje que mezcl datos y procedimientos mediante la construccin de clases, que eventualmente se convirti en la base del desarrollo de programacin orientada a objetos La abstiacciil de datos es la tcnica de programaciu que permite inventar o definir nuevos tipos de datos (tipos de datos definidos por el usuario) adecuados a la aplicacin que se desea realizar La abstraccin de datos es una tcnica muy potente que permite disear programas ms cortos, legibles y flexibles La

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

Programacin orientada a objetos

Modularidad tipos abstractos de datos

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,

TAD = Representacin (datos) + Opetaciones (funciones y p~ocedimientos)

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

2.5. TIPOS ABSTRACTOS DE DATOS


Algunos lenguajes de programacin tienen caractersticas que nos permiten ampliar el lenguaje, aadiendo sus propios tipos de datos Un tipo de dato definido por el p~ogramadorse denomina tipo abstracto de datos (TAD) para diferenciarlo del tipo fundamental (predefinido) de datos Por ejemplo, en Turbo Pascal un tipo Punto, que representa a las coordenadas x e y de un sistema de coordenadas rectangulares, no existe Sin embargo, es posible implementar el tipo abstracto de datos considerando los valores que se almacenan en las variables y qu operaciones estn disponibles para manipular estas variables En esencia, un tipo abstracto de datos es un tipo de datos que consta de datos (estructuras de datos propias) y operaciones que se pueden realizar sobre esos datos

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

tipos abstractos de datos

43

2..5.,1. Ventajas de los tipos abstractos de datos


Un tipo abstracto de datos es un modelo (estructura) con un nmero de operaciones que afectan a ese modelo Es similar a la definicin que daremos en el captulo siguiente de objeto, y de hecho estn unidos ntimamente L.os tipos abstractos de datos pioporcionan numerosos beneficios al programador, que se pueden resumir en los siguientes:

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

2..5.2.. Implementacin de los TAD


Los lenguajes convencionales, tales como Pascal, permiten la definicin de nuevos tipos y la declaracin de piocedimientos y luneiones para realiza1 operaciones sobre objetos de los tipos Sin embargo, tales lenguajes no permiten que los datos y las operaciones asociadas sean declaradas juntos como una unidad y con un solo nombre En los lenguajes en el que los mdulos (TAD) se pueden implementar como una unidad, stos reciben nombres distintos: Turbo/Borland Pascal Modula-2 Ada C++ lava unidad, objeto mdulo paquete clase clase

Figura 2 5

Estructura de datos Pila,

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

<secuencia de sentencias para inicializacion,


end.

44

Programacin orientada a objetos

Modularidad tipos abstractos de datos

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

2..6.1. Aplicacin del tipo abstracto de dato Pila


El siguiente programa lee una secuencia de enteros, uno por lnea, tales como estos:

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 *

*)

y genera la misma secuencia de nmeros en orden inveiso (los saca de la pila)

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 * )

Modulandad t ~ p o s abstractos de datos

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.2. Mdulos locales


Un mdulo anidado (declarado) dentro de otro mdulo o procediinieuto se denomina nldulo local Las declaraciones de los mdulos locales aparecen en la misma posicin que las declaiaciones de otras entidades Los mdulos locales tienen propiedades similares a los mdulos biblioteca, incluyendo la capacidad de importar y exportar entidades La abstraccin de datos es posible realizarla en Modula-2 a travs de la construccin mdulo que proporciona el encapsulamiento y ocultamiento de los datos L.a visibilidad y ocultamiento de los datos se puede obtener mediante tipos opacos (ocultos o privados) o tiaizsparentes (pblicos),
Mdulo

2..7. TIPOS ABSTRACTOS DE DATOS EN MODULA-2


Modula-2, el segundo lenguaje inventado por Niclaus Wirth (el diseado1 de Pascal), soporta esencialmente las caractersticas de: Coinpilacin reparada de mdulos Abstiaccin de dalos

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,

2.7.3. Tipos opacos


Un tipo opaco es, como su nombre indica, uno cuya estructura se oculta de sus usuarios Un tipo opaco se puede exportar desde un mdulo y se puede utiliza1 para declarar objetos, tales como variables, elementos de arrays y campos de registros, en mdulos que los importan. El uso de un tipo opaco en el mdulo de definicin soporta el principio de ocultamiento: los detalles de la implemeutacin del tipo de dato (pila en el ejemplo) estn separados de su declaracin y estn ocultos en el mdulo de implementacin, junto con la implementacin de las operaciones El tipo opaco se define en el mdulo de definicin en la seccin TYPE Un mdulo cliente que importa un tipo opaco se puede utilizar de igual modo que cualquier tipo en Modula-2 Dado que los mdulos clientes no conocen la estructura del tipo, las nicas operaciones que pueden realizar sobre variables del tipo dado sin asignaciones y pruebas de igualdad y desigualdad

<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

Programacin orientada a objetos

Modularidad. tipos abstractos de datos

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

La declaracin de un tipo opaco se hace en el mdulo de implementacin


IMPLEMENTATION MODULE PILA; CONST LongPila = 100; TYPE Registropila = RECORD PilaArray : ARRAY 11 .LangPila] OF Char; CimaDePila: [O LongPila + 11 END : Pila = POINTER TO Registrapila;

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

2.7.4. Tipos transparentes


Un mdulo de definicin puede contener la declaracin de -estructuraun tipo de dato, en cuyo caso el tipo se denomina transparente o pblico, y se puede acceder a l y a sus campos desde cualquier mdulo cliente Veamos cmo se escriben los mdulos de definicin y de implementacin de un tipo abstracto de datos pilacaracteres.Se puede definir el tipo de dato mediante arrays o punteros; en este caso consideremos la implementacin mediante arrays El mdulo Pilacaracteres permite la exportacin del tipo de dato Piiacar,que tiene carcter transparente
DEFINITION MODULE PilaCaracterec; ( * exporta tipo PilaCar (pila de caracteres) v orocedimientos vara rnani~ulacin de variables de tioo - PilaCar * ) CONST TamanyoPila = 100: ( * mximo tamao de un tipo PilarCar * ) TYPE PilaCar = RECORD ArrayPila : ARBAY [1 TamanyoPilal OF CHAR; Cimapila : [O TamanyoPila + 11 END; ( * exportacin transparentes de PilaCar * ) PROCEDURE Meter(VAR S : PilaCar; ch: CHAR); ( * empuja ch en la pila S ; termina programa si pila ect llena * )

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

Programacion orientada a objetos

Modularidad: tinos abstractos de datos

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

) ;

*)

2.7..6. Otra aplicacin del TAD Pila


Disear un TAD pila que disponga de un tipo opaco (su representacin slo ser visible en el mdulo de implementacin; no sern visibles a los mdulos clientes) L.os tipos opacos se restringen a punteros y, en consecuencia, es preciso asignar memoria dinmicamente antes de utilizarlos Por consiguiente, hay que incluir un procedimiento de inicializacin de modo que el usuario pueda crear una pila para su uso
definition module pilamod: type pilatipo; procedure vaca (stk:pilatipo):boolean;

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

Programacin orientada a objetos

Modolaridad tipos abstractos de datos

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

2.8. Tipos abstractos de datos en Ada


Ada proporciona unidades de programa: construcciones que estn definidas con un nombre y son autnomas en el diseo de un programa Las unidades en Ada son:

roced dure cima (stk:pilatipo) :integer;


begin if vacia (stk) then WriteString ("Error - desbordamiento negativo") WriteLn; else return stkA cimasublstkA cimasubl end end cima; procedure crear (var stk:pilatipoi; begin new (ctk); stkA cimasub := O end crear; end pilamod
;

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

Programacin orientada a objetos

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

La especificacin del paquete tiene la siguiente sintaxis.


package <nombrepaquete> is citemc declarativos> [private citems declarativos>l end <nombrepaquete>

La especificacin tiene dos partes

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

2.8.1. Tipos privados


La parte de la especificacin que est antes de la palabra reservada p r i v a t e es la parte visible y la informacin est disponible fuera del paquete Despus de pr i v a t e se tienen que dar los detalles de los tipos declarados como privados y dar los valores iniciales de las constantes definidas corresnondienteq Las caractersticas adicionales en la especificacin de un paquete que expoita un tipo privado son:
~A~

Cuerpo del paquete

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

Programaoon or~entada a objetos

Modularidad tipos abstractos de datos

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

2.9. TIPOS ABSTRACTOS DE DATOS EN C


El lenguaje C proporciona algn soporte para abstraccin de datos, aunque sta es independiente de la implementacin particular La nica estructura de programa definida en el lenguaje es la funcin, que es un subprograma que puede poseer parmetros de slo lectura y generalmente devuelve un valor mediante la sentencia return Las implementaciones estndar de C reconocen una estructura de ms alto nivel -tipo f ile-, que es simplemente un archivo que contiene cdigo fuente El archivo en C es la unidad de compilacin; al igual que el mdulo, los archivos son unidades de compilaciii De este modo, la mayora de los programas se componen de difeientes archivos compilados separadamente Sin embargo, esta propiedad se convierte normalmente en un inconveniente, ya que C, al contrario que sus rivales Modula-2 y Ada, no es capaz de realizar verificacin de tipos durante el proceso de compilacin separada: es decir, cuando se disponen de varios archivos, no existen frmulas claras que permitan definir dicha verificacin, El interfaz del mdulo utilizado es la declaracin del archivo de cabecera i h),que mezcla en el archivo fuente merced al preprocesador aquellas declaraciones de funciones incluidas en los citados archivos No existe en C ninguna estructura para encapsular datos y funciones en una sola entidad Normalmente, un programa C se organiza en uno o ms archivos fuente o mdulos Cada archivo tiene una estinctura similar, con comentarios, directivas de preprocesador, declaraciones de variables y funciones, y sus definiciones Normalmente se situar cada grupo de variables y funciones relacionadas en un nico archivo fuente Algunos archivos son simplemente un conjunto de declaraciones que se utilizan en otros archivos a travs de la directiva # i n c l u d e del preprocesador C Estos archivos, ya citados, se conocen como archivos de cabecera y sus nombres terminan con la extensin , h y constituyen la especificacin del TAD Las operaciones indicadas en la seccin de especificacin han de ser implementadas; la opcin ms segura es un archivo independiente con un sufijo o extensin c Como C no soporta el tipo de dato clase que implementa en una nica unidad los datos y operaciones que manipulan los datos, la implementacin del tipo abstracto de datos se realiza mediante t y p e d e f , los datos con s t r u c t y la impleinentacin de las operaciones con un conjunto de funciones Un ejemplo de un TAD que representa un punto en un sistema de coordenadas rectangulares podra ser:
especificacin implementacin
# include <rnath h> # include "punto h
# define norma(x) ( # include "punto L' 4% define CANEVAS-LONG 10000

Las nicas operaciones disponibles en objetos de tipo privado son igualdad y asignacin

2.8.2. Tipos privados limitados


Las operaciones disponibles para un tipo privado pueden restringirse completamente a las especificadas en la parte visible del paquete Esto se consigue declarando el tipo como limitado, al mismo tiempo que privado, del siguiente modo:
type t is limited private;

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-

typedef chort int Coord;

58

Prograrnacion orientada a objetos

Modularidad tipos abstractos de datos

59

typedef struct i Coord punto;


X,

Punto Dlstancla (Punto pl


1

Punto p2)

Y;

float real(comp1ejo c ) return c r; 1 float imag(comp1ejo c ) return c i;

double Distancia (Punto pl. Punto p2 1 . /* restantes funciones * /

long dx=pl x - p2 x dy=pl y - p2 y ; return sqrt (dx*dx+dy*dy);

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* /

2.9..1. Un ejemplo de un tipo abstracto de datos en C


Definir un tipo abstracto de datos complejo en C que represente nmeros complejos (datos y operaciones sobre nmeros complejos: parte real, parte imaginaria, sumar, restar, igualdad, multiplicar y dividir) Un nmero complejo z tiene parte real y parte imaginaria:

complejo restar (complejo a, complejo b) complejo c; c r = a r - b r ; c i = a i - b i : return c;

/ * tipo abstracto de datos en C * / / * archivo: complex h * /

int igual(comp1ejo a , complejo b) { return(a r == r r & & a i == b i);

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 ;
{

Itifndef COMPLEX #define COMPLEX typedef struct float r , i; ) complejo;


{

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 * /

Los cuerpos de las funciones se implementan en el archivo c o m p l e x c:


/ * FICHERO: complex c * /

#include '"complex h" int main() { complejo x , y, z ;

#include "complex h" complejo nuevo_complejo(float x , float y) complejo c; C r = x; c i = y; return C ;


) (

60

Programacin onentada a objetos

Modularidad tipos abstractos de datos

61

printf('y = (%f. %f)\n' really), imag(y)l;

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]

2.10. TIPOS ABSTRACTOS DE DATOS EN C++


En C + + el equivalente del paquete o mdulo se denomina clase, y es el tipo de dato que soporta la abstraccin de datos Una clase es un tipo de dato que incluye datos y operaciones que manipulan esos datos La clase es la entidad principal de los lenguajes de programacin orientados a objetos (C++, Smalltalk, Eiffel, etc), Una definicin de una clase en C + + consta de miembros dato y funciones miembro, a travs de las cuales se puede acceder a los detalles internos de la clase Una clase se define como una estructura en C ( s t r u c t ) , con la diferencia de que puede contener tres secciones: pblica, privada y protegida, y que puede definir se con las palabras reservadas s t r u c t y c l a s s As, la definicin de una clase (TAD) pila de caracteres (pila-carac) en C + + es su especificacin, y su sintaxis es:
class pilocarac l char lista[1001; int cima-de-lasila; public : pila-carac(1 {cima-de-lasila void meter (char) ; void sacar (char * ) ; char cima ( ) ;
);

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

pila-carac a , b; char ch;

/ / se crean dos objetos de la clase

a meter(''); b rneter('g'); ch = a cima O ;

= -1);

2..10.1. Definicin de una clase Pila en C+

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-

Modu1ar;dad tipos abstractos de datos

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

Un programa que invieite un flujo de enteros:


//utilizar pila para invertir un flujo de enteros //archivo inver cpp #include iioctream h> #include "pila h" main ( )

//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?

//meter entrada en la pila //vicualizar pila

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 ;

Las operaciones de la pila implementadas en el cuerpo de la clase:


//definicin de la pila: pila cpp
//

#include "pila h" pila: :pila0 //inicializa la pila a vaca

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

Programacron orientada a obletos

Modulandad tipos abstractos de datos

65

pila: :-pila() ( delete items;

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 + +

int pila: :sacar1) cuenta--; 1

EJERCICIOS
21
Construii un tipo abstracto lista enlazada de nodos que contienen enteros

int pila: :cima0 I return itemc[cuenta-11:


)

int pila: :vaciaO ( return cuenta == 0; 1

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 i n . g o o d 0 ; cin >> ii)

c meter();
C O U ~i< 'NUMEROS

Igual:
I N V E R T I D O S " << endl;

for ; c v a c i a 0 ; S sacar01 cout << s c i m a 0 . : < endl;


return O ;

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.4. Ciear un TAD para representar:


Un vector (repiesentacin grfica y operaciones) Una matriz y sus diferentes operaciones Un nmero complejo y sus diferentes operaciones

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

Conceptos fundamentaies de programacin orientada a objetos

67

3..1. PROGRAMACION ESTRUCTURADA


La programacin estructurada se emplea desde el principio de la dcada de los setenta y es uno de los mtodos ms utilizados en el campo de la programacin La tcnica descendente o el refinamiento sucesivo comienza descomponiendo el programa en piezas manejables ms pequeas, conocidas como funrioizes (subrutinas, subprogramas o procedimientos), que realizan tareas menos complejas Un programa estructurado se construye rompiendo el programa en hnciones Esta divisin permite escribir cdigo ms claro y mantener el control sobre cada funcin Un concepto importante se introdujo con la programacin estructurada, ya comentado anteriormente: la abstraccidrz, que se puede definii como la capacidad para examinar algo sin preocuparse de sus datos internos En un programa estructurado es suficiente conocer que un procedimiento dado realiza una tarea especifica El cmo se realiza esta tarea no es importante, sino conocer cmo se utiliza correctamente la funcin y lo que hace

CONCEPTOS FUNDAMENTALES DE PROGRAMACION ORIENTADA A OBJETOS


CONTENIDO
3 1 3,2 3,3 34 3 5 3 6 Programacin estructurada Qu e s la programacin orientada a objetos? Clases Un mundo de objetos Herencia Comunicaciones entre objetos: los mensajes 3 7 . Estructura interna de un objeto 3 8 Clases 3 9 . Herencia y tipos 3 1 0 AnulaciniSustitucin 3 , 1 1 Sobrecarga 3 1 2 Ligadura dinmica 3 1 3 Objetos compuestos 3 , 1 4 Reutilizacin con orientacin a objetos 3 15. Polimorfismo RESUMEN La programacin orientada a objetos e s un importante conjunto de tcnicas que pueden utilizarse para hacer el desarrollo de programas ms eficientes, a la par que mejora la fiabilidad de los programas de computadora En la programacin orientada a objetos, los objetos son los elementos principales de construccin Sin embargo, la simple comprensin de lo que es un objeto, o bien el uso de objetos en un programa, no significa que est programado en un modo orientado a objetos Lo que cuenta e s el sistema en el cual los objetos se interconectan y comunican entre si En este texto nos limitaremos al campo de la programacin, pero e s tambin posible hablar de sistemas de administracin de bases de datos orientadas a objetos, sistemas operativo~ orientados a objetos, interfaces de usuarios orientados a objetos, etc

Funcin

Figura 3 , , 1 Programa estructurado

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

Programacin orientada a objetos

Conceptos fundamentaies de programacin orientada a objetos

69

3.1.,1. Desventajas de la programacin estructurada


Variables globales Adems de los inconvenientes citados anteriormente, comentaremos algunos otros que influyen considerablemente en el diseo Cuando diferentes programadores trabajan en equipo para disear una aplicacin, a cada programador se le asigna la construccin de un conjunto especfico de funciones y tipos de datos Dado que los diferentes programadores manipulan funciones independientes que relacionan a tipos de datos compartidos mutuamente, los cambios que un programador hace a los datos se deben reflejar en el trabajo del resto del equipo Aunque los programas estructurados son ms fciles de disear en grupo, los errores de comunicacin entre miembros de equipos pueden conducir a gastar tiempo en rescritura Por otra parte, los lenguajes tradicionales presentan una dificultad aadida: la creacin de nuevos tipos de datos Los lenguajes de programacin tpicamente tienen tipos de datos incorporados: enteros, coma flotante, caracteres, etc Cmo inventar sus p~opios tipos de datos? Los tipos definidos por el usuario y la facilidad para crear tipos abstractos de datos en determinados lenguajes es la propiedad conocida como extensibilidad Los lenguajes tradicionales no son normalmente extensibles, y eso hace que los programas tradicionales sean ms complejos de escribir y mantener En resumen, con los mtodos tradicionales, un programa se divide en dos componentes: procedimientos y datos Cada procedimiento acta como una caja negra Esto es, es un componente que realiza una tarea especifica, tal como convertir un conjunto de nmeros o visualizar una ventana Este procedimiento permite empaquetar cdigo programa en funciones, pero qu sucede con los datos? Las estructuras de datos utilizadas en programas son con frecuencia globales o se pasan explcitamente con parmetros

Accesibles, por cualquier funcin

Variables locales Funcin A Accesible slo por funcin A

D
Variables locales Funcin B
--

Accesible slo por 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

3.2. QUE ES LA PROGRAMACION ORIENTADA A OBJETOS?

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

Descomposicin de un programa en mdulos (funciones)

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

Programanon orientada a objetos

1l

Conceptos fundamentales de programacin orientada a objetos

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.2. Ejemplos de objetos


Qu clase de cosas pueden ser objetos en un progiama oiientado a objetos? L.a respuesta est slo limitada a su imaginacin Algunos ejemplos tpicos pueden ser:
Objetos fisicos Aviones en un sistema de control de trfico areo Automviles en un sistema de control de trfico terrestre Casas Eleineiztos de irzterfaces grficos de usuario Ventanas Mens Objetos grficos (cuadrados, tringulos, etc), Teclado, Cuadros de dilogo Ratn Aizirnales Animales veitebrados Animales invertebrados Pescados Tipos de datos defirzidos poi el usuario Datos con~plejos Puntos de un sistema de coordenadas Alimerztos Carnes Frutas, Pescados Verduras Pasteles

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

Programacin orientada a objetos

r q
Nombre del objeto Nombre del objeto
I

Conceptos fundamentales de programacin onentada a objetos

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

Seccin privada Figura 3 7

Informacin operaciones Y Encapsulamiento de datos

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

lnterfaz publico de un objeto,

3..2.3. Mtodos y mensajes


Un programa orientado a objetos consiste en un nmeio de objetos que se comunican unos con otros llamando a funciones miembro Las funciones miembro (en C + i ) se denominan mtodos en otros lenguajes orientados a objetos (tales como Smalltalk y Turbo Pascal 5 516 0170) Los procedimientos y funciones, denominados mtodos o funciones miemb~o, residen en el objeto y determinan cmo actan los objetos cuando reciben un mensaje Un merzsaje es la accin que hace un objeto Un mtodo es el procedimiento o funcin que se invoca para actuar sobre un objeto Un mtodo especifica cmo se ejecuta un mensaje El conjunto de mensajes a los cuales puede responder un objeto se denomina protocolo del objeto Por ejemplo, el protocolo de un icono puede constar de

u
Figura 3 6 El objeto Cochel

Conceptos fundamentales de programacin orientada a objetos

74

75

Programacin orientada a objetos

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

Mtodos y mensajes de u n objeto

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

3.3..1. Implementacin de clases en lenguajes


Supongamos una clase Punto que consta de los campos dato (coordenadas x e y) y los campos funcin (mtodos leer dichas coordenadas x e y) c l a s e Punto

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

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

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,

procedure operar, end; var p


:

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)
(

3.,4.. U N MUNDO DE OBJETOS


Una de las ventajas ineludibles de la orientacin a objetos es la posibilidad de reflejar sucesos del mundo real mediante tipos abstractos de datos extensibles a objetos As pues, supongamos el fenmeno corriente de la conduccin de una bicicleta, un automvil, una motocicleta o un avin: usted conoce que esos vehculos comparten muchas caractersticas, mientras que difieren en otros Por ejemplo, cualquier vehculo puede ser conducido: aunque los mecanismos de conduccin difieren de unos a otros, se puede generalizar el fenmeno de la conduccin En esta consideracin, enfrentados con un nuevo tipo de vehculo (por ejemplo una nave espacial), se puede suponer que existe algn medio para conducirla Se puede decir que vehiculo es un tipo base y nave espacial es un tipo derivado de ella, En consecuencia, se puede crear un tipo base que representa el comportamiento y caractersticas comunes a los tipos derivados de este tipo base Un objeto es en realidad una clase especial de variable de un nuevo tipo que algn programador ha creado. Los tipos objeto definidos por el usuario se comportan como tipos incorporados que tienen datos internos y operaciones externas Por ejemplo, un nmero en coma flotante tiene un exponente, mantisa y bit de signo y conoce cmo sumarse a s mismo con otro n m e ~ o de coma flotante Los tipos objeto definidos por el usuario contienen datos definidos por el usuario (caracteristicas) y operaciones (comportamiento) Las operaciones

x = a; y = b:

1 int leerX 0 int leerY 0 1;

(return x; 1 (return y;1

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:
//

se define una variable de tipo Punto

Conceptos fundamentales de programacin orientada a objetos

78

79

Programanon orientada a objetos

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

Nombre Nmero de identificacin Salario Direccin Nombre del departamento

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

Programacion orrentada a obletos

Conceptos fundamentales de programacin orientada a objetos

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

3.4..3. Duracin de los objetos


L.os objetos son entidades que existen en el tiempo; por ello deben ser creados o instanciados (normalmente a travs de otros objetos) Esta operacin se hace a travs de operaciones especiales llamadas constructores en C + + o inicializadores Estas operaciones se ejecutarn implcitamente por el compilador o explcitamente por el prograinadol, mediante invocacin a los citados constructores

Funciones miembro

:
+

(zIIIr3
Interior

, L , +
1

Exterior

3..4.4. Objetos frente a clases. Representacin grfica (Notacin de Ege)


Los objetos y las clases se comparan a val iables y tipos en lenguajes de programacin convencional Una variable es una instancia de un tipo, al igual que un objeto es una instancia de una clase; sin embargo, una clase es ms expresiva que un tipo Expresa la estructura y todos los procedimientos y funciones que se pueden aplicar a una de sus instancias En un lenguaje estructurado, un tipo i n t e g e r , por ejemplo, define la estructura de una variable enteia, por ejemplo una secuencia de 16 bits y los procedimientos y funciones que se pueden realizar sobre enteros De acuerdo a nuestra definicin de clase, el tipo i n t e g e r ser una clase Sin embargo, en estos lenguajes de programacin no es posible agrupar nuevos tipos y sus correspondientes nuevas funciones y procedimientos en una nica unidad En un lenguaje orientado a objetos una clase proporciona este servicio Adems de los trminos objetos y clases, existen otros trminos en orientacin a objetos Las variables o campos que se declaran dentro de una clase se denominan datos nliembro en C + + ; otros lenguajes se refieren a ellos como variable~ instancia Las funciones que se declaran dentro de una clase se denominan,funciones mieinbro en C++; otros lenguajes utilizan el tQmino mtodo Las funciones y campos miembro se conocen como caracteristicas miembro, o simplemente mielnbros A veces se invierten las palabras, y las funciones miembros se conocen como miembro funcin y los campos se denominan nlienlbro datos. Es til ilustrar objetos y clases con diagramas4 La Figura 311 muestra el esquema general de un diagrama objeto Un objeto se dibuja como una caja
Las nolaciones de clases y objetos utilizada en esta seccin se deben a Raimund K. Ege, que las dio a conocer en su libro Progiai+iming in aii Object-Orieiired Enviroitmenr Academic Press (AP), 1992

Figura 3 , 1 1 Diagrama d e u n objeto,

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

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

83

Cul es la diferencia entre clase y objeto?

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

3..4.,5.. Datos internos


Una propiedad importante de los objetos es que almacenan infoimacin de su estado en forma de datos internos El estado de un objeto es simplemente el conjunto de valores de todas las variables contenidas dentro del obieto en un instante dado A veces se denominan a las variables que representan a los objetos vaiiables de estado As poi ejemplo, si tuvisemos una clase ventana en C + + :
clacs ventana i int posx, posy; int tipo-ventana; int tipo-borde; int color-ventana;
public:

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
);

(int dir, int ang); (int dir, int ang) ;

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

Figura 313. Diagrama de una clase,

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

Conceptos fundamentales de programacin orientada a objetos


Clase base

85

3.4.6. Ocultacin de datos


Con el fin de mantener las caractersticas de caja negra de POO, se debe considerar cmo se accede a un objeto en el diseo del mismo, Normalmente es una buena prctica restringir el acceso a las variables estado de un objeto y a otra informacin interna que se utiliza para definir el objeto, Cuando se utiliza un objeto no necesitamos conocer todos los detalles de la implementacin Esta prctica de limitacin del acceso a cierta informacin interna se llama ocultacin de datos En el ejemplo anterior de ventana, el usuario no necesita saber cmo se implementa la ventana; slo cmo se utiliza. Los detalles internos de la implementacin pueden y deben ser ocultados Considerando este enfoque, somos libres de cambiar el diseo de la ventana (bien para mejorar su eficiencia o bien para obtener su trabajo en un hardware diferente), sin tener que cambiar el cdigo que la utiliza

Caracteristica B

Caracteristica X

Caracteristica W

Clase derivada

Clase derivada

Clase derivada

Figura 3.14 Jerarqua d e clases

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

-- ..- -..
. .-.

. .. . .

clase hi,redu sus caracterstisas (datos y fiincioiics) de otra clase.

-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

Conceptos fundamentales de programacin orientada a objetos Programacin orientada a objetos

87

3.5..1. Sintaxis
1

En lenguaje C + + la propiedad de herencia se implementa con la siguiente sintaxis:


class <derivadas>
{
:

<lista clases base>

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,

.:datos propios, <funciones miembro propias>

En lenguaje Pascal orientado a objetos (versiones Turbo 5 5 a 7 O), la sintaxis de una clase (objeto en su terminologa) es:
tme

3.5.2.. Tipos de herencia


Existen dos mecanismos de herencia utilizados comnmente en programacin orientada a objetos: lzerencia sinzple y herencia mltiple En herencia simple, un objeto (clase) puede tener slo un ascendiente, o dicho de otro modo, una subbase puede heredar datos y mtodos de una nica clase, as como aadir o quitar compo~tamientos de la clase base Turbo Pascal slo admite este tipo de herencia C + + admite herencia simple y mltiple La lzerencia mltiple es la propiedad de una clase de poder tener ms de un ascendiente inmediato, o lo que es igual, adquirir datos y mtodos de ms de una clase Una representacin grfica de los tipos de herencia con una clase base genrica 01 se muestra en la Figura 3 16 La Figura 1 15 representa los grficos de herencia simple y herencia mltiple de la clase figura y persona,respectivamente

<nombre-clase, = object (clase ascendiente) <campos propios de nuevo objeto> <mtodos propios del nuevo objeto,
end;

As, por ejemplo, en C + + , si se crea una clase base:


class base
{

int x y; public: void hacerAlgo

1;

en Turbo Pascal se escribira la clase equivalente:


base = object x , y : integer; procedure hacerlgo;
end;

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;

Figura 3 1 5 Tipos de herencia

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

Programac~n orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

89

Herencia simple Base (01)


l

3.,6.. COMUNICACIONES ENTRE OBJETOS:

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

(12111) derivada de (12) y (111)


Figura 3 1 6

Herencia simple y multiple,

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

Figura 3 , 1 7 Mensajes entre objetos,

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

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

91

3.6,,1.. Activacin de objetos


A los objetos slo se puede acceder a travs de su interfaz pblico Cmo se permite el acceso a un objeto? Un objeto accede a otro objeto envindole un mensaje
Carro
Modelo
Puenas
Edad
PreCiLcBl'o

Infor mncin especial necesaria para realizar el mtodo invocado (argumentos o parmetros requeridos)
sumar

10 X y Z " --

receptor mtodo parmetro

7
1

Calcular precio ( )
l

Figura 3 20

Estructura de un mensaje

Figura 3,,18 Envio 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... - . .... . ... .. - .. .. . . -

. . . .. -. . . .. .-- -- . .

Conceptos fundamentales de programacin orientada a objetos

92

93

Programacin onentada a objetos

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

Un receptor Un nombre de mensaje Argumentos o parmetros (si se necesita)

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

Datos utilizados por el mtodo invocado Un mensaje, propiamente dicho

Figura 3 22

Objetos en notacin YourdonICoad

La estructura de un mensaje puede ser:


enviar <Objeto A> <Mtodo1 (parmetrol, par6rnetroN)>

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.

ESTRUCTURA INTERNA DE U N OBJETO

La estructura interna de un objeto consta de dos componentes bsicos:


e

Atributos Mtodos (operaciones o servicios)

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

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

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

E l mtodo-1 llama al mtodo-2, envindole


El mtodo-3
I

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.1. Una comparacin con tablas de datos


Una clase se puede considerar como la extensin de un registro Aquellas personas familiarizadas con sistemas de bases de datos pueden asociar clase e instancias con tablas y registros, respectivamente Al igual que una clase, una tabla define los nombres y los tipos de datos de la inforinacin que contenga Del mismo modo que una instancia, un registro de esa tabla proporciona los valores especficos para una entrada particular La principal diferencia, a nivel conceptual, es que las clases contienen mtodos, adems de las definiciones de datos, Una clase es una caja negra o mdulo en la que est permitido conocer lo que hace la clase, pero no cmo lo hace Una clase ser un indulo y un tipo Como mdulo la clase encapsula los recursos que ofrece a otras clases (sus clientes) Como tipo describe un conjunto de objetor o instancias que existen en tiempo de ejecucin

se invoca por un mensaje de otro objeto

Figura 3 2 3 Invocacin de u n mtodo,


metodo: Precio-coche
fin

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

Programacin orientada a objetos

Conceptos fundamentales de programac~norientada a objetos

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

Figura 3.25, Instancias de una clase (notacin OMT),

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

Un objeto es una ~n.sruiiciu(ejemplar, caso u ocurrencia) de una clase.

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-

Conceptos fundamentales de programacin orientada a objetos

98

Programaoon orientada a objetos

99

apellidos, nombre: string; fechanacimiento: date; origen: pais; end persona

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 hombre inherit persona; atributos esposa: mujer; operaciones


end hombre

clase mujer inherit persona; propiedades esposo: man; nombre: ctring; end mujer

Figura 3 2 8 , Herencia mltiple


Herencia selectiva

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.

Herencia simple (herencia jerrquica)

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

2 La propiedad concreta existe en ms de una superclase


Caso 1 Atributos Nombre Direccin Campus Curso Ao

Figura 3 2 7 Herencia simple,,

Atributos heredados Nombre Das-Vacaciones Direccin Curso Salario Campus Estudios Ao

3..9.2.. Herencia mltiple (herencia en malla)


Una malla o retcula consta de clases, cada una de las cuales puede tener uno O ms superclases inmediatas Una herencia mltiple es aquella en la que cada clase puede heredar mtodos y variables de cualquier nmero de superclase Caro 2

Figura 3.,29 Herencia de atributos y mtodos Existen diferentes tipos de conflictos que pueden ocurrir:

Conflictos de nombres

100

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

101

Conflictos de valores Conflictos por defecto Conflictos de dominio Conflictos de restricciones

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

Una clase abstracta puede ser una impresora


Valores Atributos con igual nombre, tienen valores en cada clase Universidad con diversos campus

Reglas de resolucin de conflictos

+ 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

Clase derivada por herencia rnultiple

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)

3..9.3.. Clases abstractas


Con frecuencia, cuando se disea un modelo orientado a objetos es til introducir clases a cierto nivel que pueden no existir en la realidad pero que son construcciones conceptuales tiles Estas clases se conocen como clases abstractas Una clase abstracta normalmente ocupa una posicin adecuada en la jerarqua de clases que le pe~mite actuar como un depsito de mtodos y atributos compartidos para las subclases de nivel inmediatamente inferior Las clases abstractas no tienen instancias directamente Se utilizan para agrupar otras clases y capturar informacin que es comn al grupo Sin embargo, las subclases de clases abstractas que corresponden a objetos del mundo real pueden tener instancias

Figura 3 3 2 Anulacin de atributos y mtodos en clases derivadas

102

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

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

De modo similar, si si y s2 son dos conjuntos de objetos, se puede definir:

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

Programacin orientada a objetos

Conceptos fundamentales de programaoon orlentada a objetos

105

3..12.. LIGADURA DlNAMlCA


Los lenguajes 00 tienen la caracterstica de poder ejecutar ligadura tarda (dinmica), al contrario que los lenguajes imperativos, que emplean ligadura temprana (esttica) Por consiguiente, los tipos de variables, expresiones y funciones se conocen en tiempo de compilacin para estos lenguajes imperativos Esto permite el enlazar entre llamadas a procedimientos y los procedimientos utilizados que se establecen cuando se cumple el cdigo En un sistema 00 esto requera el enlace entre mensajes y que los mtodos se establezcan en tiempo dinmico En el caso de ligadura dinmica o tarda, el tipo se conecta directamente al objeto Por consiguiente, el enlace entre el mensaje y el mtodo asociado slo se puede conocer en tiempo de ejecucin. La ligadura esttica permite un tiempo de ejecucin ms rpido que la ligadura dinmica, que necesita resolver estos enlaces en tiempo de ejecucin Sin embargo, en ligadura esttica se ha de especificar en tiempo de compilacin las operaciones exactas a que responder una invocacin del mtodo o funcin especfica, as como conocer sus tipos el contrario, en la ligadura dinmica simplemente se especifica un mtodo en un mensaje, y las operaciones reales que realizan este mtodo se determinan en tiempo de ejecucin Esto permite definir funciones o mtodos virtuales

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,

3.12..1. Funciones o mtodos virtuales


Las funciones virtuales en C + + permiten especificar un mtodo como virtual en la definicin de una clase particular La implementacin real del mtodo se
-.

Mtodo virtual

3..13. OBJETOS COMPUESTOS


Una de las caractersticas que hacen a los objetos ser muy potentes es que pueden contener otros objetos Los objetos que contienen otros objetos se conocen como objetos conzpuestor En la mayora de los sistemas, los objetos compuestos no contienen en el sentido estricto otros objetos, sino que contienen variables que se iefiexen a otros objetos La referencia almacenada en la variable se llama identificador del objeto (ID del objeto), Esta caracteistica ofrece dos ventajas importantes:
1

Cdigo para dibujar un circulo

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

Conceptos fundamentales d e programacin orientada a objetos Programacin orientada a objetos

107

Coche tiene-un Motor


/

c5
Figura 3.,37 Relacin de agregacin (tiene-un)

3..13..1. Un ejemplo de objetos compuestos


L.a ilustracin siguiente muestra dos objetos que representa rdenes de compra Sus variables contienen informacin sobre clientes, artculos comprados y otros datos En lugar de introducir toda la infoimacin di~ectamente en los objetos o r d e n - c o m p r a , se almacenan referencia a estos objetos componentes en el forinato del identificador de objeto (IDO),
Notacin TAYLOR
Figura 3 35

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 Motor Sistema frenos


Figura 3 3 6

parte_de Sistema transmisin Chasis Articulo Cliente Artculo Figura 3 38 Objetos compuestos (dos objetos orden-compra7)

Relacin de agregacin (parte-de)

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

Programacin orientada a objetos

Conceptos fundamentales de programacion orientada a objetos

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

Figura 3 3 9 . Jerarquia de componentes agregados

Modelo
Color Precio

componentes

1
MOTOR

MOTOR SISTEMA-FRENOS SISTEMP-TRANSMISION CHASIS

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:

REUTlLlZAClON CON ORlENTAClON A OBJETOS

Reutilizacin o reutzlizabilidad es la propiedad por la que el software desarrollado puede ser utilizado cuantas veces sea necesario en ms de un programa As por ejemplo, si se necesita una funcin que calcule el cuadrado o el cubo de un

110

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

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

3.14.1. Objetos y reutilizacin


La progtamaciii orientada a objetos pioporciona el marco idneo para la reutilizacin de las clases Los conceptos de encapsulamiento y herencia son las bases que facilitan la reutilizacin Un programador puede utilizar una clase existente, y sin modificarla, aadirle nuevas caractersticas y datos Esta operacin se consigue derivando una clase a partir de la clase base existente La nueva clase hereda las propiedades de la antigua, pero se pueden aadii nuevas propiedades Pot ejemplo, suponga que se escribe (o compia) una clase men que crea un sistema de mens (barias de desplazamiento, cuadros de dilogo, botones, etc); con el tiempo, aunque la clase funciona bien, obseiva que sera interesante que las leyendas de las opciones de los mens parpadearn o cambiarn de color Pala realiza1 esta tarea se disea una clase derivada de men que aada las nuevas propiedades de parpadeo o cambio de color La facilidad para reutilizar clases (y en consecuencia objetos) es una de las propiedades fundamentales que justifican el uso de la programacin orientada a objetos Por esta razn los sistemas y en particular los lenguajes orientados a objetos suelen venir provistos de un conjunto (biblioteca) de clases predefinidas, que permite ahorrar tiempo y esfuerzo en el desairo110 de cualquier aplicacin Esta lieriamieiita -la biblioteca de clases- es uno de los parmetros fundamentales a tener en cuenta en el moineiito de evaluar un lenguaje orientado a objetos

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

Programacin orientada a objetos

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

LENGUAJES DE PROGRAMACION ORIENTADOS A OBJETOS

CONTENIDO
4 1 Evolucin de los LPOO 4 , 2 Clasificacin de lenguajes orientados a objetos 4 , 3 Ada
4.4

Eiffel
~ ~~ ~

4 5 Srnalltalk 4 6 . Otros lenguajes de programacin orientados a objetos

RESUMEN EJERCICIOS

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

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

115

41.

EVOLUCION DE LOS LPOO

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

Genealogia de los lenguajes de objetos segun Sebesta'

' 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

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

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.

Estado actual de los lenguajes orientados a objetos en la dcada de los noventa

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

Programacin orientada a objetos

Lenguajes d e programacin orientados a objetos

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,

4.,2..1. Taxonoma de lenguajes orientados a objetos


Una taxonoma de lenguajes de programacin con propiedades de orientacin a objetos fue creada por Wegner2 La clasificacin incluye los siguientes grupos:

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

4..2. CLASlFlCAClON DE LENGUAJES ORIENTADOS A OBJETOS


Como ya se ha comentado anteriormente, los lenguajes de programacin orientados a objetos son: Eiffel, Lisp, Prolog, Simula, Smalltalk, C + + , Object Pascal, etc Se entienden por lenguajes orientados a objetos aquellos que soportan las caractersticas de orientacin a objetos Otros lenguajes de programacin, tales como Ada, C, Cliper, pueden implemeiitar algunas caractersticas orientadas a objetos, utilizando ciertas tcnicas de programacin, pero no se consideran orientados a objetos Los piincipales lenguajes de piogramacin utilizados actualmente pasa sistemas de tiempo real son C y Ada Ada fue diseado especficamente para la implementacin de sistemas en tiempo real, especialmente empotrados Aunque Ada (Ada-83) no cumple las propiedades importantes de un LPOO (por ejemplo herencia y ligadura dinmica), soporta un enfoque de diseo orientado a objetos y se le conoce usualmente como basado en objetos [Wegner, 871 Ada-95, ya estandarizado por ISO y ANSI, soporta herencia y ligadura dinmica; en consecuencia, aunque todavla con restricciones, se considera orientado a objetos,
Figura 4 2

da-95

Taxonoma de lenguajes 00 de Wegner,

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

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

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

4.,2..2. Caractersticas de los lenguajes orientados a objetos


Adems de las caracteisticas citadas anteriormente de objetos, clases y herencia, los LPOO debern tener algunas o todas las caractersticas que se citan a continuacin:

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

4.2.3. Puros frente a hbridos


Existe un profundo debate entre los usuarios y desarrolladores de 00 sobre la decisin del lenguaje a emplear Este debate no es reciente, aunque s es en la actualidad cuando este debate se ha acrecentado y ha comenzado a ser decisivo en el desarrollo de la 00 Un LPOO puro es un lenguaje diseado para soportar nicamente el paiadigma orientado a objetos, en el que todo consta de objetos, mtodos y clases Los LPOO ms populares son Smalltalk y Eiffel Un LPOO hz'bl.ido, por otra parte, soporta otros paradigmas de programacin (tales como el tradicional -estructurado-, funcional, etc), adems del paradigma orientado a objetos Los lenguajes hbridos se constiuyen a partir de otros lenguajes existentes, tales como C o Pascal, de los cuales se derivan; es posible utilizar el L.POO de un modo no orientado a objetos y tambin como orientado a objetos utilizando objetos, clases y mtodos Cada tipo de lenguaje tiene sus ventajas e inconvenientes Los lenguajes puros, tales como Smalltalk o Eiffel, pueden ser ms potentes, ya que utilizan todas las ventajas de la tecnologa. Proporcionan su mxima flexibilidad para cambiar los aspectos esenciales del lenguaje Dado que todo en el lenguaje se

122

Programacin orientada a objetos


--

Lenguajes de programacin orientados a objetos

123

Lenguajes puros Mensajes

Lenguajes hibndos Mensajes

+
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

4..2.4.. Tipificacin esttica frente a dinmica


Iipijicacin o tipado (typing) es el proceso de declarar cul es el tipo de informacin que puede contener una variable Poi ejemplo, una variable se puede tipificar para contener un nico carcter, una cadena de caracteres, un nmero entero o un nmero de coma flotante Una vez que se ha declarado el tipo (tipificado),la variable est restringida a contener esa clase de datos Cual-

* test

definir (int ParID)

Devuelve un puntero al objeto test

Mtodo
definir

~equiere un parmetro entero

Figura 4 . 4 Tipificacin de u n mensaje

124

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

125

4.,2..5.. Ligadura esttica frente a dinmica


Ligadura es el proceso de asociar un atributo a un nombre En el caso de funciones, el trmino ligadura (binding) se refiere a la conexin o enlace entre una llamada a la funcin y el cdigo real ejecutado como resultado de la llamada La ligadura se clasifica en dos categoras: ligadura esttica y ligadura dinmica L.a ligadura esttica se conoce tambin como ligadura temprana o anticipada y se realiza en tiempo de compilacin La ligadura dinmica se conoce tambin como ligadura retardada o porte~gaday se realiza en tiempo de ejecucin Normalmente, los lenguajes funcionales y orientados a objetos presentan ligadura dinmica, al contrario que los lenguajes imperativos, que suelen presentar ligadura esttica. Desde el punto de vista de la estructura del lenguaje, los intrpretes por definicin realizan todos ligadura dinmica, mientras que los compiladores realizan normalmente ligadura esttica Como ejemplo de ligadura esttica, considere las declaraciones:
ConSt n = 3; var x : integer;

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.

Revisin de lenguajes orientados a objetos

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

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

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;

4.3..1. Abstraccin de datos en Ada


En Ada los tipos abstractos de datos se implementan mediante paquetes; si bien los tipos abstractos de datos sirven adems para una gran variedad de aplicaciones Un paquete Ada consta de dos partes: Especificacin del paquete, que declaia los nombres de los tipos, subprogramas y objetos que son visibles a los usuarios del paquete Cuerpo del paquete, que contiene la implementacin de los componentes que son ocultos a los clientes del paquete L.os formatos para definir la especificacin y el cuerpo de un paquete son:
package <nombre_paqwete> is <elementosdeclarativos> [private <elementos_declarativoc>] end <nombresaquete>, package body <nombresaquete> is end cnombre_pawete> ,

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

espe~ficaci6n del paquete

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:

cuerpo del paquete

128

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

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

Ada-83 no soDorta Ada-95 sooorta


1

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

4..3.3. Soporte de herencia en Ada-83


Ada-8.3 izo soporta herencia, pero s un tipo de pseudo-herencia, de modo que una declaracin de tipo de dato puede especifica1 que el tipo de dato se deriva de un tipo de dato ya existente As, a partir del tipo complejo, definido anteriormente, se puede declarar otro tipo Tipo-complejo, del modo siguiente:
with Tipo-Complejo;
package Ejemplo i s type otro_tipo-complejo end Ejemplo; ic new Tipo-Complejo Complejo;

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

4.3..4. Soporte Ada para orientacin a objetos


Las grandes limitaciones de mtodo de herencia de Ada y su ausencia de soporte de polimorfismo no permiten que Ada pueda ser utilizado como un lenguaje de programacin orientado a objetos A lo mximo, Ada se puede considerar

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-

' MEYER, Bertrand: Ohjeit-Oiiriiied

Softivaie Cuitsrruiiioii Prentice-Hall. 1988

130

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

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
-

4.4.3.. El lenguaje Eiffel


El nico criterio de estructuracin en Eiffel es la clase Una clase es una unidad simple y no se separa en una parte interfaz y en una parte implementacin Una clase en Eiffel define los elementos bsicos de sus objetos instancia: variables de instancia, mtodos de instancia y un mtodo de clase Las variables de instancias se llaman tambin atributos, los mtodos de instancia se llaman tambin rutinas y los atributos y rutinas se llaman colectivamente caracterirticas L.a clase P e r s o n a se representa con un cdigo similar a:
class Persona creation crea feature n0mbre:CTRWG; conyuge: Persona; feature (PERSONA) casado (n:PERSONA) is do conyuge : =n end: feature crea (c:STRING) is do nombre : = S ; end casado-con (p: PERSONA) is require existe : p/=void; solteros: (conyuge=void and y conyuge=vaid) do casado (p); p casado (actual) ensuze boda_valida:conyuge=y and actual=p conyuge end end

Ocultaciii de la iiiformacin Herencia Verificacin/ligadura de tipos Polimorfismo Recoleccin de basura Persistencia Concurreiicia Genericidad Biblioteca de objeios

S S (simple y mltiple) Tempiana S S Pseudo-persistencia Prometida S Pocas

Eiffel soporta conceptos de ingeniera de software tales como precondiciones, poscondiciones e invariantes de clases Estas caractersticas y las propias de orientacin a objetos lo hacen muy til para construir, soportar y mantener proyectos de software grandes

4.4.1 .

La biblioteca de clases Eiffel

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 entorno de programacin Eiffel

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

La clase E s t u d i a n t e que se deriva de Persona podr ser:


class Estudiante inherit Persona rename imprimir as imprimirpersona redefine imprimir end; creation hacer feature (NONEI es:STDFILES; feature hacer x (n=STRING) is do

132

Programacin orientada a objetos nombrepersona : = n; end imprimir is do e s putctring ("Estudiante: 1 ; imprimirpersona; end; end

Lenguajes de programacin orientados a objetos

133

4.5.,1.. El lenguaje Smalltalk


El bloque fundamental bsico de un programa Smalltalk es la clase La clase contiene la descripcin de variables de instancia y mtodos El mtodo es el equivalente al trmino funcin iniembro de ++ Al igual que en C + + , los mtodos contienen el cdigo que definen cmo responde un objeto a un mensaje La forma bsica de una sentencia Smalltalk es un mensaje enviar:
8

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:

ecepto? mensaje al.gumento

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

La Tabla 4 3 contiene las caractersticas ms sobresalientes de Smalltalk

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

Programacin orientada a objetos Lenguajes de programacin orientados a objetos

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++

4..5.2.. La jerarqua de clases Smalltalk


El entorno de programacin incluye una amplia biblioteca de varios centenares de clases Para gestionar esta gran lista de clases, Smalltalk las agrupa en categoras L.as categoras de clases implementan muchas estructuras de datos bsicos: colecciones, conjuntos, bolsas, diccionarios, etc Adems, existen clases predefinidas que iealizan entradas y salidas y ayudan a desarrollar componentes de interfaces de usuarios; algunas clases de esta categora son: Punto,
Rectngulo, F o r m a , V i s t a

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

La Figura 4 6 muestra una parte de la jerarqula de clases de Smalltalk

Figura 4 6

Jerarqua Taylor de clases d e Smalltalk,

4.6. OTROS LENGUAJES DE PROGRAMACION ORIENTADOS A OBJETOS


Hoy da se puede aventurar que existen muy pocos lenguajes comercializados que no tengan versiones orientadas a objetos, tal vez sea FORTRAN el nico lenguaje que no soporta estas caractersticas La mayora de los lenguajes estructurados modernos presentan una versin que es hbrida Los casos ms sobresalientes son:

136

Programacin orientada a objetos

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

MODELADO DE OBJETOS: RELACIONES

EJERCICIOS
4.1. Describa y justifique los objetos que obtiene de cada uno de estos casos:
a) Los habitantes de Europa y sus direcciones de correo.

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

Programacin orientada a objetos

Modelado d e objetos: relaciones

139

5.1. RELACIONES ENTRE CLASES


Las relaciones entre clases juegan un papel importante en el modelo de objetos Las clases, al igual que los objetos, no existen de modo aislado Por esta razn existirn ielaciones entre clases y entre objetos L.as relaciones entre entidades, clave del modelo relaciona] de datos, se expresan utilizando verbos a partir de frases del lenguaje ordinario, tales como vive-en, estudia-en, trabaja-para Las relaciones entre clases, como indica Booch', se deben a dos razones: Primera, una relacin de clases puede indicar algn tipo de comparticin (por ejemplo, margaritas y rosas son ambas tipos de flores) Segunda, una relacin entre clases puede indicar algn tipo de conexin semntica; por ejemplo, las rosas rojas y amarillas son ~ n s parecidas entre si que las margaritas y rosas Los tres grandes tipos de relaciones entre clases son:
e

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

Gerzeralizuci~z/especializaci6n (es-un)., Agregacin (tndnlparte)., Asociacin

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 )

Figura 5 1 , Jerarquia de clases

Booch2, para mostrar las semejanzas y diferencias entre clases, utiliza las siguientes clases de objetos: flores, margaritas, rosas iojas, rosas amarillas y ptalos Se puede constatar que: Una margarita es un tipo (una clase) de flor Una rosa es un tipo (diferente) de flor

' 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

Programacin orientada a objetos

Modelado de objetos: relaciones

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

5.2.1. Jerarquas de generalizacinlespecializacin


Las clases con propiedades comunes se organizan en superclases Una superclase representa una generalizaciiz de las subclases De igual modo, una subclase de una clase dada representa una especializaci~zde la clase superior (Fig 5 4) La clase derivada es-un tipo de clase de la clase base o super clase, es-un . . es-un f-'\es-un de pasajeros de pasajeros

wq

es-un Vehculo carga . es-un f

t\ es-un

Camin
L . .
1 '

Figura 5 2

Subclases de la clase Vehculo,,


Figura 5 4

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

objetos Persona es-un

Modelado de objetos. relaciones

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)

tiene tiene tiene Tejados

es-u/

u
lnformtico

Habitacin

\es--

/ es-un

Puertas

/1

Ventanas

Paredes

Figura 5 6 Una jerarqua de generalizacin de empleados

Figura 5 8 Un objeto compuesto (casa) y sus componentes,

144

Programacin orientada a objetos

Modelado de objetos. relaciones

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,

La agregacin no implica siempie contenido fsico, coino en el caso de


COCHE,sino que puede implicar simplemente relaciones conceptuales As, un EDIFICIO puede componerse de DIVISIONES, que a su vez constan de OFICINAS, O bien una COMPAIA consta de varios DEPARTAMENTOS y cada DEPARTAMENTO consta de varias SECCIONES

Figura 5 , l O Agregacin sin contenido fsico

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

5.3.1. Agregacin frente a generalizacin


La agregacin es diferente de la generalizacin La generalizacin relaciona las clases constituyendo un modo de esttucturar la descripcin de un objeto nico Con la generalizacin, un objeto es simultneamente una instancia de la superclase o clase base y una instancia de la subclase Una superclase se compone de propiedades que desctiben un objeto (relaciones es-un, un-tipo-de)

' 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

Programacin orientada a objetos

Modelado de objetos. relaciones

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

de genei alizaciiz de agi egaciiz

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

Figura 5 , l l Jerarqua compleja de agregaciones y generalizaciones

E
Boeing Jumbo Concorde
. .

r ;
.

-.

--

. .

. .

-- . -

relacign.de agregacin s e implementa mediante objetos compuestos.

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

Programacin orientada a objetos


, ,

Modelado de objetos: relaciones

149

--'

..-\

. . .
;
.'1

- *

.-

Venta

n: '

5.,4..1. Otros ejemplos de cardinalidad


Una asociacin una-a-una es la que mantienen objetos de la clase Persona y de la clase Nmero de la Seguridad Social (NSS) Cada persona tiene un nico nmero de la Seguridad Social y dado un nmero de la Seguridad Social se corresponde con una nica persona Obsrvese la relacin bidireccional entre objetos de estas dos clases

\ . . '

, . . 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

tiene Nombre Direccin identifica ~ m ~ ~ ~

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

una-a-muchas una-a-muchas opcionalidad

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

muchas-a-muchas muchas-a-muchas una-a-una

Ventas

Figura 5,.15 Asociacin muchas-a-muchas Las asociaciones se implementan mediante punteros o referencias a objetos de las clases

Figura 5 12

Relaciones de cardinalidad (multiplicidad)

150

Modelado de obietos: relaciones Programacin orientada a objetos

151

5..5. HERENCIA: JERARQUIA DE CLASES


Una de las herramientas disponibles en lenguajes orientados a objetos ms poderosos es la herencia Esta construccin permite modelar, del modo ms preciso, la realidad que se desea emular en su programa, abstrayendo el comportamiento comn entre objetos similares a travs de un mecanismo de generalizacin Este mecanismo, como ya se ha comentado, proporciona un gran detalle de descripcin, que comienza en clases globales y se va extendiendo a travs de subclases especficas y especializadas En otras palabras, la herencia permite crear muchas clases que son similares entre s, sin tener que rescribir cada vez las partes que son similares; esta propiedad permite combinar varias clases en una de ellas o modificar una clase existente sin modificar realmente el cdigo original La herencia es el corazri de la prograinacin orientada a objetos y constituye el bloque fundu~nental de construccin pala reutilizai el cdigo El segundo bloque de construccin es el polimorfismo La herencia es una tcnica natural y til para organizar programas, La herencia, en esencia, es una relacin entre clases, en donde una clase comparte la estructura o comportamiento definida en una clase (herencia siinple) o varias clases (hereizcia mltiple) La clase superior en la jerarqua se denomina superclase (clase base en C++); las clases que heredan los miembros de la superclase (incluyendo funciones y datos) se denominan subclase (clase derivada en C + + ) Las clases derivadas pueden tambin modificar miembros de la clase base o aadir nuevos miembros Este proceso puede continuar, de modo que una clase derivada servir normalmente como una clase base, a partir de la cual se definen otras clase derivadas Por consiguiente, se crean jerarquas de clases, en las que cada clase puede servir como un padre o raz de un nuevo conjunto de clases La Figura 5 16 representa un ejemplo de una jerarqua de clases

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

5.5.1. Herencia simple


El caso ms siinple de herencia es la herencia simple, en la que una clase slo se deriva de otra clase As, por ejemplo, en un caso tpico de zoologa, un gato o un perro es un animal? y en un caso tpico de botnica, un clavel es una flor Un gato posee determinadas caractersticas de la categora o clase animal; por otra patte, un gato difiere en determinadas caractersticas de la categora animal En nuestros ejemplos, <<Animal o Flor son las superclases o clases bases, y Gato o Rosa son las subclases, clases derivadas o clases extendidas o ampliadas Otro ejemplo simple puede se1 la clase P r o f e s o r como un tipo de clase derivado de Persona La clase P r o f e s o r es un tipo de (es-un) Persona, al que aade sus propias caracteristicas L.as clases se organizan en una estructura lgica denominada jeraiquia de clases La Figura 5 18 muestra unajerarqua de clases que contiene en su nivel ms alto la clase P e r s o n a y dos subclases o clases derivadas, E s t u d i a n t e y P r o f e s o r Las subclases heredan caractersticas de sus superclases Las caractersticas pueden ser variables de instancias (campos miembro) y/o mtodos (funciones miembro)

es-un Polgono es-un,

\ a es-un
, M =

Elipse

-f es-un

Figura 5,,16. Relaciones entre clases (un tipo de, o e s un/una.l

152

Programacin orientada a objetos

Modelado de objetos: relaciones

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,,

Jerarquia de clase Persona (herencia simple)

Superclase o clase base

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 Subclase o clase derivada

es-un

Figura 5 18. Jerarquia de clases: Persona, Profesor

v Estudiante

5.5.2. Herencia mltiple


Hasta este momento s610 se ha utilizado la herencia simple: cada subclase o clase derivada tiene una y s61o una supe~clase o clase base Supongamos una jerarqua de clases Persona, donde s610 existen relaciones de herencia simple

( Robocop )
Figura 5.20

Jerarquia de herencia mltiple

154

Programacin orientada a objetos

Modelado de objetos: relaciones

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,

Otro ejemplo de herencia mltiple se puede ver en la Figura 5 22, en donde


Comida y Planta son dos clases que actan como superclases de Patata,que

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

Comida Precio Calorias Comprar Comer Guisar

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

Jerarqua de clases P a t a t a con herencia multiple

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

Programacin orientada a objetos

Modelado de objetos: relaciones

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

5.6. HERENCIA REPETIDA


El otro problema grave que se produce en el uso de la herencia mltiple es la herencia repetida Este tipo de herencia se produce cuando una clase hereda de dos o ms superclases que a su vez heredan de la misma superclase Esta situacin se presenta, por ejemplo, en el caso de la Figura 5 24, en la que EstudianteTrabajador es una subclase de Empleado y Estudiante, que a su vez son subclases de Persona Suponiendo que Per cona tiene los atributos Nombre, Edad, Direccin que se reciben por herencia de EstudianteTrabalador En este caso, los atributos anteriores se repetirn en la ltima subclase
Atributos: Nombr e

Direccin Salario
Categora

Edad

Estudiante trabajador

Colisin

(se heredan Nombre,Edad y Direccin de las dos dases)

Figura 5.24, Herencia repetida

Figura 5 2 3 Colisin de nombres de atributos

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

Programacin orientada a objetos

Modelado de objetos: relaciones

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

Programacin orientada a objetos

Modelado de objetos. relaciones

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

miembros dato (creacin protegida) funciones miembro:

array de enteros cima de tipo entero


meter datos en la pila

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

Modelado de objetos relaciones Prograrnac,on orientada a objetos

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

Crculo Cilindro Cilindro hueco

Longitud Area Area Volumen Longitud Volumen

2 n n j2

2 n 1 h+2 n n r2 h
-

1'

2 n (r2 i2iizteino) + 2 n + 2 n Ii interno n ( r Z r2inteino) h


-

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

También podría gustarte