Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Ingeniería del software Ingeniería del software Benet Campderrich Falgueras Primera edición: abril 2003 © Fundació per a la Universitat Oberta de Catalunya © Benet Campderrich Falgueres, del texto © Editorial UOC, de esta edición Aragón, 182, 08011 Barcelona Material realizado por Eureca Media, SL Impresión: Diseño: Manel Andreu ISBN: 84-8429-793-4, del producto ISBN: 84-8318-997-6, del libro Depósito legal: Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada, reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio,sea éste eléctrico, químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita de los titulares del copyright. Autor Benet Campderrich Falgueras Doctor en Ingeniería Industrial. Especializado en ingeniería del software y bases de datos. Profesor titular de la Universidad Rovira i Virgili. © Editorial UOC 7 Índice Índice Presentación ................................................................................................... 13 Capítulo I. Introducción a la ingeniería del software OO ................ 15 1. Qué es la ingeniería del software ............................................................. 15 1.1. El software como producto industrial.................................................. 16 1.2. La ingeniería del software .................................................................... 17 1.3. Los grandes problemas de la ingeniería del software: la calidad y la productividad............................................................... 17 2. El ciclo de vida del software ..................................................................... 19 2.1. El ciclo de vida clásico......................................................................... 20 2.2. Los ciclos de vida iterativos e incrementales ...................................... 23 3. Desarrollo estructurado y desarrollo orientado a objetos ..................... 28 3.1. Los métodos estructurados.................................................................. 28 3.2. Los métodos orientados a objetos....................................................... 28 3.3. Los métodos formales.......................................................................... 30 4. Las herramientas CASE ............................................................................. 30 5. El OMG y el UML ....................................................................................... 32 5.1. El Object Management Group (OMG) .................................................... 32 5.2. Unified Modeling Language (UML) ........................................................ 32 Conclusiones ................................................................................................... 35 Capítulo II. UML (I): el modelo estático ................................................ 37 1. Concepto de modelo estático y diagrama de clases ............................... 37 2. Clasificadores ............................................................................................. 39 3. Paquetes...................................................................................................... 40 4. Clase y conceptos afines ........................................................................... 43 4.1. Representación ampliada de las clases ................................................ 43 © Editorial UOC 8 Ingeniería del software 4.2. La herencia en el análisis y el diseño .................................................. 48 4.3. Variantes en el concepto de clase ....................................................... 51 4.4. Interfaces ............................................................................................. 54 5. Representación de los objetos .................................................................. 56 6. Relaciones entre clases .............................................................................. 57 6.1. Asociaciones ........................................................................................ 57 6.2. Agregaciones y composiciones............................................................ 63 6.3. Relaciones de dependencia ................................................................. 66 7. Comentarios y restricciones ..................................................................... 67 7.1. Comentarios ........................................................................................ 67 7.2. Restricciones........................................................................................ 67 Conclusiones ................................................................................................... 69 Capítulo III. UML(II): el modelo dinámico y de implementación ............................................................................. 71 1. El diagrama de estados.............................................................................. 71 1.1. Conceptos básicos ............................................................................... 72 1.2. Notaciones básicas............................................................................... 74 1.3. Transiciones complejas ....................................................................... 78 1.4. Estados compuestos............................................................................. 79 1.5. Notación ampliada del estado............................................................. 82 2. El diagrama de casos de uso ..................................................................... 83 2.1. Actores ................................................................................................. 83 2.2. Concepto de caso de uso..................................................................... 85 2.3. Relaciones entre casos de uso.............................................................. 86 2.4. Notación.............................................................................................. 87 3. Los diagramas de interacción................................................................... 88 3.1. Interacciones y colaboraciones ........................................................... 88 3.2. El diagrama de colaboración ............................................................... 93 3.3. El diagrama de secuencias ................................................................... 95 4. El diagrama de actividades....................................................................... 99 4.1. Elementos específicos .......................................................................... 99 5. Los diagramas de implementación ........................................................ 102 5.1. El diagrama de componentes ............................................................ 102 5.2. El diagrama de despliegue ................................................................. 105 Conclusiones ................................................................................................. 107 © Editorial UOC 9 Índice Capítulo IV. Recogida y documentación de requisitos ................... 109 1. Los requisitos ........................................................................................... 110 1.1. Clases de requisitos ........................................................................... 110 2. Fuentes de información .......................................................................... 111 3. Pasos de la recogida y documentación de requisitos ........................... 112 3.1. El contexto del software ..................................................................... 112 3.2. Los guiones ........................................................................................ 114 3.3. Identificación de los actores.............................................................. 114 3.4. Identificación de los casos de uso ..................................................... 115 3.5. Identificaciónde las relaciones entre casos de uso........................... 116 3.6. Identificación de las relaciones de especialización entre actores ..... 118 3.7. La documentación de los casos de uso ............................................. 118 4. La recogida y documentación de requisitos de la interfaz de usuario ... 120 4.1. Concepto de interfaz de usuario ....................................................... 120 4.2. Identificación de las restricciones técnicas ....................................... 121 4.3. Elaboración de los perfiles de usuario............................................... 121 4.4. Documentación de las tareas actuales y futuras ............................... 122 4.5. Comparación entre tareas y casos de uso ......................................... 123 4.6. Especificaciones de usabilidad .......................................................... 124 5. Ejemplo..................................................................................................... 124 5.1. Información inicial ........................................................................... 125 5.2. Modelo del dominio.......................................................................... 125 5.3. Modelo del negocio........................................................................... 126 5.4. El glosario del modelo del negocio ................................................... 128 5.5. Los guiones ........................................................................................ 129 5.6. Casos de uso ...................................................................................... 130 5.7. Requisitos de la interfaz de usuario................................................... 135 Conclusiones ................................................................................................. 139 Capítulo V. Análisis orientado a objetos ............................................. 141 1. El papel del análisis................................................................................. 142 1.1. La relación entre la recogida de requisitos y el análisis .................... 142 1.2. La relación entre el análisis y el diseño............................................. 142 1.3. La utilidad del análisis....................................................................... 143 2. Paquetes de análisis y paquetes de servicios ......................................... 144 2.1. Los paquetes de análisis .................................................................... 145 © Editorial UOC 10 Ingeniería del software 2.2. Los paquetes de servicios................................................................... 145 3. Revisión de los casos de uso ................................................................... 146 4. Especificación de las clases de análisis .................................................. 147 4.1. Identificación de las clases de entidades........................................... 148 4.2. Especificación de los atributos de las clases de entidades................. 150 4.3. Identificación de las relaciones entre clases...................................... 151 4.4. Identificación de las clases de frontera, las clases de control y de las operaciones. Diagrama estático de análisis .......................... 158 5. Especificación formal de los casos de uso ............................................. 158 6. Análisis de la interfaz de usuario ........................................................... 159 7. Ejemplo..................................................................................................... 160 7.1. Revisión de los casos de uso.............................................................. 160 7.2. Paquetes de análisis y de servicios .................................................... 160 7.3. Identificación de las clases de entidades........................................... 161 7.4. Especificación de los atributos de las clases de entidades................. 162 7.5. Relaciones .......................................................................................... 163 7.6. Identificación de las clases de frontera, las clases de control y de las operaciones........................................................................... 166 7.7. Especificación formal de los casos de uso ......................................... 169 7.8. Análisis de la interfaz de usuario....................................................... 171 Conclusiones ................................................................................................. 175 Capítulo VI. Diseño orientado a objetos.............................................. 177 1. El papel del diseño .................................................................................. 178 1.1. La relación entre el diseño y la realización....................................... 178 1.2. La utilidad del diseño ........................................................................ 179 2. La reutilización ........................................................................................ 179 2.1. La reutilización de clases ................................................................... 179 2.2. La reutilización de componentes ...................................................... 180 2.3. Los patrones ...................................................................................... 180 2.4. Marcos de aplicaciones...................................................................... 192 3. El diseño arquitectónico ......................................................................... 193 3.1. Establecimiento de la configuración de la red .................................. 194 3.2. Establecimiento de los subsistemas................................................... 194 4. El diseño de los casos de uso .................................................................. 195 © Editorial UOC 11 Índice 5. Revisión del diagrama estático de diseño ............................................. 196 5.1. Normalización de los nombres ......................................................... 197 5.2. Reutilización de clases ....................................................................... 198 5.3. Adaptación de la herencia en el nivel soportado por el lenguaje de programación ............................................................................... 198 5.4. Sustitución de las interfaces .............................................................. 201 5.5. Cambios para la mejora del rendimiento ......................................... 201 5.6. Especificación de las operaciones implícitas..................................... 202 5.7. Referencias a las clases de frontera.................................................... 202 5.8. La clase inicial ................................................................................... 203 5.9. Cohesión y acoplamiento ................................................................. 203 6. Diseño de la persistencia ........................................................................ 205 6.1. Persistencia con bases de datos orientadas a objetos ........................ 206 6.2. El modelo para bases de datos relacionales y ficheros clásicos: alternativas ........................................................................................ 206 6.3. Persistencia con bases de datos object-relational ................................ 215 7. Diseño de la interfaz gráfica de usuario ................................................ 216 7.1. Elementos y funcionamiento de la interfaz gráfica de usuario ........ 217 7.2. El diseño de las interfaces gráficas .................................................... 236 8. Diseño de los subsistemas ....................................................................... 243 9. Ejemplo..................................................................................................... 244 9.1. El diseño arquitectónico ...................................................................244 9.2. El diseño de los casos de uso ............................................................. 244 9.3. El diagrama estático de diseño.......................................................... 249 9.4. El diseño de la persistencia ............................................................... 251 9.5. El diseño de la interfaz de usuario .................................................... 254 9.6. El diseño de los subsistemas.............................................................. 258 Conclusiones ................................................................................................. 260 Capítulo VII. Introducción al software distribuido ........................ 261 1. Entornos distribuidos y entornos abiertos ............................................ 261 1.1. Objetivos de los entornos distribuidos ............................................. 262 1.2. Importancia de las normas en los entornos distribuidos ................. 263 1.3. Concepto de sistema abierto ............................................................. 263 2. Entornos cliente/servidores clásicos...................................................... 264 2.1. Ventajas e inconvenientes de la arquitectura cliente/servidor......... 265 2.2. Arquitecturas cliente/servidor de dos capas...................................... 266 2.3. Arquitecturas de más de dos capas.................................................... 267 © Editorial UOC 12 Ingeniería del software 3. Entornos con middleware: CORBA ........................................................ 268 3.1. Concepto de middleware.................................................................... 268 3.2. CORBA............................................................................................... 269 4. RMI............................................................................................................ 298 4.1. Mecanismos de una invocación remota ........................................... 298 5. Documentos compuestos distribuidos: DCOM..................................... 299 5.1. Concepto de documento compuesto ................................................ 299 5.2. Aspectos de la gestión de los documentos compuestos.................... 300 5.3. OLE, COM y DCOM.......................................................................... 301 6. Desarrollo del software distribuido........................................................ 308 6.1. El análisis de requisitos en el caso de software distribuido ............... 308 6.2. La distribución de los objetos ........................................................... 308 Bibliografía.................................................................................................... 312 Glosario ......................................................................................................... 314 © Editorial UOC 13 Presentación Presentación La ingeniería del software comprende los métodos y las técnicas que se utili- zan en el desarrollo profesional del software. Se trata de un campo muy amplio, del cual esta materia sólo trata una parte. La ingeniería del software consta principalmente de dos familias de técnicas: • Las estructuradas, cronológicamente las más antiguas. • Las orientadas a objetos (OO), que constituyen la parte principal de esta obra, con las exclusiones mencionadas. El resto de la obra es una introducción a la ingeniería del software. La tecnología de elaboración de software orientado a objetos ha tenido la ma- yor parte de su desarrollo desde 1985 hasta la actualidad. Como suele pasar con toda nueva tecnología, al principio aparecen muchas técnicas alternativas y el paso del tiempo comporta que muchas se abandonen y sólo quede una o algunas que llegan a ser un estándar, oficial o de hecho. Parece que la tecnología orien- tada a objetos ha alcanzado hace unos pocos años esta situación, al menos en lo que respecta al modelo básico, del cual existe el estándar denominado UML, ya ampliamente aceptado y utilizado. Éste es el modelo que utilizamos. Además del modelo utilizado, otro aspecto fundamental del desarrollo de software es el método, ya que, si utilizamos el mismo modelo, podemos imagi- nar muchos métodos diferentes que utilizan las notaciones del modelo en otro orden o para otros propósitos distintos. A diferencia del caso del modelo básico, es poco probable que se imponga un método como estándar; como mucho se puede establecer como estándar legal la presentación de una determinada docu- mentación elaborada según un modelo fijado, pero la manera como se trabaje para elaborarla siempre tendrá un margen de libertad amplio. © Editorial UOC 14 Ingeniería del software En esta obra se ha optado por seguir un método inspirado en el denominado Rational Unified Process, porque éste es bastante elaborado y coherente y, ade- más, ha sido desarrollado esencialmente por el mismo equipo que desarrolló el UML, lo cual ofrece una cierta garantía de coherencia entre el método y el mo- delo. Se puede considerar que esta obra tiene una parte básica, un núcleo y una conclusión: • La parte básica comprende unos conocimientos fundamentales, que son el ca- pítulo “Introducción a la ingeniería del software OO”, dedicado a los conceptos generales de la ingeniería del software; el capítulo “UML (I): el modelo estático” y el capítulo “UML (II): el modelo dinámico y de implementación”. • El núcleo de la obra está constituido por los capítulos “Recogida y documen- tación de requisitos”, “Análisis orientado a objetos” y “Diseño orientado a objetos”. • La conclusión es el capítulo “Introducción al software distribuido”, que ofrece una visión general de la tecnología del software distribuido orientado a obje- tos. Este tema conduce a introducir no solamente la problemática y las técni- cas directamente relacionadas con la distribución del software, sino también conceptos que tienen un campo de aplicación más amplio. © Editorial UOC 15 Capítulo I. Introducción a la... Capítulo I Introducción a la ingeniería del software OO En este capítulo se empieza a introducir el concepto de ingeniería de software y a presentar su problemática. Se describe con detalle el ciclo de vida clásico o en cas- cada, y se presentan los modelos de ciclo de vida alternativos, en especial los cono- cidos como modelos iterativos e incrementales, entre los cuales se describe el ciclo de vida del Rational Unified Process. Se definen también las dos grandes líneas tecnológicas actuales en el desarro- llo de software: el desarrollo estructurado y el desarrollo orientado a objetos, y se introduce el concepto de herramienta CASE. El capítulo termina con la pre- sentación del origen y estatus del modelo estándar UML, el modelo orientado a objetos que se utiliza en esta obra, y del OMG, la organización responsable del mismo. 1. Qué es la ingeniería del software Un sistema de software, denominado también aplicación o simplemente software, es un conjunto integrado de programas que en su forma definitiva se pueden ejecutar, pero comprende también las definiciones de estructuras de da- tos (por ejemplo, definiciones de bases de datos) que utilizan estos programas y también la documentación referente a todo ello (tanto la documentación de ayuda en el uso del software para sus usuarios como la documentación generada durante su construcción, parte de la cual también servirá para su mantenimien- to posterior). © Editorial UOC 16 Ingeniería del software 1.1. El software como producto industrial Un software no es una obra de arte, sino un producto de consumo utilitario y masivo; para una empresa o trabajador autónomo, el software es un medio auxi- liar que interviene de manera más o menos indirecta, pero a menudo imprescin- dible, en su gestión y cada vez más en su proceso productivo; también existe, como todos sabemos, un consumo privado de software. Por tanto, se puede con- siderar plenamente como un producto industrial. Por ejemplo...… los bancos, las industrias de fabricación en serie, las empresas de comercio electró- nico, etc. actualmente no podrían funcionar sin software. Sin embargo, es un producto industrial con algunas características especiales. En primer lugar, es mucho más un producto singular que un producto que se fa- brique en serie (aunque algunos software tienen muchos miles de usuarios e, inclu- so, millones), ya que, si bien existe –y no siempre– producción en serie de copias del software, ésta es una actividad muy poco importante dentro del conjunto de su proceso productivo y relativamente sencilla. ¡La producción de software se parece a la construcción! Desde cierto punto de vista, la producción de software se parece a la construcción de vi- viendas o edificios industriales, por ejemplo, en el hecho de que cada producto es dife- rente y su elaboración se basa en un proyecto específico (en el caso de producción en serie, lo que se proyecta es un prototipo del producto, y no cada unidad que se produce). © Editorial UOC 17 Capítulo I. Introducción a la... Otras características del software son, como señala Pressman, que no se estro- pea por el uso ni por el paso del tiempo. Si finalmente se tiene que sustituir es porque se ha quedado tecnológicamente anticuado o inadaptado a nuevas ne- cesidades o porque ha llegado a resultar demasiado caro mantenerlo. 1.2. La ingeniería del software En general, a cada tipo de producto industrial corresponde un tipo de in- geniería, entendida como el conjunto de métodos, técnicas y herramientas que se utilizan tanto para desarrollar el producto (es decir, elaborar el proyec- to o prototipo) como para fabricarlo (afinando más se puede decir que exis- ten, pues, dos ingenierías para cada tipo de productos: la del producto y la del proceso). Una técnica es la manera preestablecida en la que se lleva a término un paso en la elaboración del producto, un método es una manera determinada de apli- car varias técnicas sucesivamente y una herramienta es un instrumento de cual- quier tipo que se utiliza en la aplicación de una técnica. El software no es ninguna excepción a esta regla, y, por tanto, hay una inge- niería del software que comprende las técnicas, métodos y herramientas que se utilizan para producirlo. En el caso de la ingeniería del software no se suele hablar de ingeniería de pro- ceso; quizá se podría pensar que es la que hace referencia a la programación en sentido estricto, pero cada vez es menos nítida la distinción entre la programa- ción y las fases anteriores en el desarrollo de software. 1.3. Los grandes problemas de la ingeniería del software: la calidad y la productividad A pesar de los grandes adelantos que ha habido en las técnicas de desarrollo de software durante los últimos treinta años, tanto la calidad del software como la productividad de su proceso de elaboración todavía no han alcanzado niveles © Editorial UOC 18 Ingeniería del software plenamente comparables con los de otras tecnologías más antiguas. Todo esto, combinado con un aumento realmente espectacular de la demanda de software, ha provocado lo que se ha denominado la crisis del software. En cuanto a la calidad, la causa principal de dificultades es la gran complejidad del software comparado con otros tipos de productos, que provoca, por ejemplo, que no sea posible, ni mucho menos, probar el funcionamento de un software en todas las combinaciones de condiciones que se pueden dar. Y eso ocurre en una época en la que se da cada vez más importancia a la calidad en todos los ámbitos, al considerarla un factor de competitividad dentro de unos mercados cada vez más saturados y, por tanto, más exigentes. No es extraño, pues, que el tema de la calidad (y dentro de éste, cuestiones como la garantía de calidad y las certificacio- nes oficiales de calidad) adquiera una importancia creciente dentro de la ingenie- ría del software. Por lo que respecta a la productividad, cabe decir para empezar que cual- quier fabricación en serie tiene necesariamente una productividad mucho más elevada que la fabricación de un producto singular; pero, incluso, si la compa- ramos con otras ingenierías de producto singular, la productividad es clara- mente inferior. La complejidad del producto también puede ser una causa de este hecho, pero ciertamente no es la única. Un factor que tiene un peso real- mente importante en la baja productividad es el hecho de que, a diferencia de las otras tecnologías, en un proyecto de software el desarrollo empieza tradicio- nalmente de cero (sólo recientemente se utilizan fragmentos de software “pre- fabricados”). El aprovechamiento de elementos en la fabricación en serie Cuando se diseña un nuevo modelo de coche, se incluyen desde el principio muchí- simos elementos que ya existían y que, por tanto, no es necesario diseñar; no sólo elementos normalizados como tornillos y tuercas, sino también elementos más com- plejos como baterías e, incluso, motores o cajas de cambio completos. También en la construcción de edificios –una actividad que tiene más semejanzas con la produc- ción de software, como se ha indicado– se utilizan muchos elementos estándares o prefabricados: tejas, vigas, ventanas, persianas, grifos, etc. Por tanto, no es extraño que uno de los grandes retos, por el momento, de la ingeniería del software sea conseguir desarrollar fragmentos de software (de- © Editorial UOC 19 Capítulo I. Introducción a la... nominados componentes) que sean reutilizables, por un lado, y, por el otro, de- sarrollar software y reutilizar sus fragmentos (que seguramente estarán mejor probados que si se hicieran de nuevo, lo cual además mejoraría la calidad del software producido). Una de las vías mediante las cuales se pretende conseguir una cierta reuti- lización en el desarrollo orientado a objetos es especialmente con compo- nentes; otras son los patrones de diseño (reutilización, si no de fragmentos de software, por lo menos de ideas o “recetas” para hacerlos) y los marcos o frameworks, que son estructuras formadas por sistemas de software a los cuales se pueden acoplar otros sistemas de software, sustituibles, para hacer funciones concretas. 2. El ciclo de vida del software La producción de software es algo más que la programación; hay etapas que la preceden y otras que la siguen. El ciclo de vida del software está constituido por el conjunto de todas estas etapas. Los métodos y técnicas de la ingeniería del software se inscriben dentro del marco delimitado por el ciclo de vida del software, y, más concretamente, por las diferentes etapas que se distinguen. La misma existencia de distintos modelos del ciclo de vida del software hace comprender que no hay ninguno que sea ideal o que no tenga grandes limita- ciones. Sin embargo, es indispensable que todo proyecto se desarrolle dentro del mar- co de un ciclo de vida claramente definido, si se quiere tener una mínima garan- tía de cumplimiento de los plazos, y respetar los límites de los recursos asignados. Además, la garantía de calidad y las certificaciones* de calidad también presupo- nen que el proceso de producción de software se desarrolle según un ciclo de vida con etapas bien definidas. *. Un ejemplo de certificación de calidad sería la ISO. © Editorial UOC 20 Ingeniería del software 2.1. El ciclo de vida clásico La figura siguiente nos muestra las etapas previstas en una cierta versión del ciclo de vida clásico. A veces, el ciclo de vida clásico también se denomina ciclo de vida en cascada, lo cual quiere decir que en cada etapa se obtienen unos documentos (en inglés, deliverables) que son las bases de partida de la etapa siguiente –que, por tanto, no puede comenzar antes de que haya terminado la anterior– y nunca se regresa a etapas pasadas. 2.1.1. Etapas La primera etapa se denomina análisis previo y también análisis de sistemas o ingeniería de sistemas. En esta etapa se definen los grandes rasgos del sistema de softwareque tendrá que dar soporte informático a unas actividades determi- nadas de unos ciertos usuarios dentro del marco más general de la actividad de la empresa u organización. © Editorial UOC 21 Capítulo I. Introducción a la... Además, este sistema tendrá que funcionar en un entorno de hardware y red determinado, que será necesario indicar, y quizá también tendrá que intercam- biar información con otro software o compartir una base de datos. Estos hechos constituyen otros aspectos del entorno del futuro software de los cuales se tendrá que dejar constancia. Hay que tener en cuenta los recursos necesarios para el desarrollo del software y los condicionamientos temporales, especialmente los plazos impuestos desde fuera del proyecto, que a menudo están determinados por los hechos que han causado las necesidades de información que tiene que satisfacer dicho software, y también restricciones eventuales y condiciones adicionales que sea necesario res- petar; y, en función de todo esto, se evalúa la viabilidad técnica, económica y le- gal del proyecto de desarrollo de dicho software. El documento que resulta de esta etapa se denomina Especificación del siste- ma, y sirve de base para tomar la decisión definitiva sobre la continuación del proyecto. La segunda etapa es el análisis de requisitos o simplemente análisis. Su objeti- vo es definir con detalle las necesidades de información que tendrá que resolver el software, sin tener en cuenta, por el momento, los medios técnicos con los que se tendrá que llevar a término el desarrollo del software. Como el lenguaje de programación, el gestor de bases de datos, los compo- nentes que se pueden reutilizar, etc. En esta etapa detallamos los requisitos de la etapa anterior; ahora sólo pen- samos en el software que es necesario desarrollar y sus interfaces con el entorno. La figura responsable del análisis –el analista, que puede ser un informático o un usuario– debe tener o adquirir conocimientos generales sobre el dominio de la aplicación y obtener información de los usuarios y de otras fuentes que le per- mita hacerse una idea precisa de las funciones, y de los requisitos en general, del futuro software. Con esta información se redacta el documento que llamaremos Especificación de requisitos, que tiene una doble función: especificar qué debe hacer el software, con la suficiente precisión para que se pueda desarrollar, y servir de base para un contrato, explícito o no, entre el equipo de desarrollo del software y sus futuros usuarios. El diseño es la etapa siguiente. Si el análisis especifica el problema o “qué tiene que hacer el software”, el diseño especifica una solución a este problema o “cómo el software tiene que hacer su función”. © Editorial UOC 22 Ingeniería del software Del software, hay que diseñar varios aspectos diferenciados: su arquitectura general, las estructuras de datos (base de datos, etc.), la especificación de cada programa y las interfaces con el usuario, y se tiene que llevar a cabo de manera que, a partir de todo esto, se pueda codificar el software, de una manera parecida a la construcción de un edificio o de una máquina a partir de unos planos. El documento resultante es la Especificación del diseño. La etapa de diseño es el mejor momento para elaborar la Especificación de la prueba, que describe con qué datos se tiene que probar cada programa o grupo de programas y cuáles son los resultados esperados en cada caso. La programación o codificación, que es la cuarta etapa, consiste en traducir el diseño a código procesable por el ordenador. Es en esta etapa donde se le da forma real al software, es en realidad cuando se elabora. El entregable que se genera en esta etapa es el programa propiamente, con to- das sus funcionalidades y componentes. La prueba es la última etapa del desarrollo del software y la penúltima del mo- delo de ciclo de vida del software que hemos considerado. La etapa de prueba consiste en probar el software desde distintos puntos de vista de una manera planificada y, naturalmente, localizar y corregir dentro del software y su documentación los errores que se detecten. La prueba se lleva a término en las dos fases siguientes: 1) En la primera se hacen pruebas, primero para cada uno de los programas por separado y, después, por grupos de programas directamente relacionados, y se aplica la especificación de la prueba que hemos mencionado con anterioridad. 2) En la segunda fase se comprueba que el conjunto de programas dé los re- sultados que se esperan y que lo haga con el rendimiento deseado. El primer equipo de desarrollo hace la última fase de la prueba y, si los resulta- dos son satisfactorios, se entrega el software al cliente, el cual puede hacer una prue- ba parecida por su cuenta y con sus datos, con la finalidad de decidir si acepta el software. Con la aceptación por parte del cliente se da por terminado el desarrollo. La última etapa del ciclo de vida es el mantenimiento o, si se prefiere, explo- tación, del software, ya que siempre que se utilice el software habrá que mantener- lo, es decir, hacer cambios –pequeños o grandes– para corregir errores, mejorar © Editorial UOC 23 Capítulo I. Introducción a la... las funciones o la eficiencia, o adaptarlo a un nuevo hardware o a cambios en las necesidades de información. Puesto que un software puede estar en explotación diez años o más, a menu- do el coste total del mantenimiento durante la vida del software es de dos a cinco veces mayor que el coste de desarrollo. 2.1.2. El caso de lenguajes de cuarta generación Los lenguajes –o más bien entornos de programación– de cuarta generación son de muy alto nivel (en el sentido de que a menudo una sola de sus instruccio- nes equivale a muchas instrucciones del lenguaje ensamblador) y en gran parte son no procedimentales y están integrados en un gestor de bases de datos rela- cionales. Incluyen herramientas de dibujo de pantallas, generación de listados y en ocasiones salidas gráficas y hoja de cálculo. Algunos pueden generar código en un lenguaje de tercera generación. Para aplicaciones sencillas, se puede pasar directamente de los requisitos a la codificación, pero en proyectos complejos es necesario llevar a cabo una etapa de diseño, aunque simplificada. 2.2. Los ciclos de vida iterativos e incrementales El ciclo de vida en cascada ha sido muy criticado y se han propuesto algunos modelos alternativos. 2.2.1. Inconvenientes del modelo de ciclo de vida en cascada El inconveniente del modelo de ciclo de vida en cascada es que no es realista. Como se ha visto, el modelo de ciclo de vida en cascada comporta que las sucesivas etapas del desarrollo se hacen de manera lineal, de forma que una fase no comienza mientras no se haya acabado la anterior, y no se vuelve nunca atrás. También queda implícito en el modelo que, cuando se acaba una fase, se sabe al menos aproximadamente qué porcentaje del proyecto queda por hacer, ya que © Editorial UOC 24 Ingeniería del software si el análisis se ha completado y su resultado es cien por cien fijo, se puede saber con cierta precisión la duración del diseño e, incluso, de la programación. Ahora bien, en la realidad es posible que la especificación del sistema sea fia- ble en lo que respecta a las funciones, ya que no se espera que se describan pun- to por punto. Sin embargo, precisamente por esto último, el coste y la duración del proyecto se han calculado sobre una base muy poco sólida y tienen un gran margen de error. No obstante, el problema más grave se presenta en el análisis de requisitos, por el hecho de que éstos casi siempre son incompletos al principio o cambian antes de que se haya acabado de construir el software, y a menudo suceden ambas cosas a la vez. Y si la especificación de requisitos es incompleta e insegura, es obvio que el diseño y la programación tendrán problemas y, sobre todo, retra- sos y aumentos de coste importantes para el trabajo no previstoque se deberá hacer y también para el que será necesario rehacer. Existen dos razones por las cuales es prácticamente imposible elaborar unos requisitos completos y estables en el primer intento: a) En primer lugar, es difícil encontrar un conjunto de futuros usuarios que conozcan lo suficiente el entorno en el que se debe utilizar el software, que hayan reflexionado lo suficiente sobre lo que quieren conseguir y que, además, se pon- gan de acuerdo. b) En segundo lugar, porque el trabajo de consolidación de las peticiones de estos usuarios nunca será perfecto. En cualquier caso, tenemos que contar con el hecho de que, una vez termina- da oficialmente la etapa de análisis y comenzada la de diseño, todavía surgirán re- quisitos nuevos y cambios en los ya existentes. ¿Qué se puede hacer, entonces? Parece que la opción más razonable sea es- tudiar a fondo una pequeña parte de los requisitos que tenga una cierta autono- mía, y diseñarla, programarla y probarla, y una vez que el cliente la haya dado por buena, hacer lo mismo con otra parte, y otra. Si partimos de un software ya construido en parte, se puede esperar que la idea que nos hacemos de los requi- sitos restantes pueda ser cada vez más precisa y que también obtengamos una estimación cada vez más segura del coste y de la duración del proyecto comple- to; esto es lo que denominamos ciclo de vida iterativo e incremental (iterativo por- © Editorial UOC 25 Capítulo I. Introducción a la... que se repite dentro de un mismo proyecto e incremental porque procede por partes). Y se tendrá que considerar normal que, a veces, cuando se construya una parte, se vea que es necesario modificar una hecha con anterioridad. La necesidad de estimar el coste y los plazos Los inconvenientes del modelo del ciclo de vida clásico mencionados en este subapar- tado no quieren decir que no pueda haber plazo o límite de coste para un proyecto de desarrollo de software; simplemente, se debe reconocer que no es realista creer que se pueda fijar de forma exacta la funcionalidad, el coste y la duración del proyecto, todo a la vez. Si el software tiene que funcionar en una fecha determinada y no se puede au- mentar el gasto en personal, será necesario estar dispuesto a aceptar que el software no realice todas las funciones deseadas; si la funcionalidad y la fecha de entrega del pro- grama son innegociables, se tendrá que aumentar el número de programadores o ana- listas. Y esto no supone ninguna renuncia en relación con los resultados que se alcanzaban hasta ahora, porque en la práctica muy pocos eran los proyectos en los que no se producían desviaciones en cuanto a la funcionalidad, presupuesto o plazo, sino en varias de estas cosas al mismo tiempo. Por tanto, el modelo de ciclo de vida en cascada puede ser válido si se aplica de manera que cada etapa, del análisis de requisitos a la prueba, no prevea todo el conjunto del software, sino sólo una parte cada vez; entonces tendríamos un ciclo de vida iterativo e incremental basado en el ciclo de vida en cascada. 2.2.2. El ciclo de vida con prototipos Para ayudar a concretar los requisitos, se puede recurrir a construir un proto- tipo del software. Un prototipo es un software provisional, construido con herramientas y téc- nicas que dan prioridad a la rapidez y a la facilidad de modificación antes que a la eficiencia en el funcionamiento, que sólo tiene que servir para que los usua- rios puedan ver cómo sería el contenido o la apariencia de los resultados de al- gunas de las funciones del futuro software. Un prototipo sirve para que los usuarios puedan confirmar que lo que se les muestra, efectivamente, es lo que necesitan o bien lo puedan pedir por compa- ración, y entonces se prepara una nueva versión del prototipo teniendo en cuen- © Editorial UOC 26 Ingeniería del software ta las indicaciones de los usuarios y se les enseña otra vez. En el momento en que el prototipo ha permitido concretar y confirmar los requisitos, se puede comen- zar un desarrollo según el ciclo de vida en cascada, en este caso, no obstante, par- tiendo de una base mucho más sólida. Características del ciclo de vida con prototipos El ciclo de vida con prototipos no se puede considerar plenamente un ciclo de vida iterativo e incremental, ya que sólo el prototipo se elabora de manera iterativa, y no necesariamente incremental. Sin embargo, es un modelo de ciclo de vida que puede ser adecuado en algunos casos, en especial cuando basta con prototipar un número reducido de funciones para que las otras sean bastante parecidas a éstas de forma que las conclusiones a las que se llegue con el prototipo también les sean aplicables. 2.2.3. La programación exploratoria La programación exploratoria consiste en elaborar una primera versión del software, o de una parte de éste, enseñarla a los usuarios para que la critiquen y, a continuación, hacerle los cambios que éstos sugieran, proceso que se repetirá tantas veces como sea necesario. La diferencia principal con respecto a los prototipos es que aquí el software es real desde el principio. Características de la programación exploratoria La programación exploratoria se puede considerar un ciclo de vida iterativo, pero no in- cremental, ya que el software está completo desde la primera versión. Como consecuencia de las numerosas modificaciones que sufre, la calidad del software desarrollado de esta manera y de su documentación tiende a ser deficiente, como la de un software que haya experimentado un mantenimiento largo e intenso. 2.2.4. El ciclo de vida del Rational Unified Process La empresa Rational Software ha propuesto este ciclo de vida como marco para el desarrollo de software que utiliza sus herramientas. Es claramente un ci- clo de vida iterativo e incremental. © Editorial UOC 27 Capítulo I. Introducción a la... Se distinguen estas cuatro etapas (denominadas fases): 1) Inicio Se establece la justificación económica del software y se delimita el alcance del proyecto. 2) Elaboración Se estudia el dominio del problema, o simplemente dominio (parte de la ac- tividad de la empresa dentro de la cual se utilizará el software) y se tienen en cuenta muchas de las necesidades de información y eventuales requisitos no funcionales y restricciones, se establece la arquitectura general del software y se realiza una planificación del proyecto. 3) Construcción Se desarrolla todo el producto de forma iterativa e incremental, se tienen en cuenta todas las necesidades de información que debe satisfacer y se desarrolla la arquitectura obtenida en la fase anterior. 4) Transición Comprende la entrega del producto al cliente y el comienzo de su utiliza- ción; aunque es posible que sea necesario hacer retoques en el software y añadir nuevas funciones como consecuencia de errores detectados o de requisitos que se habían pasado por alto hasta el momento. En cada una de estas fases se llevan a cabo (en diferentes proporciones) los siguientes componentes de proceso: • recogida de requisitos (requirement capture), • análisis y diseño, • realización (implementation), • prueba (test ). Cada unidad en la que se ejecutan pocos o muchos de los componentes de proceso es una iteración, y se aplica a un nuevo fragmento de software. Todas las fases tienen iteraciones. © Editorial UOC 28 Ingeniería del software 3. Desarrollo estructurado y desarrollo orientado a objetos Los métodos de desarrollo de software más utilizados hasta ahora pertenecen a dos grandes grupos: los métodos estructurados y los métodos orientados a objetos. 3.1. Los métodos estructurados Los métodos estructurados provienen de la programación estructurada y se utilizan técnicas no muy integradas entre sí. Los métodos estructurados tienen, asimismo, estas características: • La especificación de los procesos y la de las estructuras de datos generalmen- te quedan bastante diferenciadas, y hay métodos que ponen más énfasis en aquéllos o en éstos. • Muchas de sus técnicas obien pasan de lo general a lo particular (técnicas top- down) o bien a la inversa (técnicas bottom-up). Técnicas más utilizadas para los métodos estructurados Las técnicas más usadas en los métodos estructurados son seguramente los diagramas de entidad-relación y de flujo de datos, con sus variantes. Los primeros se refieren a los datos y los segundos, a los procesos. 3.2. Los métodos orientados a objetos Si bien los métodos estructurados continúan siendo muy utilizados, los de- nominados métodos orientados a objetos ganan terreno rápidamente. Si los métodos estructurados de desarrollo de software tienen su origen en la pro- gramación estructurada, los métodos orientados a objetos tienen sus raíces en la programación orientada a objetos. Es lógico que haya sucedido así en los dos casos: una nueva técnica de pro- gramar exige una nueva manera de diseñar los programas adaptada a las carac- © Editorial UOC 29 Capítulo I. Introducción a la... terísticas de la programación, y un nuevo método de diseño hace deseable un nuevo método de análisis de requisitos que tenga la misma orientación que el diseño, con la finalidad de evitar que el paso del análisis de requisitos al diseño implique un cambio de modelo que inevitablemente comportaría un trabajo adicional y un mayor riesgo de errores. De la misma manera que la programación orientada a objetos gira en torno al concepto de clase, también lo hacen el análisis de requisitos y el diseño. Por esta razón, el diagrama básico de estos métodos, el diagrama de clases y objetos, se utiliza tanto en el análisis como en el diseño; además, muchas de las clases descritas en el análisis de requisitos se implementan en los programas pasando por el diseño, lo cual hace que el paso del análisis de requisitos al diseño sea más suave que en los métodos estructurados y también más sencillo y rápido. Puesto que dentro de una clase hay a la vez atributos y operaciones, es decir, datos y procesos, en el desarrollo orientado a objetos a medida que se definen e implementan clases se avanza al mismo tiempo en estas dos dimensiones. El de- sarrollo no procede ni de manera top-down ni bottom-up, sino que, más bien, se construyen grupos de clases interrelacionadas, a menudo por niveles: clases que gestionan la presentación de la información, o bien las entradas por pantalla, o bien las lecturas y grabaciones de la base de datos, o bien los algoritmos princi- pales del software; o bien proceden según un ciclo de vida incremental, tal como hemos visto. Cabe añadir que el desarrollo orientado a objetos, además de introducir téc- nicas nuevas, también aprovecha algunas técnicas y conceptos del desarrollo es- tructurado, como el diagrama de estados y transiciones, según veremos. Hay dos características del desarrollo orientado a objetos que probablemente han favorecido de manera decisiva su expansión hasta ahora y también con toda probabilidad la continuarán favoreciendo: • Parece que permite –por primera vez en la historia de la tecnología del soft- ware– la reutilización de software en un grado significativo, en forma de cla- ses implementadas, lo cual podría significar una vía para solucionar, aunque sólo sea en parte, los problemas de productividad y calidad descritos en apar- tados anteriores. • Su relativa simplicidad facilita el desarrollo de herramientas informáticas de ayuda al desarrollo; este factor podría ser potenciado por el hecho de que en © Editorial UOC 30 Ingeniería del software estos últimos años ha aparecido una notación orientada a objetos muy am- pliamente aceptada, el UML. 3.3. Los métodos formales Los denominados métodos formales parten de una especificación de las nece- sidades de información en términos de un modelo matemático riguroso, del cual se podría deducir el programa que les satisfaga. También permitían demostrar ma- temáticamente que un programa es correcto en el sentido de que se ajusta a aque- llas necesidades. Aunque tendrían que permitir eliminar las ambigüedades y carencias de los métodos no tan rigurosos, su utilización directa en el desarrollo de software para usos reales es poco frecuente en la actualidad, sin duda debido a la gran com- plejidad que tendría un modelado tan detallado y formalizado en casos reales. Algunos de los lenguajes de especificación formal más conocidos son Z, VDM, CSP y LARCH. 4. Las herramientas CASE CASE significa Computer-Aided Software Engineering. Las herramientas CASE son software de apoyo al desarrollo, mantenimiento y documentación informatizados de software. De esta definición generalmente se excluyen las herramientas que tienen una de las funciones siguientes: 1) o bien no tienen sólo esta finalidad (herramientas de tratamiento de tex- to, de hoja de cálculo, de dibujo en general, de planificación de proyectos de cualquier ingeniería), ya que propiamente pertenecen a otros ámbitos; 2) o bien se utilizan para codificar el software (compiladores, entornos de cuarta generación, editores ordinarios de programas, etc.), ya que siempre están presentes, incluso cuando el desarrollo de software se hace de la manera más ma- nual posible. © Editorial UOC 31 Capítulo I. Introducción a la... Quedan, pues, principalmente las herramientas que ayudan a aplicar técnicas concretas de desarrollo y mantenimiento de software y por eso gestionan informa- ción sobre los elementos y conceptos que se utilizan en los métodos de desarrollo, como las siguientes: • Las herramientas diagramáticas, las cuales, a diferencia de las de dibujo, re- conocen que un determinado símbolo es una clase y no simplemente un rec- tángulo. Estas herramientas también acostumbran a aceptar documentación textual sobre aquellos elementos. • Las herramientas de gestión de la prueba y de gestión de la calidad en general. • Las herramientas de gestión de cambios, etc. Herramientas UpperCASE y LowerCASE A veces se distingue entre herramientas UpperCASE, que son las de análisis y diseño, y LowerCASE, que se usan durante la programación y la prueba. La importancia de la integración de las herramientas Es conveniente que las herramientas que dan apoyo a diferentes técnicas utilizadas dentro del mismo método estén integradas, en el sentido de que si hay un tipo de ele- mento que es común a dos técnicas, sea compartido por las dos herramientas respec- tivas, de manera que sólo sea necesario describirlo una vez y que todos los cambios que se realicen después en esta descripción lleguen a las dos. La expansión del uso de herramientas CASE en el método estructurado se fre- nó a causa de la diversidad y de la falta de estandarización de las técnicas que se utilizan; en los métodos orientados a objetos, en cambio, actualmente la situa- ción es la contraria: por un lado, algunos diagramas sirven tanto para el análisis como para el diseño, y por el otro, se ha producido una estandarización de las técnicas y notaciones en el modelo conocido como UML que ha hecho que en el poco tiempo transcurrido desde su publicación haya aparecido un número importante de conjuntos integrados de herramientas CASE basadas en él. Este soporte informatizado, amplio y creciente, en el desarrollo de software orientado a objetos sin duda reforzará la mejora de la calidad y la productividad en el de- © Editorial UOC 32 Ingeniería del software sarrollo de software que, tal como hemos visto, la tecnología orientada a objetos tiene que fomentar. 5. El OMG y el UML Para el desarrollo orientado a objetos utilizaremos el modelo denominado UML, del cual actualmente es responsable la organización llamada OMG. 5.1. El Object Management Group (OMG) El Object Management Group (OMG), creado en 1989, es una organización no lucrativa en la cual participan más de ochocientas grandes empresas de software, de hardware, usuarias y consultoras, y tiene la finalidad de fomentar el uso de la tecnología de objetos e impulsar la introducción de software orientado a objetos que ofrezca reusabilidad,portabilidad e interoperabilidad en entornos distribui- dos heterogéneos. El medio con que el OMG intenta conseguir sus objetivos es la elaboración de estándares, para los cuales acepta propuestas. En cambio, no produce software ni elabora especificaciones de implementación o funcionalidad. El otro estándar del OMG Además del UML, otro estándar que ha elaborado el OMG es CORBA, sobre objetos dis- tribuidos, cuyas implementaciones tienen una expansión rápida. 5.2. Unified Modeling Language (UML) El Unified Modeling Language (UML) es un modelo para la construcción de software orientado a objetos que ha sido propuesto como estándar de ISO por el © Editorial UOC 33 Capítulo I. Introducción a la... OMG. Consta de un conjunto de tipos de diagramas interrelacionados, dentro de los cuales se utilizan elementos del modelo, que sirven parar describir distin- tos aspectos de la estructura y la dinámica del software. UML es el resultado de una cierta unificación de los modelos utilizados en tres métodos preexistentes de desarrollo de software orientado a objetos hechos por sus autores en colaboración. Estos métodos son los siguientes: • el método de Grady Booch; • el OMT, de Jim Rumbaugh y otros; • el OOSE, de Ivar Jacobson. Además, se encuentran conceptos aportados por muchos otros autores, en- tre ellos Peter Coad, Edward Yourdon, James Odell y Bertrand Meyer. Evolución del modelo UML Los primeros pasos hacia el modelo unificado se dieron en el año 1994, cuando Booch y Rumbaugh, trabajando en Rational Software Corporation, comenzaron la unificación de los modelos respectivos, y en octubre de 1995 se publicó la versión provisional 0.8 del entonces denominado Unified Method. El mismo año, Jacobson se incorporó con su empresa al equipo mencionado y a Ra- tional y, como resultado del trabajo de los tres autores, en 1996 salieron las versiones 0.9 y 0.91 del UML. El OMG emitió en aquella época una Request For Proposal, para un modelo de este tipo, y entonces Rational, para responderle, constituyó un consor- cio con otras organizaciones, con el resultado de que en enero de 1997 se presentó en la OMG la versión 1.0 del UML. Otras empresas que habían presentado también respuestas de manera independiente se añadieron al consorcio y se publicó la versión 1.1, que fue aceptada por el OMG en noviembre de 1997 (hubo otra propuesta, la del modelo OML, que tenía y todavía tie- ne un número importante de partidarios). El OMG encargó una revisión, cuyo resul- tado fue una versión 1.2, no publicada, y la versión 1.3, ya publicada como estándar. La versión 1.4 se publicó oficialmente en septiembre de 2001. Con el UML se ha llegado a un modelo orientado a objetos único como mo- delo oficial, pero eso no quiere decir que se haya alcanzado un método único de desarrollo orientado a objetos; la verdad es que por el momento parece que falta bastante para llegar al mismo, si es que alguna vez se consigue. Es decir,que © Editorial UOC 34 Ingeniería del software lo que se ha conseguido es que haya unos diagramas que todos los desarrollado- res de software orientado a objetos entenderán y harán de la misma manera, lo cual supone un adelanto realmente importante con respecto a la situación an- terior en la que cada método tenía su notación gráfica; pero, incluso así, conti- núa siendo posible que existan métodos diferentes que utilicen el UML y que, por ejemplo, se valgan de los mismos diagramas en orden diferente o dentro de modelos de ciclo de vida distintos. © Editorial UOC 35 Capítulo I. Introducción a la... Conclusiones Se ha concretado qué se entiende por software en esta obra, se ha indicado por qué se puede considerar un producto industrial y, como consecuencia, por qué tiene sentido hablar de una ingeniería del software, y también hemos entrado en contacto con los dos grandes problemas que han afectado tradicionalmente al desarrollo de software: las carencias referidas a la productividad y calidad. Si entramos dentro del proceso de elaboración del software, hemos visto el concepto de ciclo de vida y sus dos grandes modelos –el ciclo de vida en cascada o clásico y los ciclos de vida iterativos e incrementales–, más dos modalidades in- termedias –el desarrollo con prototipos y la programación exploratoria. Como ciclos concretos, hemos indicado de una manera más o menos detallada el ciclo de vida del Rational Unified Process, como representante de las tendencias ac- tuales en lo que se refiere a ciclos iterativos e incrementales, y el ciclo de vida clá- sico, cuyo interés radica, además de en su importancia histórica, en el hecho de que algunos de sus conceptos continúan siendo válidos todavía. A continuación, se han presentado las tres grandes familias de métodos de desarrollo de software: las dos más utilizadas en entornos reales, que son los mé- todos estructurados –más tradicionales– y los métodos orientados a objetos –en plena expansión–, sin menospreciar los métodos formales, interesantes por su gran rigor teórico. Después de hablar de técnicas, es lógico referirse a las herramientas que éstas emplean; por eso hemos visto el concepto de herramientas CASE y nos hemos informado de su situación actual y de la evolución previsible de su papel. Puesto que para estudiar el análisis y diseño orientados a objetos –tema esen- cial de esta obra– utilizaremos los conceptos y la notación del UML, se ha expues- to el origen de este modelo y el cometido de la organización que se responsabiliza del mismo, la OMG. © Editorial UOC 37 Capítulo II. UML (I): el modelo estático Capítulo II UML (I): el modelo estático Como sabemos, para el análisis y el diseño orientados a objetos utilizaremos los conceptos y las notaciones –esencialmente gráficas– del UML. El UML comprende un cierto número de diagramas interrelacionados me- diante conceptos comunes. Sólo para describirlos, los consideraremos agrupa- dos en tres modelos: En este capítulo veremos el modelo estático, que consta, por una parte, de clases y objetos, y por la otra, de relaciones de diferentes tipos entre clases y entre objetos. En capítulos posteriores trataremos el resto de los modelos y la utilización del UML en el análisis y en el diseño. 1. Concepto de modelo estático y diagrama de clases El modelo estático del UML es aquél en el que se describen las clases y los objetos. Se denomina estático porque muestra todas las relaciones posibles a lo largo del tiempo, no las que son válidas en un cierto momento. Estático describe la estructura de clases y objetos. Dinámico (o modelo de comportamiento), describe las interacciones entre los objetos dentro del software. Implementación describe la estructura del software en cuanto a los componentes de que consta y su ubicación. © Editorial UOC 38 Ingeniería del software Ejemplo de modelo estático Un diagrama estático nos puede mostrar que cada profesor tiene, al menos, una asigna- tura, y que cada asignatura tiene, al menos, un profesor, pero no nos dice qué asig- naturas tiene un profesor concreto. Este modelo consta de los dos diagramas siguientes: • Diagrama de clases, que puede contener clases y objetos y relaciones entre és- tos, y que se hace siempre. • Diagrama de objetos, que sólo contiene objetos y relaciones entre éstos, y que es opcional, ya que se utiliza principalmente para realizar ejemplos del diagra- ma de clases con objetos concretos de las mismas. Un diagrama de clases muestra la estructura estática de las clases en un do- minio (porción del mundo real considerada por una aplicación); se muestran las clases y las relaciones entre éstas, que pueden ser de herencia, asociación, agre- gación o uso. Uso del modelo estático El modelo estático se utiliza en todas las etapas del ciclo de vida; en las diferentes etapas se documentan diferentes tipos de objetos. En el análisis se consideran objetos del mun- do del usuario (por ejemplo, artículos, facturas, clientes, etc.) y en el diseño, en cambio, se consideran objetosde la tecnología informática: pantallas, gestores de disco, etc. El modelo estático pretende ser independiente del lenguaje de programa- ción, pero, sin embargo, si se sabe cuál será, es conveniente no utilizarlo en el análisis de conceptos que sabemos que dicho lenguaje no soporta, si que- remos ahorrarnos muchos cambios cuando lleguemos al diseño. También se deberá tener en cuenta que, cuando el UML permite describir elementos in- compatibles con un lenguaje determinado, raramente la herramienta CASE nos lo impedirá; por lo tanto, será responsabilidad del diseñador del software evitar caer en la utilización de conceptos no soportados por el lenguaje de programación. © Editorial UOC 39 Capítulo II. UML (I): el modelo estático Relaciones en los lenguajes de programación Los lenguajes de programación soportan las relaciones de herencia, pero no distin- guen entre los otros tres tipos de relaciones que existen; por tanto, al pasar del diseño a la programación, estos tipos se tendrán que transformar. También puede suceder lo contrario; es decir, que se quieran modelar ele- mentos que la herramienta CASE no soporta, porque UML no los prevé, o por otros motivos; entonces se tendrán que documentar estos aspectos mediante comentarios libres, que permiten todas las herramientas. Algunas herramientas permiten que el usuario defina extensiones, pero si una empresa utiliza esta po- sibilidad, los diagramas generados no serán transportables a otras empresas. 2. Clasificadores El clasificador es la entidad básica del modelo estático. Un clasificador es más general que una clase; es un conjunto cuyos elementos se denominan ins- tancias. El clasificador en sí mismo no tiene símbolo gráfico, sino que lo tienen sus estereotipos: • Clase: El concepto de clase es el que ya conocemos de la programación orien- tada a objetos, y sus instancias son los objetos, que tienen identidad, en el sentido de que incluso dos objetos que coinciden en el valor de todos sus atri- butos son objetos diferentes si se han creado como tales. • Tipo de dato: Por tipo de dato entendemos un tipo base ofrecido por algún lenguaje de programación o construido por el programador; tiene operacio- nes asociadas igual que las clases, pero sus instancias, a diferencia de los ob- jetos, no tienen identidad. • Interfaz: Una interfaz sólo describe las operaciones de una clase que son visi- bles desde otras clases; se dice que dicha clase implementa la interfaz corres- pondiente. © Editorial UOC 40 Ingeniería del software Estereotipo Un estereotipo de un elemento del UML es una variante más restrictiva de dicho ele- mento; hay estereotipos que forman parte del UML, y también se pueden encontrar estereotipos definidos referidos al diagrama, que son un instrumento para extender el UML, pero así se pierde portabilidad. La utilidad del concepto de clasificador radica en el hecho de que los estereo- tipos mencionados tienen mucho en común, por lo que es suficiente con reali- zar la indicación una vez en el clasificador. La notación gráfica simplificada es la misma para los tres: un rectángulo. Todos los clasificadores deben tener un nombre. En un clasificador se puede indicar la palabra clave del estereotipo (entre comillas latinas, «»). Cuando no se indique ningún estereotipo, se tratará de una clase. 3. Paquetes Un paquete o package es sólo una “caja” que contiene elementos, como cla- sificadores, objetos u otros paquetes, así como otras entidades que veremos más adelante, como los casos de uso. Paquetes en JAVA Por la definición que ofrecemos de paquete, podemos ver que el concepto de paquete en el UML es diferente –y más amplio– que en Java. © Editorial UOC 41 Capítulo II. UML (I): el modelo estático Gráficamente, un paquete se representa así: Todas las aplicaciones deben tener, por lo menos, un paquete que normal- mente se denomina raíz. Cada elemento de un paquete tiene visibilidad, es decir, puede ser reconocido o bien desde todos los otros paquetes, o bien sólo desde al- gunos. Ejemplo de paquetes Éstas son dos maneras de representar el mismo paquete: En la primera, se pueden incluir dentro del símbolo del paquete los símbolos de los elementos que contiene; la segunda, simplificada, es más adecuada para representar referencias al paquete (desde otros paquetes, por ejemplo). Se pueden establecer los siguientes tipos de relaciones entre paquetes: • De especialización. Si un paquete A hereda de otro B todos los elementos de B, son casos más restrictivos de elementos de A. • De inclusión. Si el paquete A incluye el B, todos los elementos de B están también en A. © Editorial UOC 42 Ingeniería del software • De importación. Desde el paquete que importa se reconocen los nombres de los elementos del otro paquete visibles desde el exterior. Ejemplo Por ejemplo, públicos en el sentido de Java. • De acceso. No sólo se reconocen los nombres de los elementos, sino que, ade- más, se pueden utilizar. Ejemplo de relaciones entre paquetes En la representación gráfica, el paquete Diagramas que vemos a continuación importa del paquete Figuras, y el paquete Diagramas de UML hereda del paquete Diagramas; una relación de acceso se representaría con la palabra clave access. © Editorial UOC 43 Capítulo II. UML (I): el modelo estático 4. Clase y conceptos afines Sobre la programación orientada a objetos sabemos que una clase describe un conjunto de objetos en el cual todos tienen los mismos atributos y las mis- mas operaciones. Los atributos y operaciones pueden ser de instancia, es decir, vinculados a objetos individuales, y de clase, que no están relacionados con ningún objeto en particular de la clase. Este mismo es el concepto de clase en el UML. En principio, cada clase es visible (es decir, reconocida) dentro del paquete donde se ha declarado, y su nombre no puede estar repetido en éste, pero desde un paquete se reconocen los nombres de clases –y elementos en general– de otro paquete del que se importa, en el sentido indicado con anterioridad; el nombre de la clase tiene que estar calificado por el del paquete, así Paquete : Clase. 4.1. Representación ampliada de las clases Puesto que una clase es un clasificador, se puede utilizar como símbolo de la clase un simple rectángulo con el nombre. Sin embargo, dado que una clase con- siste en un encapsulado de unos atributos y unas operaciones, también se da una representación gráfica más detallada por medio de un rectángulo dividido en los tres compartimentos siguientes: • El primer compartimento contiene el nombre de la clase. • El segundo compartimento contiene la lista de los atributos. • El tercer compartimento corresponde a los servicios de la clase. Se ha de tener en cuenta que como sinónimos de operación se utilizan a menudo mé- todo y servicio; pero en UML, el término servicio no se usa, y por método se entiende la implementación de una operación. El usuario puede crear otros compartimentos, además de los tres obligatorios, para dar información adicional como excepciones, requisitos, etc. © Editorial UOC 44 Ingeniería del software 4.1.1. El compartimento del nombre En la parte superior del compartimento de la clase se puede indicar un este- reotipo. Algunos estereotipos forman parte del UML –como metaclass, del que se ha- blará más adelante–, y se pueden definir mediante un proyecto concreto, por ejemplo. Justo debajo se encuentra el nombre de la clase. Se recomienda que sea un sustantivo en singular que a veces puede tener una segunda palabra que la cali- fique. También es recomendable que comience por mayúscula. Debajo del nombre se pueden encontrar comentarios optativos entre llaves ({}) denominados cadenas de caracteres de propiedades (property strings) o valores etiquetados (tagged values)*; los puntos suspensivos que se pueden hallar al final de uno de los apartados indican que hay más elementos, pero que no se ven. La property string “abstract” denota una clase abstracta. Elnombre de clases Los nombres de las clases tienen que estar bien pensados. La posibilidad de reuti- lización depende en gran medida de ello, porque cuando queramos reutilizar una clase de una librería que tenga centenares de nombres, la única pista que tendre- mos es el nombre, y si no se le dio un nombre adecuado, será muy difícil de en- contrar. Un atributo de clase es lo mismo que un atributo static de Java y una variable de clase de Smalltalk y C++. Ejemplo de clase sólo con el compartimento del nombre En la figura siguiente, el estereotipo análisis podría indicar que la clase Rectangulo se ha identificado en la etapa de análisis. *. Formato de los comentarios Property strings y tagged values tienen la forma nombre = valor; en el caso de propiedades booleanas, el nombre solo ya indica la presencia de la propiedad. © Editorial UOC 45 Capítulo II. UML (I): el modelo estático 4.1.2. Especificación de los atributos Cada atributo tiene un nombre o identificador y un tipo. Este último puede ser un tipo simple del lenguaje de programación (por lo menos, durante el di- seño y la programación, porque durante el análisis puede ser que las clases se describan sin pensar en ningún lenguaje de programación en concreto) como entero o carácter, o bien un tipo complejo, como una lista de enteros, o tam- bién una clase ya definida. Un atributo, sea de instancia o de clase, se define de la siguiente forma: visibilidad nombre ‘:’ expresión-de-tipo ?=’ valor-inicial ‘{’ property string ‘}’ Se indica que un atributo es atributo de clase* subrayando su definición. La visibilidad de un atributo** indica hasta qué punto las operaciones de otras clases pueden acceder al atributo, y se indica mediante los siguientes sím- bolos. • Público: “+” • Protegido: “#” • Privado: “-” • Dentro del paquete: “ ” También tienen visibilidad otros elementos del modelo estático, como las operaciones y los extremos de asociación. *. Atributo de clase. Un atributo de clase es lo mismo que un atributo static de Java y una variable de clase de Smalltalk y C++. **. La visibilidad. En el UML no hay definiciones del significado de estas opciones de visibilidad, sino que se dejan para los lenguajes de programación; si algún lenguaje incluye más tipos de visibi- lidad, también se podrán indicar aquí. © Editorial UOC 46 Ingeniería del software En el lugar de los atributos, se pueden utilizar property strings, que son, respec- tivamente, public, protected o private. Las property strings son opcionales; además de las mencionadas, podemos encontrar frozen, que indica que no se puede cam- biar el valor del atributo. En lo referente al nombre de los atributos, se deben tener en cuenta las siguien- tes pautas: • Se recomienda que comience por minúscula. • Cuando se trate de un atributo derivado (es decir, que es redundante con otros a partir de los cuales se puede obtener el valor), el nombre tiene que ir precedido de “/”. • Es conveniente que el nombre cumpla las reglas léxicas del lenguaje de pro- gramación, si no queremos que se tenga que cambiar al llegar al diseño. La expresión de tipo y el valor inicial también las deberán respetar. Se pueden utilizar indicadores de multiplicidad como en el caso de los vectores o matrices de acuerdo con el lenguaje. Uso de los indicadores de multiplicidad Consideremos: hijos [0..3]: persona o bien, hijos [3]: persona; en el primer caso podría haber entre 0 y 3 hijos, pero en el segundo tiene que haber exactamente tres. Ejemplo de clase con compartimento de nombre y compartimento de atributos Como se puede ver en la figura siguiente: © Editorial UOC 47 Capítulo II. UML (I): el modelo estático extremos serían las coordenadas de dos vértices opuestos del rectángulo, que lo determi- nan; Punto sería una clase descrita en el mismo paquete; gruesoLínea tiene el valor 1 por omisión, y área es un atributo derivado, ya que su valor se puede calcular a partir de las coordenadas de los puntos de extremos. 4.1.3. Especificación de las operaciones Una operación se define de la siguiente forma: visibilidad nombre ‘(’ lista-de-parámetros ‘):’ tipo-de-retorno ‘{’property string‘}’ Se indica que una operación es operación de clase subrayando su definición. La visibilidad se señala igual que en el caso de los atributos. Conviene que el nombre de la operación y de los parámetros y el tipo de los parámetros y del retorno cumplan las reglas del lenguaje de programación. En la programación conviene que los nombres de las operaciones estén bien pensa- dos, porque son la base del polimorfismo, en el que se aplica que “a igual concepto, igual nombre”. Se recomienda que los nombres de las operaciones comiencen por minúscula. La lista de parámetros se compone de parámetros separados por comas; la sin- taxis de cada uno es la siguiente: tipo nombre ‘:’ expresión-de-tipo ‘=’ valor-por-omisión Donde tipo es in, out o inout (por omisión, in), y nombre es el nombre del pa- rámetro formal; expresión-de-tipo depende del lenguaje; valor-por-omisión depen- de del lenguaje y es opcional. El tipo-de-retorno sólo se tiene que utilizar cuando la operación devuelva un valor como resultado, y también se puede usar un parámetro out en su lugar. Opcionalmente, puede aparecer property strings: query, que denota que la ope- ración no modifica el estado del sistema, y para especificar la semántica de concu- rrencia se pueden utilizar una de éstas: sequential, guarded o concurrent, y abstract, que indica que la operación es abstracta. Se pueden utilizar estereotipos poniéndolos encima de la operación afectada. © Editorial UOC 48 Ingeniería del software Ejemplo de clase con los tres compartimentos Tal y como se puede apreciar en el gráfico siguiente, la operación nuevoRectangulo es del estereotipo (no incluido dentro del UML) constructor y tiene dos parámetros in (por omisión); la operación calculoArea no tiene parámetros pero retorna un valor, cuyo tipo se indica. 4.2. La herencia en el análisis y el diseño Sabemos que la herencia presupone que existan dos clases, de las cuales una desempeña el papel de superclase y la otra, el de subclase. Se dice que la relación entre una subclase y su superclase es una relación is_a_kind_of. La subclase comprende un subconjunto de los objetos de la superclase, los cuales, por tanto, tienen todos los atributos y operaciones de instancia de la su- perclase (se dice que la subclase los hereda) y, además, pueden tener algunos adi- cionales, específicos de la subclase. Según se defina primero la superclase o sus subclases, tenemos respectiva- mente dos tipos de herencia: herencia por especialización y herencia por gene- ralización. © Editorial UOC 49 Capítulo II. UML (I): el modelo estático 4.2.1. Herencia por especialización Se llama de esta manera porque lo que se hace es crear una clase más especia- lizada, más restrictiva, a partir de una clase definida con anterioridad. Ejemplo de especialización Consideramos que en la gestión de un hotel identificamos la clase Habitación y des- pués nos damos cuenta de que hay una categoría especial de habitaciones que tiene atributos y/o operaciones diferentes, que son las suites; esto se representa de la si- guiente forma: La flecha con punta triangular vacía y cuerpo continuo expresa una relación entre subclase y superclase, y su sentido indica cuál es cada una. También se ha- bla de que hemos creado una jerarquía de herencia, muy sencilla en algunos ca- sos (como por ejemplo el caso de especificación) pero que llega a ser un árbol de diferentes niveles si hay superclases que presenten distintas subclases y subcla- ses que sean a la vez superclases de otras. Incluso la jerarquía se convierte en una red si algunas clases tienen más de una superclase (herencia múltiple). El proceso mediante el cual reconocemos una subclase dentro de otra clase –que, consecuentemente, pasa a ser superclase de la primera– se denomina especializa- ción o derivación. © Editorial UOC 50
Compartir