UML. Arquitectura de aplicaciones en Java, C++ y Python. 2ª Edición
()
Información de este libro electrónico
un alto nivel de conocimientos con los que crear diagramas estáticos y dinámicos en UML, lo que facilitará la construcción de aplicaciones de una forma metódica, organizada y segura.
En ella hallará una explicación completa y didáctica de la sintaxis y se
Relacionado con UML. Arquitectura de aplicaciones en Java, C++ y Python. 2ª Edición
Libros electrónicos relacionados
UML. Aplicaciones en Java y C++ Calificación: 4 de 5 estrellas4/5Programación Java: JDBC y Swing Calificación: 0 de 5 estrellas0 calificacionesSeguridad en aplicaciones Web Java: SEGURIDAD INFORMÁTICA Calificación: 5 de 5 estrellas5/5Programación Orientada a Objetos en JAVA Calificación: 0 de 5 estrellas0 calificacionesDesarrollo de aplicaciones mediante framework de spring: UNa panorámica del framework para J2EE más utilizado del momento Calificación: 0 de 5 estrellas0 calificacionesPython 3. Curso Práctico: Ventas y marketing Calificación: 4 de 5 estrellas4/5Algoritmos Genéticos con Python: Un enfoque práctico para resolver problemas de ingeniería Calificación: 5 de 5 estrellas5/5Aplicaciones gráficas con Python 3 Calificación: 4 de 5 estrellas4/5Desarrollo web en entorno servidor (GRADO SUPERIOR): Gráficos y diseño web Calificación: 5 de 5 estrellas5/5Criptografía sin secretos con Python: Spyware/Programa espía Calificación: 5 de 5 estrellas5/5AJAX en J2EE. 2ª Edición actualizada Calificación: 0 de 5 estrellas0 calificacionesDesarrollo de aplicaciones para Android Calificación: 5 de 5 estrellas5/5Diseño de algoritmos y su programación en C Calificación: 0 de 5 estrellas0 calificacionesProgramación Web en el Entorno Servidor. (MF0492_3) Calificación: 0 de 5 estrellas0 calificacionesHTML5, CSS3 y JQuery: Gráficos y diseño web Calificación: 5 de 5 estrellas5/5Criptografía: Técnicas de desarrollo para profesionales Calificación: 0 de 5 estrellas0 calificacionesSoftware ofimático de productividad en la nube Calificación: 0 de 5 estrellas0 calificacionesJava a fondo - estudio del lenguaje y desarrollo de aplicaciones - 2a ed. Calificación: 5 de 5 estrellas5/5Estructuras de datos: Fundamentación práctica Calificación: 5 de 5 estrellas5/5Desarrollo de Software: Requisitos, Estimaciones y Análisis Calificación: 0 de 5 estrellas0 calificacionesAprende a Modelar Aplicaciones con UML - Tercera Edición Calificación: 2 de 5 estrellas2/5Programación Orientada a Objetos Calificación: 3 de 5 estrellas3/5Desarrollo Global de Software Calificación: 0 de 5 estrellas0 calificacionesAprende sobre la Ingeniería de Software Calificación: 0 de 5 estrellas0 calificacionesAngularJS: Conviértete en el profesional que las compañías de software necesitan. Calificación: 4 de 5 estrellas4/5Aprende a Modelar Aplicaciones con UML Calificación: 1 de 5 estrellas1/5Desarrollo de aplicaciones mediante el Framework de spring.: PROGRAMACIÓN INFORMÁTICA/DESARROLLO DE SOFTWARE Calificación: 2 de 5 estrellas2/5El Libro Práctico Del Programador Ágil Calificación: 5 de 5 estrellas5/5Desarrollo de Interfaces.: Gráficos y diseño web Calificación: 4 de 5 estrellas4/5Microsoft C#. Curso de Programación. 2ª Edición Calificación: 4 de 5 estrellas4/5
Programación para usted
Python Aplicaciones prácticas Calificación: 4 de 5 estrellas4/5VBA Excel Guía Esencial Calificación: 5 de 5 estrellas5/5Excel de la A a la Z: El Manual Práctico Paso a Paso de Microsoft Excel para Aprender Funciones Básicas y Avanzadas, Fórmulas y Gráficos con Ejemplos Fáciles y Claros Calificación: 0 de 5 estrellas0 calificacionesPython Paso a paso: PROGRAMACIÓN INFORMÁTICA/DESARROLLO DE SOFTWARE Calificación: 4 de 5 estrellas4/5Arduino. Trucos y secretos.: 120 ideas para resolver cualquier problema Calificación: 5 de 5 estrellas5/5Python para principiantes Calificación: 5 de 5 estrellas5/5GuíaBurros Microsoft Excel: Todo lo que necesitas saber sobre esta potente hoja de cálculo Calificación: 4 de 5 estrellas4/5El gran libro de Python Calificación: 5 de 5 estrellas5/5Curso de Programación y Análisis de Software Calificación: 4 de 5 estrellas4/5Python a fondo Calificación: 5 de 5 estrellas5/5Ortografía para todos: La tabla periódica de la ortografía Calificación: 5 de 5 estrellas5/5Linux Essentials: una guía para principiantes del sistema operativo Linux Calificación: 5 de 5 estrellas5/5Aprender PHP, MySQL y JavaScript Calificación: 5 de 5 estrellas5/5Arduino. Edición 2018 Curso práctico Calificación: 4 de 5 estrellas4/5El Libro Práctico Del Programador Ágil Calificación: 5 de 5 estrellas5/5Curso básico de Python: La guía para principiantes para una introducción en la programación con Python Calificación: 0 de 5 estrellas0 calificacionesAprende a programar en C# Calificación: 5 de 5 estrellas5/5Lógica de programación: Solucionario en pseudocódigo – Ejercicios resueltos Calificación: 4 de 5 estrellas4/5Aplicaciones web con Php Calificación: 5 de 5 estrellas5/5HTML para novatos Calificación: 5 de 5 estrellas5/5Programación Orientada a Objetos Calificación: 3 de 5 estrellas3/5Aprende a Programar en C++ Calificación: 5 de 5 estrellas5/5Diseño Web con CSS Calificación: 5 de 5 estrellas5/5Tablas dinámicas para todos. Desde simples tablas hasta Power-Pivot: Guía útil para crear tablas dinámicas en Excel Calificación: 0 de 5 estrellas0 calificacionesAprende a programar: Crea tu propio sitio web Calificación: 4 de 5 estrellas4/5Introducción al Uso de Formularios (UserForms) en VBA Calificación: 3 de 5 estrellas3/5Power Query para Excel 365/2021 Calificación: 0 de 5 estrellas0 calificacionesAprender a programar con Excel VBA con 100 ejercicios práctico Calificación: 5 de 5 estrellas5/5Fundamentos De Programación Calificación: 5 de 5 estrellas5/5
Comentarios para UML. Arquitectura de aplicaciones en Java, C++ y Python. 2ª Edición
0 clasificaciones0 comentarios
Vista previa del libro
UML. Arquitectura de aplicaciones en Java, C++ y Python. 2ª Edición - CARLOS JIMÉNEZ DE PARGA
UML
Arquitectura de aplicaciones
en Java, C++ y Python
2ª edición
Dr. Carlos Jiménez de Parga
Ingeniero Informático / Ingeniero de Software
Revisión Técnica:
Dr. Manuel Arias Calleja
La ley prohíbe
fotocopiar este libro
UML. Arquitectura de aplicaciones en Java, C++ y Python. 2ª Edición
© Carlos Jiménez de Parga
© De la edición: Ra-Ma 2021
MARCAS COMERCIALES. Las designaciones utilizadas por las empresas para distinguir sus productos (hardware, software, sistemas operativos, etc.) suelen ser marcas registradas. RA-MA ha intentado a lo largo de este libro distinguir las marcas comerciales de los términos descriptivos, siguiendo el estilo que utiliza el fabricante, sin intención de infringir la marca y solo en beneficio del propietario de la misma. Los datos de los ejemplos y pantallas son ficticios a no ser que se especifique lo contrario.
RA-MA es marca comercial registrada.
Se ha puesto el máximo empeño en ofrecer al lector una información completa y precisa. Sin embargo, RA-MA Editorial no asume ninguna responsabilidad derivada de su uso ni tampoco de cualquier violación de patentes ni otros derechos de terceras partes que pudieran ocurrir. Esta publicación tiene por objeto proporcionar unos conocimientos precisos y acreditados sobre el tema tratado. Su venta no supone para el editor ninguna forma de asistencia legal, administrativa o de ningún otro tipo. En caso de precisarse asesoría legal u otra forma de ayuda experta, deben buscarse los servicios de un profesional competente.
Reservados todos los derechos de publicación en cualquier idioma.
Según lo dispuesto en el Código Penal vigente, ninguna parte de este libro puede ser reproducida, grabada en sistema de almacenamiento o transmitida en forma alguna ni por cualquier procedimiento, ya sea electrónico, mecánico, reprográfico, magnético o cualquier otro sin autorización previa y por escrito de RA-MA; su contenido está protegido por la ley vigente, que establece penas de prisión y/o multas a quienes, intencionadamente, reprodujeren o plagiaren, en todo o en parte, una obra literaria, artística o científica.
Editado por:
RA-MA Editorial
Calle Jarama, 3A, Polígono Industrial Igarsa
28860 PARACUELLOS DE JARAMA, Madrid
Teléfono: 91 658 42 80
Fax: 91 662 81 39
Correo electrónico: editorial@ra-ma.com
Internet: www.ra-ma.es y www.ra-ma.com
ISBN: 978-84-9964-977-1
Depósito legal: M-17905-2020
Maquetación: Antonio García Tomé
Diseño de portada: Antonio García Tomé
Imagen de portada: Antonio Jiménez de Parga
Filmación e impresión: Safekat
Impreso en España en marzo de 2021
A mis padres,a los que estaré eternamente agradecido por todo.
En memoria de mi tío Juanjo.
A usted, lector, y su familia.
Índice
prólogo 17
¿A QUIÉN VA DIRIGIDO ESTE LIBRO? 17
ESTRUCTURA DEL LIBRO 18
NOVEDADES EN LA SEGUNDA EDICIÓN 18
ESTILOS DE PROGRAMACIÓN 19
DIAGRAMAS Y PROGRAMAS DE EJEMPLO 19
FEEDBACK 20
AGRADECIMIENTOS ACADÉMICOS 20
UML en el contexto de la ingeniería del software 21
la necesidad de un modelo unificado 21
¿por qué modelar? 22
Modelos de proceso software 23
Modelo en cascada 24
Modelo incremental 25
Modelo en espiral 26
Relación de las fases con los diagramas UML 27
metodologías de desarrollo 30
Metodologías ágiles 30
Metodologías pesadas 35
calidad del software 36
Definición y conceptos 36
Dimensiones de la calidad 37
Crisis del software y necesidad de una medida (métricas) 38
Normalización y certificación 38
La norma ISO/IEC 9126 38
Aseguramiento de la calidad del software (SQA) 39
desarrollo de software seguro 41
Introducción 41
Análisis de software seguro 42
Análisis de riesgos 43
mda 44
Introducción 44
Características de MDA 45
diagramas de casos de uso 49
introducción 49
actores 50
CASOS DE USO 50
Especificación de los casos de uso 52
Flujo principal 53
Sentencia condicional si
53
Sentencia de control para
54
Sentencia de control mientras
55
uso de <
CASO de ESTUDIO: mercurial 60
CASO de ESTUDIO: servicio de cifrado remoto 64
diagramas de robustez 71
conceptos básicos 71
importancia de los diagramas de robustez 74
caso de estudio: ajedrez 75
Caso de uso Hacer jugada
75
Caso de uso Configurar parámetros
78
Caso de uso Validar usuario
79
caso de estudio: mercurial 79
Caso de uso Listar ficheros
79
Caso de uso Clonar repositorio
80
caso de estudio: servicio de cifrado remoto 80
Caso de uso Encriptar
80
Caso de uso Desencriptar
81
modelo del dominio 83
extracción de conceptos 83
identificar asociaciones 84
establecer los atributos 85
Herencia 86
agregación y composición 87
ejemplo de modelado: spindizzy
88
caso de estudio: ajedrez 92
caso de estudio: mercurial 94
caso de estudio: servicio de cifrado remoto 96
Cliente 96
Servidor 97
diagramas orientados a la arquitectura 99
taxonomía de estilos arquitectónicos 100
Tuberías y filtros 100
Por capas 101
Repositorios 102
Intérprete 102
Basadas en eventos 103
Distribuidas 103
Programa principal / subprograma 104
diagramas de componentes 104
Interfaces 105
Componentes 105
Puertos 107
Dependencias 108
Caso de estudio: Ajedrez 109
Caso de estudio: Mercurial 110
Caso de estudio: Servicio de cifrado remoto 111
diagramas de despliegue 112
Nodos 112
Artefactos 114
Caso de estudio: Ajedrez 114
Caso de estudio: Mercurial 114
Caso de estudio: Servicio de cifrado remoto 115
diagramas de paquetes 116
Paquetes 116
Generalización 118
Relaciones de dependencia 118
Caso de estudio: Ajedrez 119
Caso de estudio: Mercurial 120
Caso de estudio: Servicio de cifrado remoto 121
diagramas de clases 123
clases 123
asociaciones 128
Multiplicidad 131
Agregación y composición 132
herencia 133
Interfaces 135
dependencias 136
excepciones 137
clases parametrizables 138
ejemplo de modelado: spindizzy
139
caso de estudio: ajedrez 142
caso de estudio: mercurial 144
caso de estudio: servicio de cifrado remoto 146
Lado cliente 146
Lado servidor 148
diagramas de secuencias 151
conceptos preliminares 151
estructura básica 152
Línea de vida 153
Activación 154
Mensajes síncronos y asíncronos 154
Creación, destrucción e invocación recursiva 156
ejemplo de modelado: servidor ftp
157
Un solo cliente 157
Dos clientes 158
fragmentos combinados 159
Saltos condicionales 159
Iteraciones 161
Paralelismo 163
Parametrización 164
caso de estudio: ajedrez 165
Turno del jugador humano 165
Turno de la IA 167
caso de estudio: mercurial 169
caso de estudiO: servicio de cifrado remoto 171
diagramas de comunicación 173
estructura básica 174
saltos condicionales 176
iteraciones 177
caso de estudio: ajedrez 178
caso de estudio: mercurial 179
caso de estudio: servicio de cifrado remoto 180
patrones de diseño 181
¿por qué patrones? 182
tipos de patrones 183
patrones arquitectónicos 183
Sistemas genéricos 183
Sistemas distribuidos 185
Sistemas interactivos 187
patrones de diseño GoF 187
Descripción de un patrón de diseño 188
Patrones de creación 189
Patrones estructurales 195
Patrones de comportamiento 197
caso de estudio: ajedrez 206
Patrón Facade 206
Patrón Observer 207
Patrón Strategy 208
caso de estudio: mercurial 209
Patrón Facade e Interpreter 209
Patrón Composite 210
caso de estudio: servicio de cifrado remoto 211
Lado cliente 211
Lado servidor 212
buenas prácticas de programación 215
patrones de diseño grasp 215
¿Qué es una responsabilidad? 215
Experto en información 216
Creador 217
Bajo acoplamiento 218
Alta cohesión 219
Controlador 219
Polimorfismo 220
Fabricación Pura 221
Indirección 221
Variaciones Protegidas (VP) 222
caso de estudio: ajedrez 224
caso de estudio: mercurial 226
caso de estudio: servicio de cifrado remoto 228
Lado cliente 228
Lado servidor 230
diagramas de estado 233
conceptos básicos 234
estructura de un estado 235
estructura de las transiciones 235
tipos de nodos 236
Nodos inicial y final 236
Nodos de interconexión 237
Nodos condicionales 238
eventos 240
Eventos de llamada 240
Eventos de tiempo 241
estados compuestos 242
Estados compuestos simples 242
Estados compuestos ortogonales 243
sincronización de submáquinas 246
simplificación del diagrama de estados 247
historial 248
Historia superficial 248
Historia profunda 249
caso de estudio: ajedrez 251
caso de estudio: mercurial 253
caso de estudio: servicio de cifrado remoto 254
diagramas de actividad 255
estructura básica 255
estructuras de control 258
Nodos de decisión 258
Nodos de concurrencia y paralelismo 260
eventos de tiempo 261
nodos objeto 262
nodos de datos 262
particiones 263
parametrización 264
regiones 265
Regiones de expansión 265
Regiones interrumpibles 267
Regiones if
268
Regiones loop
269
Manejo de excepciones 270
conectores 271
señales y eventos 271
múltiples flujos 273
streaming 274
multicasting 274
caso de estudio: ajedrez 275
caso de estudio: mercurial 276
caso de estudio: servicio de cifrado remoto 278
Diagramas de estructura compuesta 281
estructura básica 282
Puertos 284
colaboraciones 286
uso de la colaboración 287
caso de estudio: ajedrez 288
Diagrama de estructura compuesta 288
Colaboración 289
Uso de la colaboración 290
caso de estudio: mercurial 290
Diagrama de estructura compuesta 290
Colaboración 291
Uso de la colaboración 291
caso de estudio: servicio de cifrado remoto (cliente) 292
Diagrama de estructura compuesta 292
Colaboración 292
Uso de la colaboración 293
caso de estudio: servicio de cifrado remoto (servidor) 294
Diagrama de estructura compuesta 294
Colaboración 295
Uso de la colaboración 295
OCL (Object constraint language) 297
estructura básica 297
tipos y operadores 298
modelo de referencia: academia
300
expresiones de restricción 301
Expresión inv: 301
Expresión pre 302
Expresión post 302
Operador @pre 302
expresiones de definición 303
Expresión body 303
Expresión init 304
Expresión def 304
Expresión let 305
Expresión derive 305
Colecciones 305
Nociones básicas 305
Operaciones básicas 306
navegación 317
ocl en los diagramas de estado 318
caso de estudio: ajedrez 319
caso de estudio: mercurial 320
caso de estudio: servicio de cifrado Remoto 321
ingeniería directa en java 323
diagramas de clases 324
Representación de una clase 324
Asociaciones 325
Herencia 326
Agregación 327
Composición 328
Clases abstractas 330
Clases internas 331
Clases asociación 332
Asociación calificada 336
diagramas de secuencias 337
Interacción básica 337
Creación, destrucción, automensajes y recursividad 338
Saltos condicionales 339
Iteraciones 341
diagramas de estado 343
caso de estudio: mercurial 349
ingeniería directa en c++ 359
diagramas de clases 360
Representación de una clase 360
Asociaciones 361
Herencia simple 363
Herencia múltiple 364
Agregación 364
Composición 365
Clases abstractas e interfaces 368
Clases internas o anidadas 371
Clases asociación 371
Asociación calificada 377
diagramas de secuencias 379
Interacción básica 379
Creación, destrucción, automensajes y recursividad 379
Saltos condicionales 382
Iteraciones 384
diagramas de estado 385
caso de estudio: ajedrez 394
ingeniería directa en python 411
diagramas de clases 412
Representación de una clase 412
Asociaciones 413
Herencia simple 414
Herencia múltiple 414
Implementación de interface 415
Agregación 415
Composición 416
Clases abstractas 418
Clases internas o anidadas 419
Clases asociación 419
Asociación calificada 422
diagramas de secuencias 423
Interacción básica 423
Creación, destrucción, automensajes y recursividad 423
Saltos condicionales 425
Iteraciones 426
diagramas de estado 428
caso de estudio: servicio de cifrado remoto 431
Lado cliente 432
Lado servidor 438
anexo a. programación orientada a objetos 445
A.1 breve reseña histórica 445
A.2 características de la poo 446
A.3 clases y objetos 447
A.4 programación orientada a objetos en c++ 447
A.4.1 Clases y objetos 447
A.4.2 Herencia 450
A.4.3 Polimorfismo 453
A.5 Programación orientada a objetos en java 459
A.5.1 Clases y objetos 459
A.5.2 Paquetes 461
A.5.3 Herencia 462
A.5.4 Interfaces 464
A.5.5 Polimorfismo 465
A.6 Programación orientada a objetos en python 469
A.6.1 Clases y objetos 469
A.6.2 Paquetes 471
A.6.3 Herencia 472
A.6.4 Interfaces 473
A.6.5 Polimorfismo 474
anexo b. resumen de notación uml 477
B.1 diagrama de casos de uso 477
B.2 diagrama de robustez 478
B.3 diagrama de componentes 478
B.4 diagrama de despliegue 478
B.5 diagrama de paquetes 479
B.6 diagrama de clases 479
B.7 diagrama de secuencias 480
B.8 diagrama de comunicación 481
B.9 diagrama de estados 481
B.10 diagrama de actividades 482
B.11 diagrama de estructura compuesta 483
bibliografía y referencias web 485
Referencias web 487
material adicional................................................................................................489
índice alfabético....................................................................................................491
prólogo
¿A QUIÉN VA DIRIGIDO ESTE LIBRO?
La edición del ejemplar que tiene en sus manos ha sido fruto de cuatro años de trabajo y de investigación en el campo de la Ingeniería del Software y del Lenguaje Unificado de Modelado (UML). Como especialista en esta disciplina, y después de una larga trayectoria de desarrollos en diversos lenguajes de programación, he intentado aplicar todos mis conocimientos a esta obra, otorgándole cierto rigor académico y sobre todo un aspecto atractivo para el lector. Para ello me he servido de ejemplos basados en desarrollos multimedia, de sistemas y como no, de software de gestión. El presente libro no intenta ser una obra de referencia en el campo, sino más bien un libro de ayuda al estudiante y profesional de UML, con el firme propósito de transmitir la importancia que tiene la formación arquitectónica del software después de la algorítmica.
La lectura de los contenidos le será más amena si posee ciertos conocimientos a nivel de Ingeniería Técnica o Ciclo Superior de FP en Informática. De esta forma, las nociones de Sistemas Operativos, Algorítmica, Redes, Bases de Datos, Autómatas y Programación Orientada a Objetos serán de una valiosa utilidad para seguir las indicaciones dadas en los capítulos.
Finalmente, si usted posee conocimientos avanzados de los lenguajes Java, C++ y/o Python, le resultará más fácil el aprendizaje de los conceptos aquí explicados. En caso contrario le podrá ser de utilidad el anexo A y las referencias bibliográficas sobre el tema que podrá encontrar al final del volumen. Es por tanto importante que revise estos contenidos antes de comenzar a leer.
ESTRUCTURA DEL LIBRO
Los contenidos de la presente obra se han estructurado de acuerdo a un ciclo de vida secuencial de un desarrollo software. La sucesión de las explicaciones teóricas de los capítulos está acordes al avance de un proyecto real.
Con la idea de explicar la asociación existente entre UML y un desarrollo real, se presentan tres proyectos que van evolucionando al ritmo del ciclo de vida, es decir, desde la adquisición de requisitos hasta la implementación. Dichos ejemplos nos irán guiando en los diferentes diagramas UML del proyecto y sus fases de construcción. De esta forma el libro se ha estructurado en el siguiente orden metodológico:
Parte I: Introducción teórica.
Parte II: Análisis de requisitos.
Parte III: Diseño arquitectónico.
Parte IV: Diseño detallado.
Parte V: Implementación.
Se ha intentado no descuidar los aspectos teóricos ni los prácticos, pretendiendo así conjugar a lo largo del libro ambos matices.
NOVEDADES EN LA SEGUNDA EDICIÓN
Se presenta aquí la segunda edición de la obra y, como es lógico en una nueva edición, se han corregido las erratas de la primera edición y se ha actualizado el contenido con las últimas tendencias en Ingeniería de Software y lenguajes de programación más demandados en la industria. Por esa razón, en el primer capítulo hallará una ampliación con el ciclo de vida incremental, metodologías de desarrollo software, calidad para la normalización/estandarización, así como teoría sobre el desarrollo de software seguro. También se ha incluido un nuevo patrón de diseño GOF y se ha tenido en consideración, por su importancia, incluir un nuevo capítulo dedicado a patrones GRASP con el fin de dar a conocer las técnicas que facilitan buenas prácticas de programación orientada a objetos actualmente.
La gran novedad de la presente edición recae en la incorporación de un nuevo caso de estudio para el abordaje de los conocimientos sobre análisis, diseño y programación mediante el lenguaje multiplataforma y multiparadigma Python, debido principalmente a su éxito en el mundo empresarial y de investigación.
Por todo ello, espero que esta obra cubra con completitud los conocimientos teóricos y prácticos que todo desarrollador aspira a alcanzar en aras de la construcción de software complejo que tanto necesitan las compañías y los investigadores de todo el mundo. Saber que este libro le ha servido para lograr el citado propósito sería una de mis grandes satisfacciones.
ESTILOS DE PROGRAMACIÓN
Como corresponde a cualquier proyecto informático basado en programación, un buen código fuente no es solo el que realiza sus funciones correctamente, sino también el que es legible y mantenible a lo largo del tiempo. Por este motivo, en el libro se ha intentado seguir ciertos criterios estilísticos en relación a cada lenguaje. Así para el código Java se ha utilizado las guías de estilo oficiales de Sun/Oracle publicadas en su sitio Web, mientras que para C++ el estándar elegido ha sido el Joint Strike Fighter - Air Vehicle - C++ Coding Standards recomendado por Bjarne Stroustrup. Respecto a Python, se ha aplicado el estilo de codificación indicado en su página de referencia: www.python.org.
DIAGRAMAS Y PROGRAMAS DE EJEMPLO
Para diseñar los diagramas de ejemplo del libro se han utilizado las aplicaciones StarUML y MagicDraw 15.0. La primera de ellas es una aplicación gratuita escrita inicialmente en Object-Pascal (Borland Delphi) y posteriormente en Java/Eclipse que puede ser descargada en la siguiente URL: http://staruml.sourceforge.net. La segunda es una aplicación comercial, pero puede descargarse una versión de prueba en: http://www.nomagic.com con el fin de evaluar los proyectos propuestos en el libro.
Las aplicaciones y ejemplos de Java aquí descritos han sido compilados y ejecutados directamente desde la línea de comandos en Windows, mientras que los ejemplos de C++ han sido programados sobre Visual C++ 2017. Si está interesado en la última actualización, puede descargarse una versión gratuita desde la Web de Microsoft en https://visualstudio.microsoft.com/es/downloads/ En cuanto a los proyectos realizados en Python, usted podrá descargar el intérprete del lenguaje desde su sitio web: https://www.python.org/downloads/
Finalmente, si desea descargar tanto los diagramas UML como los códigos fuente debe acceder a la web del propio libro en: www.ra-ma.com
Le recomiendo que lea primeramente el fichero leame.txt que se encuentra en el directorio con las indicaciones. Este fichero le guiará en la instalación de los ejemplos y le informará de la estructura de los archivos.
FEEDBACK
Cualquier crítica constructiva será siempre bienvenida. Éstas me servirán para mejorar mi trabajo de cara a una futura edición; por lo que cualquier errata, error, inconsistencia o fallo de presentación serán bien recibidas por mi parte.
Para cualquier consulta o informe de fallos puede contactarme por e-mail:
cjimeneztau@gmail.com
AGRADECIMIENTOS ACADÉMICOS
Quisiera expresar mi agradecimiento al profesor Dr. Manuel Arias Calleja por su amabilidad al revisar y dirigir algunos contenidos vía e-mail y telefónica desde Madrid; al Departamento de Ingeniería de Software y Sistemas Informáticos de la UNED por los conocimientos transmitidos en su Máster en Investigación y al profesor Dr. Jesús García Molina, de la Universidad de Murcia, por su segunda revisión y sabios consejos.
Murcia
El autor
Enero de 2021.
1
UML en el contexto de la ingeniería del software
«Siempre imaginé que el Paraíso sería algún tipo de biblioteca».
(Jorge Luis Borges)
Comenzamos la explicación de los conceptos relacionados con el mundo de la construcción del software haciendo una breve síntesis de la historia y evolución de las técnicas de modelado y cómo ha sido posible la llegada de UML (Unified Modeling Language) al mundo de la IS (Ingeniería del Software). En este capítulo también se hará una reseña a los diferentes diagramas que se tratarán a lo largo del libro y la relación que tienen con los diferentes ciclos de vida del software. Para finalizar se introducirá la última tendencia en el desarrollo automático de software mediante modelado con las técnicas de MDA (Model Driven Architecture).
la necesidad de un modelo unificado
UML comienza a gestarse cuando la empresa de software Rational, fundada por Grady Booch, contrata a James Rumbaugh en 1994 que por entonces trabajaba en la General Electric. UML nació como la fusión de la metodología OMT (Object-Modeling Technique) de Rumbaugh y el método de Grady Booch. Al poco tiempo (1995) se unió a Rational Ivar Jacobson, inventor del método OOSE (Object-Oriented Software Engineering) y de algunos conceptos de otros lenguajes de modelado. Al grupo de los tres inventores se le llamó familiarmente como los "Tres Amigos" a causa de sus frecuentes debates sobre UML. En enero de 1997 fue propuesto el primer borrador de UML 1.0 a la OMG¹ (Object-Management Group) a través de un consorcio llamado UML Partners. Más tarde, en noviembre de 1997, y después de la creación de la Semantic Task Force por UML Partners para estandarizar UML y dotarla de contenido semántico, UML 1.1 fue adoptada por la OMG. Desde la versión 1.1 hasta hoy han existido varias revisiones menores de la especificación como la 1.2, 1.3 y 1.4. La versión 2.5.1 de UML, lanzada en diciembre de 2017, es la última a fecha de escritura de la presente edición.
Actualmente UML goza de un reconocido prestigio en el campo de la IS, aplicándose de forma extensa en una gran variedad de campos del desarrollo de software (incluidos la Inteligencia Artificial) y con un éxito sin precedentes en los proyectos de software. La versión de UML utilizada en este libro es la 2.x y data de julio 2005.
¿por qué modelar?
Un modelo es una abstracción de un problema de la realidad. Con esta idea surge el concepto de modelar, que consiste en abstraer las características esenciales de un problema real a una representación útil para un propósito determinado. En el caso de la ingeniería convencional como la aeronáutica o la mecánica, los ingenieros construyen modelos para asegurarse que el producto final funcionará. La implicación directa del modelo es que es posible su validación y comprobación, por lo que no tiene sentido construir modelos para luego no realizar pruebas. Obviamente los modelos son más baratos que los productos acabados y además permiten verificar su correcto funcionamiento.
En el mundo del software, el ingeniero construye modelos para probar si sus proyectos tendrán éxito y para comunicar a otros ingenieros y programadores las ideas de lo que intenta modelar. En el campo de la IS predomina el uso de UML y no sería lógico utilizar otra técnica para organizar la estructura estática o dinámica de una aplicación, ya que el lenguaje de modelado UML es bastante maduro para este fin. Con el uso de UML el ingeniero puede crear un modelo más factible e inteligible que el código fuente complejo, intercambiable entre expertos y que permite probar fácilmente la aplicación. Las pruebas desde UML son un campo todavía en experimentación al que se dirige la tecnología MDA (Model Driven Architecture) y que aún no es fidedigna del todo. Actualmente ya es posible la conversión directa de un modelo UML a una aplicación ejecutable y distribuible, aunque cuenta con la desventaja del excesivo coste económico de estas herramientas.
Es siempre más factible dedicar un tiempo prudencial a analizar y diseñar la aplicación para comprobar que funciona, ya que el hecho de realizar esta acción nos asegura evitar muchos errores de diseño y la construcción de programas erróneos. En este sentido, nuestro trabajo siempre podrá ser entendido, discutido y comunicado con otros colegas de otras compañías o nacionalidades de una manera estándar, lo que implica también una forma de documentar productos de software para terceros desarrolladores.
En resumen, UML no se utilizará para probar si nuestro programa funcionará correctamente, sino para discutir con otros, documentar, aplicar la ingeniería directa o simplemente representar una idea. Por último, UML no es adecuado para sistemas en tiempo real, para tales sistemas existen notaciones específicas que no están dentro del ámbito de este libro.
Modelos de proceso software
De igual forma que sucede en otras actividades de ingeniería, en la que existe un ciclo de vida desde que se detecta la necesidad de construir el producto hasta que está en uso, la IS también requiere de tiempo y esfuerzo para su desarrollo y debe permanecer en uso durante un tiempo mucho mayor. Por este motivo se requiere de un ciclo de construcción y mantenimiento del software que se repita de forma secuencial o de otras maneras y permita el establecimiento de fases de desarrollo. Al conjunto de fases delimitadas con sus entradas y salidas se les denomina comúnmente ciclo de vida
y permiten la elaboración de software de una manera metódica y ordenada.
Las fases principales son comunes en todos los ciclos de vida y se repiten de manera secuencial, incremental o en espiral. Las fases principales en cualquier ciclo de vida son:
Análisis: Es el proceso de reunión de requisitos para construir el software. El analista del software debe comprender el dominio de información del software y construir el modelo de análisis.
Diseño: Esta fase se compone de muchos pasos en los que se encuentran la deducción de estructuras de datos, la arquitectura del software, la interfaz de usuario y el diseño algorítmico. Algunos autores dividen esta etapa en el diseño global o arquitectónicoy diseño detallado. El primero consiste en transformar los requisitos en una arquitectura de alto nivel, definir las pruebas, generar la documentación y planificar la integración. El diseño detallado consiste en refinar el diseño para cada módulo, definiendo sus requisitos y la documentación.
Codificación: Se transforma el diseño en código ejecutable para la construcción del sistema. Las herramientas Computer-Aided Software Engineering (CASE) actuales permiten la conversión de un modelo UML para generar una parte esquemática del código de la aplicación, aunque no toda completamente.
Pruebas: Después de generar el código se procede a probar el programa. El proceso de pruebas consiste en el análisis de los procesos lógicos internos del software (comprobando que las sentencias y las bifurcaciones se cumplen), o en el análisis de los procesos externos funcionales (se ejecuta el programa con una serie de entradas y condiciones para comprobar que se ejecuta correctamente). A las primeras se les denomina pruebas de caja blanca
, mientras que a las últimas se les denomina pruebas de caja negra
, por la opacidad de la visión del código fuente.
Mantenimiento: Se produce después de entregar el producto al cliente.Es la parte que más tiempo consume. Se debe comprobar que el software sigue funcionando correctamente, y que se adapta a los nuevos requisitos y condiciones externas. Por ejemplo, un cambio de sistema operativo o de un dispositivo o periférico.
Estas etapas o fases se dividen en tareas. La documentación es una tarea importante que se realiza en todas las fases y donde UML cumple un papel excelente para los desarrolladores.
Modelo en cascada
El ciclo de vida en cascada fue propuesto por Winston W. Royce en 1970 y posteriormente revisada por Barry Boehm en 1980 e Ian Sommerville en 1985. Se basa en una serie de etapas o fases que se ejecutan en el proyecto de forma iterativa. Es decir, partiendo del análisis de requisitos se transita por el resto de las fases secuencialmente hasta llegar al mantenimiento. Una característica de este ciclo de vida es que podemos volver hacia atrás en el ciclo si tuviéramos que realizar cambios en algunas de las etapas anteriores. Por ejemplo, si en la etapa de pruebas fuera necesario volver al diseño, tendríamos obligatoriamente que pasar de nuevo por la codificación.
Entre las ventajas de este modelo destacan la facilidad de utilización y la existencia de una gran cantidad de herramientas CASE que lo soportan. Entre las desventajas se incluye la exigencia de tener todos los requisitos al comienzo del proyecto y que no genera ningún producto hasta que se hayan finalizado todas las fases (ciclo). En general, este tipo de modelo se utilizará en proyectos de corta duración y fáciles que no requieran de cambios frecuentes en los requisitos.
Figura 1.1. Ciclo de vida en cascada
Modelo incremental
Según [Pressman02], el modelo incremental corresponde a la gama de modelos evolutivos de proceso de software, ya que combina las ventajas del modelo en cascada con la filosofía de construcción de prototipos. Como veremos a continuación, la metodología RUP (Rational Unified Process) utilizará un esquema de ciclo de vida muy similar. En la figura 1.2 se muestra el diagrama