Ciclo de de Desarrollo de Software PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 60

Ciclo de Desarrollo de Software

Material para los estudiantes

Guadalupe Ibargüengoitia G.
Hanna Oktaba
Amparo López Gaona

Material realizado bajo el convenio 19403-1688-29-XI-06


Microsoft-Facultad de Ciencias, UNAM
Ciclo de Desarrollo de software

Contenido

Introducción
Capítulo 1 Ciclo de desarrollo de software
1.1 Introducción al ciclo de vida del software
1.2 Definición de Ingeniería de Software
1.3 Software, su naturaleza y características
1.4 Principios de la Ingeniería de Software
1.5 Proceso de software
1.6 Ciclo de desarrollo de software
1.7 Lenguaje de Modelado Unificado UML

Capítulo 2 Especificación de requerimientos


2.1 Entender el problema
2.2 Especificación de Requerimientos
2.3 Requerimientos funcionales.
2.3.1 Diagramas de casos de uso
2.4 Prototipo de interfaz de usuario
2.5 Requerimientos no funcionales

Capítulo 3 Análisis
3.1 Introducción al Análisis
3.2 Vista estática.
3.2.1 Diagrama de clases
3.3 Vista dinámica.
3.3.1 Diagramas de secuencia
3.3.2 Diagramas de estados

Capítulo 4 Diseño
4.1 Introducción al Diseño
4.1.1 Principios del diseño
4.2 Arquitectura de software
4.2.1 Diagrama de paquetes
4.2.2 Diagrama de distribución
4.3 Construcción de componentes
4.4 Diseño de la base de datos
4.4.1 Conversión del diagrama de clases al modelo de datos de una base de
datos relacional

Guadalupe Ibargüengoitia G., Hanna Oktaba 2


Ciclo de Desarrollo de software

Capítulo 5 Construcción
5.1 Diseño detallado de clases
5.2 Estándares de codificación
5.3 Revisión de código y programación entre pares
5.4 Pruebas unitarias
5.4.1 Pruebas caja blanca
5.4.2 Pruebas caja negra

Capítulo 6 Integración y prueba del sistema


6.1 Integración del sistema
6.2 Prueba del sistema
6.3 Manuales

Guadalupe Ibargüengoitia G., Hanna Oktaba 3


Ciclo de Desarrollo de software

Introducción
Los productos de software apoyan gran cantidad de las actividades humanas. Estos
productos responden a las necesidades de personas, empresas, organizaciones, etc. Los
defectos en sistemas de software pueden causar daños no solamente económicos sino
también de vidas humanas. Por lo tanto, la forma en que se desarrolle el software para
cumplir con las necesidades de sus usuarios y para evitar el mayor número de defectos, es
de vital importancia.

La Ingeniería de Software comprende los métodos, técnicas y herramientas necesarias para


la construcción de sistemas de software con calidad.

El objetivo de este Material para los Estudiantes es enseñar las prácticas básicas de
Ingeniería de Software para la concepción y desarrollo de software. Las notas describen las
principales fases de un ciclo de desarrollo y las técnicas básicas que sirvan de guía a los
alumnos que construyen estos productos de software por primera vez. El material está
dirigido principalmente a los estudiantes de licenciaturas, que ya saben programar en un
lenguaje orientado a objetos.

La estructura de las notas es la siguiente:

En el capítulo 1, se introducen los conceptos básicos de Ciclo de desarrollo de software e


Ingeniería de Software. Se analiza la naturaleza del software, los principios de la Ingeniería
de Software, el Proceso de software. Se presenta brevemente el Lenguaje de Modelado
Unificado (UML por sus siglas en inglés) que será la herramienta de modelado en todos los
capítulos de las notas.

El capítulo 2, trata sobre la especificación de los requerimientos y propone varios


diagramas de UML para el modelado.

El capítulo 3 está dedicado al análisis de requerimientos, se explica su objetivo y las


representaciones estática y dinámica con los diagramas de UML correspondientes.

En el capítulo 4, se presentan varias técnicas para hacer el diseño del software que
comprende desde la arquitectura hasta el diseño de la base de datos.

El capítulo 5 habla de diseño detallado para la construcción del software y de las pruebas
unitarias.

El capítulo 6 se plantea la forma de integrar y probar el sistema. También, incluye una


sección sobre la construcción de manuales.

El presente Material para los Estudiantes ha sido elaborado bajo el convenio 19403-1688-
29-XI-06 entre Microsoft y la Facultad de Ciencias de la UNAM y está acompañado con el
Material para el maestro, ambos en su versión preliminar.

Guadalupe Ibargüengoitia G., Hanna Oktaba 4


Ciclo de Desarrollo de software

Capítulo 1
Ciclo de desarrollo de software

1.1 Introducción al ciclo de vida del software


Los productos de software apoyan gran cantidad de las actividades humanas. Estos
productos responden a las necesidades de personas, empresas, organizaciones, etc.

Los productos de software tienen un ciclo de vida que consta de dos etapas:
Etapa de concepción y desarrollo
– Alguien define las necesidades que deberá cubrir el software.
– Se analiza y diseña el producto que las cumplirá
– Se construye y prueba el producto
Etapa de operación, mantenimiento y retiro
– Se pone en operación
– Se va modificando y mejorando
– Eventualmente se deshecha

Las personas que construyen estos productos de software se llaman Ingenieros de Software.

Es la Ingeniería de Software, la rama de las Ciencias de la Computación que se encarga de


estudiar las teorías, métodos y herramientas que se necesitan para desarrollar el
software.[Sommerville]

En estas notas plantearemos las bases de la Ingeniería de software y nos enfocaremos en la


etapa de concepción y desarrollo.

1.2 Definición de Ingeniería de Software


Las definiciones de la Ingeniería de Software consideran diversos aspectos de lo que
contempla esta disciplina:

Enfoque en el ciclo de vida de software:


• Es la aplicación sistemática, disciplinada y cuantificable del desarrollo, operación y
mantenimiento de software. [IEEE Standard Glossary of Software Engineering
Terminology, std610.12-1990]

Enfoque en las personas involucradas:


• Es la construcción de productos de software por grupos de personas, para que sean
usados por otras. El cliente es quien solicita el desarrollo del producto y plantea el
problema a resolver. El equipo de desarrollo construye y entrega el producto solicitado.

Guadalupe Ibargüengoitia G., Hanna Oktaba 5


Ciclo de Desarrollo de software

1.3 Software, su naturaleza y características

Se entiende por software al código generado por programas, escritos en algún lenguaje de
programación, que resuelve un problema. El software no es sólo el código, sino también
“los documentos asociados y la configuración de datos que se requieren para que esos
programas funcionen correctamente” [Sommerville] y puedan ser mantenidos.

El software es un nuevo tipo de producto que no se parece a ningún otro artefacto que sea
tangible como puentes, casas, teléfonos, etc. El software tiene una naturaleza diferente, por
lo que es necesario entenderla.

Algunas caracteristicas de la naturaleza del software son:


• “El software se desarrolla, no se fabrica en un sentido clásico” [Pressman]
• El software no es tangible como los productos de otras ingenierías.
• El software es fácilmente modificable y por lo tanto corrompible.
• “El software no se desgasta con el paso del tiempo como puede pasar con el hardware,
pero se puede deteriorar si al mantenerlo se le incorporan errores al tratar de corregir
otros”. [Pressman]

Definir cuales son las características de calidad que debe tener un producto de software no
es fácil, pues depende de a quién se le pregunte: al cliente, al analista, al desarrollador, el
que hará el mantenimiento, etc. Las características mas reconocidas son las siguientes:
• Funcionalidad (Functinality): si se comporta de acuerdo a las especificaciones de las
funciones que debe ejecutar.
• Confiabilidad (Reliability): si el usuario puede depender de él y si se comporta
"razonablemente" aún en circunstancias no anticipadas en la especificación de
requerimientos.
• Usable (Usability): Si el usuario lo encuentra fácil de entender, aprender y usar.
• Eficiente (Efficiency): si usa sus recursos adecuadamente y proporciona un desempeño
adecuado.
• Mantenible (Maintainability): Si es fácil hacerle modificaciones tales como
correcciones, mejoras o adaptaciones.
• Portable (Portability): Si es posible correrlo en diversos ambientes o plataformas.
• Reusable: Si se pueden usar partes o todo para el desarrollo de un nuevo producto.
• Interoperable: Si puede coexistir y cooperar con otros sistemas.

1.4 Principios de la Ingeniería de Software

La Ingeniería de Software es relativamente reciente, por lo que no está tan madura como
otras ramas de la Ingeniería. Sin embargo, existen algunos principios ya validados por la
experiencia.

Los principios según [Ghezzi] son:

Guadalupe Ibargüengoitia G., Hanna Oktaba 6


Ciclo de Desarrollo de software

• Generalidad: Consiste en descubrir los aspectos más generales que existen en un


problema. Este principio es fundamental cuando se trata de desarrollar herramientas
y paquetes genéricos.
• Abstracción: Es identificar inicialmente los aspectos más importantes e ir
incorporando los detalles gradualmente.
• Modularidad: Es dividir el problema en subproblemas. Incluye los conceptos de
cohesión y acoplamiento.
• Incrementabilidad: Consiste en obtener el producto de software incrementando la
funcionalidad en varios ciclos (iteraciones).
• Separación de conceptos: Es manejar diferentes aspectos de un problema
concentrándose en cada uno por separado.
• Anticipación al cambio: Es diseñar el software para que pueda evolucionar a nuevas
versiones, que se administran de manera controlada.

El Software Engineering Body Of Knowledge [SWEBOK] es un esfuerzo de la comunidad


de Ingeniería de Software que recoge principios, técnicas y mejores prácticas reconocidas
por los académicos y profesionales del área.

1.5 Proceso de software

El Proceso de software es el conjunto de actividades que se necesitan para transformar las


necesidades de un cliente en un producto de software. Permite que los desarrolladores
sepan qué hacer, cuándo, cómo y quién es el responsable.

En la siguiente figura 1 se modela el Proceso de software [Oktaba] por medio de diagramas


de clase de UML. Los rectángulos representan clases, la relación entre clases con un
pequeño rombo significa agregación o la relación está compuesto por. Las líneas entre
clases, significan asociaciones entre clases.

Proceso de Software

1..*
Fase

1..*
Producto Actividad Rol
1..* 1..*

Figura 1. Modelado del Proceso de software [Oktaba]

Guadalupe Ibargüengoitia G., Hanna Oktaba 7


Ciclo de Desarrollo de software

Un Proceso de software está compuesto por fases y debe incluir al menos una fase. Las
fases están compuestas de al menos una actividad, que tiene asociado uno o varios
productos y uno o varios roles. Un rol es responsable de al menos una actividad.

• Las Fases constituyen pasos significativos del proceso de software. Tienen un objetivo
dentro del desarrollo. Para cada fase se identifican: los roles, actividades y productos
que son necesarios cabo para cumplir el objetivo de la fase.
• Actividades definen las acciones que se llevan a cabo en el desarrollo del software y
utilizan y/o generan los productos.
• Productos son las entradas y salidas de las actividades. Pueden ser documentos,
diagramas de diseño, código, planes de pruebas, reportes, manuales de usuario, o
conjuntos de ellos.
• Roles son los responsables por llevar a cabo las actividades del proceso.

1.6 Ciclo de desarrollo de software

En estas notas nos abocamos solo a la etapa de desarrollo de software que representa el
inicio del ciclo de vida . En la etapa de desarrollo se usará tecnología orientada a objetos
para hacer la construcción del software. El proceso de desarrollo del software está basado
en el Proceso Unificado [Jacobson], que está guiado por los casos de uso y es iterativo e
incremental.
• Guiado por los casos de uso:
– Un caso de uso es una funcionalidad del sistema que proporciona al usuario
un valor o servicio. Un usuario es una persona o un sistema que interactúa
con el software. Por lo que los casos de uso guían el desarrollo del software
para que cumpla con las necesidades del usuario.

• Iterativo e incremental
– Una iteración es la ejecución de todos los pasos del ciclo de desarrollo. Un
Incremento es la evolución que va teniendo el producto a lo largo del
tiempo. En el desarrollo se escogen algunos casos de uso iniciales para una
iteración y en versiones posteriores del software se incrementa
incorporando otros casos de uso. Las iteraciones se deben planear y
controlar.

Una iteración del ciclo de desarrollo consta de las siguientes fases:


• Especificación de requerimientos (capítulo 2). El objetivo de esta fase es entender,
capturar y especificar los requerimientos para tener una descripción clara y no ambigua
de lo que será el producto. Esta especificación debe proporcionar criterios para validar
el producto terminado. Se usarán los casos de uso para especificar los requerimientos.
• Análisis (capítulo 3). Se analizan los requisistos para tener un mejor entendimiento de
lo que se pretende y se construye el modelo del análisis para identificar los elementos
que servirán de base para estructurar todo el sistema. Se establecen las clases con que

Guadalupe Ibargüengoitia G., Hanna Oktaba 8


Ciclo de Desarrollo de software

se construirá el software. Se construyen dos modelos: la vista estática (diagramas de


clases) y dinámica (diagramas de secuencia y de estados).
• Diseño (capítulo 4). Los objetivos de esta fase son: describir las partes de las cuales se
va a componer el sistema y mostrar sus relaciones en la arquitectura, se identifican los
paquetes principales del software y la forma en que se distribuirán en las computadoras
que intervienen en una aplicación.
• Construcción (capítulo 5). El objetivo de esta fase es hacer la construcción del
software y entregar el código probado de las unidades.
• Integración y pruebas (capítulo 6). El objetivo de esta fase es hacer la integración del
sistema y probar que cumpla con sus requerimientos.

1.7 Lenguaje de Modelado Unificado UML

El Lenguaje de Modelado Unificado (UML por sus siglas en inglés) [Booch] es el estándar
de la OMG (Object Management Group) para el modelado orientado a objetos y será la
herramienta de modelado en el curso por las siguientes razones:
- Provee de un lenguaje de modelado expresivo y visual.
- Es independiente de lenguajes de programación y los procesos de desarrollo.
- Cubre los requerimientos de modelado de los sistemas actuales, por ejemplo, sistemas
concurrentes y distribuidos.
- Está enfocado a proporcionar un lenguaje de modelado estándar y no a un proceso
estándar.

Hay dos tipos de diagramas en UML


• Diagramas estructurales. Muestran la estructura estática y los elementos del sistema.
Se dividen en los siguientes diagramas:
– Clases.
– Objetos
– Componentes
– Paquetes
– Distribución
• Diagramas de comportamiento. Muestran la dinámica de la funcionalidad del
sistema. Se dividen en los siguientes diagramas:
– Casos de uso
– Interacción:
• Secuencia
• Comunicación
• Tiempo
– Actividades
– Estados

Para construir buenos diagramas se tienen las siguientes recomendaciones:


• Cada diagrama debe contener un aspecto del sistema.
• Contiene lo esencial para entender ese aspecto.
• Los diagramas se mantienen consistentes con su nivel de abstracción.

Guadalupe Ibargüengoitia G., Hanna Oktaba 9


Ciclo de Desarrollo de software

• Muestran lo necesario para transmitir su semántica.

A lo largo del ciclo de desarrollo de software que usaremos, se irán construyendo diversos
diagramas de UML.

Referencias bibliográficas
• Booch G., Rumbaugh J., Jacobson I. The Unified Modeling Languaje. Users guide.
Addison Wesley 1999.
• Ghezzi C., Jazayeri M., Mandrioli D. Fundamentals fo Software Engineering. Prentice
Hall 1991.
• IEEE Standard Glossary of Software Engineering Terminology, std610.12-1990.
• Jacobson I., Booch G., Rumbaugh J. The Unified Software Development Process.
Addison Wesley 1999.
• Oktaba H., Ibargüengoitia G. “Software Processes Modeled with Objects: Static View”,
Computación y Sistemas, Iberoamerican Journal of Computer Science, CIC-IPN,
México, 1, 4 (1998), p.228-238.
• Pressman R.S. Ingeniería del Software. Un enfoque práctico. McGraw Hill.
• Sommerville I. Ingeniería de Software 6ª edición. Addison wesley 2002.
• SWEBOK. Guide to the Software Engineering Body of Knowlwdge. Trial version
Mayo 2001. www.swebok.org

Guadalupe Ibargüengoitia G., Hanna Oktaba 10


Ciclo de Desarrollo de software

Capítulo 2
Especificación de requerimientos

2.1 Entender el problema


Para construir un producto de software, es necesario contar con la cooperación del cliente,
entender cuál es el problema que se desea resolver y cuáles son sus necesidades reales.

La mayor parte de las veces, el cliente no tiene claro qué es lo que realmente necesita. Es el
desarrollador el responsable de ayudar al cliente a entender y expresar sus necesidades para
que el software las pueda satisfacer. Para identificar los requerimientos se consultan a los
interesados a través de varias técnicas [Tomayco] como son:
• Hacer entrevistas.
• Aplicar cuestionarios.
• Observar a los futuros usuarios al realizar las tareas que apoyará el software.
• Revisar documentos o sistemas ya existentes que se pretenden mejorar.

El cliente expresa de manera oral sus necesidades sobre el software que desea se le
construya. Escribir un texto, entre el cliente y el desarrollador, que defina el problema, es
una buena práctica que permite poner en blanco y negro las necesidades del software y
ayuda al cliente a precisarlas. Por lo que la entrada inicial al proceso de desarrollo de
software es escribir en un texto la Definición del problema.

El texto deberá escribirse preferentemente en un lenguaje que entienda el cliente sin


términos técnicos computacionales.

Coad [Coad] propone una serie de estrategias al redactar ese texto para ayudar a aclarar el
objetivo del software. Una de ellas es escribir una frase del tipo “para ayudar a” o “para
apoyar a” que permiten saber el tipo de usuarios que tendrá el software y para qué se usará.
Otra estrategia que propone es que el desarrollador “se dé una vuelta por el ambiente de
trabajo donde se usará el software”, esto permite ver a los usuarios y el tipo de cosas que
necesitan que el sistema haga para apoyarlos en su trabajo diario. Una estrategia más,
indica que “se haga una lista de características o cualidades” que deberá tener el software,
la que se puede escribir en orden de importancia.

En el texto de la figura 2.1 se muestra una definición del problema para construir un
sistema para una bolsa de trabajo en internet. En él se aplican dos de las estrategias
propuestas por Coad, usar la frase “para apoyar a” y “hacer una lista de características”.

Guadalupe Ibargüengoitia G., Hanna Oktaba 11


Ciclo de Desarrollo de software

DEFINICION DEL PROBLEMA:

Bolsa de trabajo
Se desarrollará un sistema de bolsa de trabajo que apoye a desempleados y a empresas.
Este sistema podrá ser usado por desempleados que están en busca de algún empleo y
por empresas que estén en busca de empleados para ocupar una vacante.
Los desempleados podrán ver las vacantes disponibles sin tener que registrarse, pero si
el desempleado quiere postularse para una vacante tendrá que registrarse forzosamente.
Las empresas podrán publicar sus vacantes por medio de un contacto, el cual será el
responsable de los datos de la empresa, la empresa podrá revisar quién se registró para
ocupar la vacante publicada. La empresa podrá contactarlo después de revisar su
solicitud y el currículo del desempleado.

Lista de características deseadas

1. Cualquier usuario podrá ver las vacantes disponibles en el sistema de software.

2. El usuario que se interese por alguna vacante en el sistema y quiera postularse a


ella tendrá que registrar sus datos y agregar su currículo.

3. Las empresas tendrán que tener una clave de usuario y una contraseña para
poder ver los postulados para su vacante.

4. Las empresas tendrán un representante, el cual será el encargado de la


administración de los datos de la empresa y sus vacantes.

5. Las empresas sólo podrán ver a los desempleados que se registraron para sus
vacantes.

6. El sistema estará creado en ambiente Web y podrá ser accedido mediante


cualquier explorador Web.

7. El sistema deberá de ser fácil de usar por algún usuario aún sin tener ningún tipo
de capacitación para usar el sistema.

Figura 2.1. Ejemplo de Definición del problema.

Guadalupe Ibargüengoitia G., Hanna Oktaba 12


Ciclo de Desarrollo de software

La definición del problema permite establecer un acuerdo y entendimiento común entre el


equipo de desarrollo y el cliente sobre lo que se va a hacer. En esta definición se sugiere
que participen todos los miembros del equipo de desarrollo para entender el propósito del
software que van a desarrollar.

Glosario de términos
La definición del problema es difícil pues el del cliente usa los términos relacionados con el
problema y el técnico el lenguaje de los desarrolladores. Para que se puedan comunicar más
fácilmente todos los involucrados, se recomienda construir un glosario de términos que
establece un vocabulario común.

El glosario de términos es un diccionario donde se pone cada término y su significado para


este proyecto. En este glosario se deben incluir también los términos familiares para el
desarrollador con su significado. La construcción del glosario es un trabajo continuo a lo
largo del proyecto, se inicia en esta fase y se concluye al finalizar el proyecto. En la figura
2.2 se muestra un extracto del glosario de términos del sistema de bolsa de trabajo.

GLOSARIO DE TÉRMINOS

Sistema de Bolsa de trabajo

Actor: Es una entidad que interacciona con el sistema para obtener un resultado.
Puede ser una persona, otro sistema, un dispositivo, etc.
Bolsa de Trabajo: En este caso, es la concentración de información acerca de
empresas que tienen puestos disponibles (vacantes) y de personas que tienen la
necesidad de conseguir un empleo.
Caso de uso: Es la descripción de un conjunto de secuencias de acciones que un
sistema lleva a cabo para regresar un resultado observable a un actor.
Contraseña: Clave de seguridad que se le asigna a un usuario.
Desempleado: Persona que no tiene trabajo y está en busca de un empleo.
Empresa: Organización que tiene la necesidad de contratar a personas con
capacidades especificas para su correcto funcionamiento.
Nombre de usuario: Identificación del usuario para poder acceder al sistema.
Vacante: Puesto disponible para ser ocupado por un desempleado por parte de una
empresa.
Visitante: Persona que abre las páginas del sistema y revisa la información que se
presenta en este sitio Web, la información la podrá ver sin tener que registrar sus datos.

Figura 2.2. Glosario de términos.

Guadalupe Ibargüengoitia G., Hanna Oktaba 13


Ciclo de Desarrollo de software

2.2 Especificación de Requerimientos


Los requerimientos son el punto de partida para la construcción de un producto de software.
Los Requerimientos de software son un área de la Ingeniería de Software dedicada al
estudio de la adquisición, análisis, especificación, validación y administración de los
requerimientos o necesidades de un software. [SWEBOK 2001]. Es una fase fundamental
para la construcción de software con calidad. Se entiende por calidad en un producto de
software aquel que cumple con las necesidades del usuario.

Un requerimiento o necesidad es lo que el cliente, o un usuario necesitan que haga el


software para resolver un cierto problema. Para definir los requerimientos deben colaborar
conjuntamente varios roles: el equipo de desarrollo, el cliente (quien paga el software), los
usuarios (quienes lo usarán en su trabajo diario). Muchas veces el cliente y el usuario son la
misma persona. A todas estas personas se les llama en inglés stakeholders que se traduce
por interesados o involucrados.

La especificación de requerimientos es como un mapa para entender el problema a resolver.


Los mapas son una ayuda a llegar más rápido al lugar deseado. Si no se tiene el mapa, se
puede manejar a toda velocidad pero no necesariamente se llegará a la meta.

Una característica de los requerimientos es que cambian constantemente por muchas


razones: se modifican las necesidades del cliente, cambia el ambiente, la tecnología, etc.
por lo que establecer los requerimientos es un proceso de negociación entre el cliente y los
desarrolladores, donde ambos entienden y acuerdan el objetivo del software.

Los requerimientos deben formularse de forma clara, precisa y no ambigua. Para eso
pueden usarse varias técnicas al mismo tiempo: el lenguaje natural, que es claro para el
cliente pero ambiguo; el modelado gráfico, que es mas claro para el desarrollador y no es
ambiguo, pero puede no ser claro para el cliente; prototipo de interfaz de usuario, útil para
ambos pues es una representación visual de lo que hará el software.

Hay dos tipos de requerimientos: los funcionales y los no funcionales.

Los funcionales incluyen:


• Las entradas y salidas de datos, los cálculos o las funciones del software.

Los no funcionales son las características o restricciones que se le piden al software:


• Necesidades de la interfaz externa como: tipo de usuario, hardware, software,
comunicaciones, facilidad de uso por sus usuarios.
• Atributos del software tales como: eficiencia, disponibilidad, seguridad, conversión,
portabilidad, mantenimiento.
• Restricciones del diseño: de formatos, de archivos, lenguajes, estándares,
compatibilidad.
• Otros: base de datos, instalación, etc.

Guadalupe Ibargüengoitia G., Hanna Oktaba 14


Ciclo de Desarrollo de software

El proceso para la especificación de los requerimientos es:


1. Entender las necesidades del software.
2. Identificar a los interesados en el sistema y solicitar los requerimientos.
3. Identificar y negociar los requerimientos funcionales y los no funcionales.
4. Hacer el prototipo de interfaz para que los interesados confirmen si esos son sus
requerimientos.
5. Documentar la Especificación de requerimientos.

La especificación de requerimientos termina cuando se obtiene el documento de


Especificación de los requerimientos, que resume lo que cliente necesita y que servirá de
guía a los desarrolladores para analizar esos requerimientos, validarlos, administrarlos y
generar el software. Validar un requerimiento implica comprobar que el software lo
cumpla. Administrar los requerimientos significa que se lleve un control de los cambios que
van surgiendo.

La especificación de requerimientos es un documento donde se establece el acuerdo de lo


que hará el software. Para hacer este documento se puede seguir lo que proponen los
modelos de referencia como MoProSoft [MoProSoft], para la estructura de este documento:
• Introducción. Es una descripción general del software y su propósito.
• Descripción de requerimientos.
o Funcionales.
o Prototipo de interfaz de usuario.
o No funcionales como: confiabilidad, portabilidad, restricciones de diseño o
construcción, de mantenimiento, interfaces con otro software o con
hardware.

2.3 Requerimientos funcionales


Para especificar los requerimientos funcionales se usarán los casos de uso los que serán el
hilo conductor de todo el proceso de desarrollo. Esta técnica se utiliza para identificar los
requerimientos funcionales y a partir de ellos se diseña, implementa y prueba el software.
Permite rastrear los requerimientos a través de todo el proceso de desarrollo hasta el
producto terminado.

2.3.1 Diagramas de casos de uso

Los casos de uso proporcionan una manera incremental y modular de describir software.
Definen como utilizan el software sus usuarios. El conjunto de casos de uso conforma el
modelo de casos de uso que describe el comportamiento general del sistema. Los casos de
uso proporcionan una representación que puede ser fácilmente comprendida por todos los
interesados. Se representan gráficamente con Diagramas de caso de uso de UML.

Elementos de los diagramas de casos de uso

Guadalupe Ibargüengoitia G., Hanna Oktaba 15


Ciclo de Desarrollo de software

Caso de uso. Un caso de uso es una descripción de un conjunto de secuencias de acciones


que realiza el sistema para entregar un resultado o valor observable a un actor. [Booch,
1999]. Se representa por una elipse con el nombre del caso de uso. El nombre del caso de
uso deberá iniciarse, preferentemente, con un verbo en infinitivo.

Consultar
vacante

Actor. Es algo externo al software que intercambia información con el sistema, puede ser
un usuario u otro sistema. El objetivo de un actor es completar una funcionalidad con el
software para obtener un valor o servicio. Se representa con una figura humana con el
nombre del actor en singular. Los sistemas externos con los que interacciona el software
que se está desarrollando también son actores. Un caso de uso puede proporcionar un valor
a uno o más actores. En el ejemplo del sistema para la Bolsa de Trabajo, un actor es el
Desempleado.

Desempleado

Alcance del sistema. Representa la frontera del sistema y contiene los casos de uso que se
realizan en cada ciclo de desarrollo. Se representa por un rectángulo que incluye los casos
de uso dentro del alcance del sistema.

Diagrama de casos de uso. Un diagrama de casos de uso incluye los actores identificados,
los casos de uso para cada actor y el alcance del sistema. En el diagrama general se ponen
las funcionalidades o casos de uso más generales que posteriormente se detallan en
diagramas en los que se desglosa cada funcionalidad. Este diagrama general tiene por
objetivo mostrar de forma gráfica y clara las funcionalidades del sistema por lo que deberá
ser simple, para mostrar a golpe de vista el alcance. Se recomienda que siempre se incluya
un caso de uso para entrar al sistema y uno de salir de los actores. El diagrama general se
discute con el cliente y los usuarios del software.

En la figura 2.3 se muestra el diagrama general de casos de uso del sistema de la Bolsa de
trabajo. En este diagrama se aprecian 8 casos de uso generales para 3 actores que
posteriormente se detallarán. El alcance del sistema está encuadrado en el rectángulo. Este
diagrama permite entender la funcionalidad general del sistema y su alcance.

Guadalupe Ibargüengoitia G., Hanna Oktaba 16


Ciclo de Desarrollo de software

Figura 2.3 Diagrama general del sistema de Bolsa de trabajo.

Proceso para la creación de diagramas de casos de uso


1. Identificar los actores del sistema. Esto es, los que interaccionarán con el software
para obtener un resultado de él.
2. Identificar las funcionalidades o casos de uso generales para cada actor.
3. Definir el alcance o los casos de uso que se desarrollarán.
4. Detallar cada caso de uso.

Guadalupe Ibargüengoitia G., Hanna Oktaba 17


Ciclo de Desarrollo de software

Criterios para identificar los actores y casos de uso:


1. Para identificar un actor se revisa la definición del problema a fin de definir el tipo
de usuarios u otros sistemas que interactúan con el software. Se nombran con
mayúscula y en singular.
2. Los candidatos para actores son roles generales, no personas concretas. Por ejemplo,
Desempleado y no Juan Pérez.
3. Los casos de uso representan las necesidades de los usuarios del sistema que podrán
ser modeladas y validadas en uno o varios casos de uso.
4. Para identificar los casos de uso, se revisa la definición del problema para cada
actor, buscando las funcionalidades generales que requiere.

Detalle de los casos de uso

Una vez identificados los principales casos de uso para cada actor, se describe en detalle
cada uno. La plantilla que se propone para esta descripción es:

Nombre: El nombre deberá ser un verbo en infinitivo representativo de la funcionalidad del


caso de uso.
Actor: Nombre del actor encargado de iniciar la acción y que recibe el resultado del caso
de uso.
Diagrama detallado del caso de uso indicando el actor y sus variantes o detalles.
Descripción: Texto breve describiendo la acción.
Precondiciones: Acciones previas del estado del sistema para que se pueda iniciar el caso
de uso.
Flujo de eventos normales: Tabla que describe el flujo de acciones entre el actor y el
sistema durante el caso de uso.
Flujo de eventos alternativos: Tabla con las acciones que ocurren en situaciones
alternativas o excepcionales.
Postcondiciones: Define el estado del sistema después de la terminación exitosa del caso
de uso.

Ejemplo del detalle del caso de uso de Consultar vacante

Caso de uso: Consultar Vacante

Actor: Visitante

Guadalupe Ibargüengoitia G., Hanna Oktaba 18


Ciclo de Desarrollo de software

Descripción: Un Visitante entra al sistema para consultar las vacantes que están
disponibles.

Precondiciones:

• El visitante conoce la dirección Web del sistema de software SIBOT.


• El visitante desea ver las opciones de trabajo que están disponibles.

Flujo de eventos normales:

Usuario Sistema
Paso Acción Paso Acción Excepción
1 El usuario da clic en el 2 Muestra la pantalla de Todas E1
vínculo Ver Vacantes. las Vacantes.
3 Selecciona la Vacante de
la cual desea ver los
datos a más detalle.
4 Da clic en el botón Ver 5 Se muestra la pantalla de E1,E2
Detalle de Vacante con los
datos de la vacante
seleccionada.

Flujo de eventos alternativos:

Id Nombre Acción
E1 La conexión con la base de datos Se manda un mensaje de error, el cual indica
no esta establecida o se que los datos no se pueden mostrar debido a que
interrumpió. no hay conexión con la base de datos.
E2 No se ha seleccionado ninguna No hace nada.
vacante

Poscondiciones:

• Los datos de la vacante se muestran a detalle.

Figura 2.4. Ejemplo del detalle de un caso de uso.

2.4 Prototipo de interfaz de usuario


Un prototipo de interfaz de usuario es una representación parcial de la interfaz de usuario
que tendrá el software, que muestra la forma en que el usuario interaccionará con él. Este

Guadalupe Ibargüengoitia G., Hanna Oktaba 19


Ciclo de Desarrollo de software

prototipo es un elemento muy importante para la comunicación con el usuario en la


definición de los requerimientos, pues al revisar la interfaz, el usuario puede refinar sus
necesidades y comunicarlas al desarrollador.Se llama pantalla o interfaz al mecanismo con
el cual interactúa el usuario con el sistema. Cuando se diseñen estas pantallas podrán ser
código html, o ventanas o entradas a modo texto.

Para diseñar el prototipo de la interfaz se consideran los casos de uso planteados en el


diagrama general y se puede construir al mismo tiempo que se detallan los casos de uso. Si
el diagrama general tiene los casos de uso X, Y y Z, en la pantalla principal del sistema
deberán estar las opciones del menú X, Y y Z. Si en la descripción del flujo de un caso de
uso dice “el sistema presenta la pantalla de P...”, en el prototipo deberá haber esa pantalla.
Si en el flujo dice “el usuario oprime el botón M...”, deberá haber un botón M en la
pantalla.

En resumen, se debe cuidar que exista coincidencia entre el detalle de los casos de uso y el
prototipo. Deben coincidir:
• Las opciones del menú y los casos de uso
• Los nombres de las pantallas
• Los nombres de los botones

Ejemplo del prototipo de la interfaz del detalle de caso de uso anterior.

Guadalupe Ibargüengoitia G., Hanna Oktaba 20


Ciclo de Desarrollo de software

Figura 2.5 Pantalla para Dar de alta una vacante

2.5 Requerimientos no funcionales


Los requerimientos no funcionales tienen que ver con los atributos o características que el
cliente solicita para el funcionamiento del software.

Los requerimientos no funcionales pueden ser:


• Interfaz con el usuario: descripción de las características que permitan al software
apoyar al usuario en sus tareas.
• Interfaz externa: relación o conexión con otros sistemas.
• Confiabilidad: solicitud del desempeño respecto a seguridad, tolerancia a fallas y
su recuperación.
• Eficiencia: límites de tiempo de respuesta.
• Mantenimiento: facilidad de comprensión y realización de modificaciones futuras.
• Portabilidad: facilidad de transferencia de un ambiente de ejecución a otro.
• Restricciones de diseño y construcción: las que imponga el cliente.
• Legales y reglamentarios: necesidades impuestas por leyes o reglamentos de otros.

Ejemplo de la descripción de requerimientos no funcionales:


Interfaz con usuarios

Guadalupe Ibargüengoitia G., Hanna Oktaba 21


Ciclo de Desarrollo de software

1. El sistema debe de ser fácil de usar, además deberá tener una interfaz gráfica
agradable y con colores suaves para no dañar en algún sentido visual al usuario.
2. El funcionamiento del sistema deberá estar activo las 24 horas del día y los 365 días
del año.
Confiabilidad
3. Este sistema deberá de tener una alta confiabilidad e integridad con los datos de los
usuarios.
4. Para poder modificar, dar de alta o eliminar datos, el usuario debe de proporcionar
al sistema un nombre de usuario y una contraseña.
Eficiencia
5. La velocidad para mostrarle los datos al usuario debe de ser considerable, lo cual
implica que la pagina no debe de contener imágenes muy pesadas que haga que el
sistema se retarde.
Restricciones de diseño y construcción
6. El sistema de software será construido para funcionar en ambiente Web.
7. El sistema deberá estar codificado en lenguaje de programación C#.

8. La base de datos del sistema de software deberá estar construida con el manejador
de bases de datos SQL-server 2000.
9. Para el desarrollo de este sistema se utilizarán las siguientes herramientas
a. Star UML para modelado del sistema.
b. Visual Studio 2003 (C#) para la codificación.
c. Microsoft Word para hacer la documentación.
d. ASP.NET para el desarrollo del sitio web.
e. SQL-Server para la creación de la Base de Datos.
f. Internet Information Server para la configuración del sitio Web.

Referencias bibliográficas
• Booch G., J. Rumbaugh, I. Jacobson. The Unified Modeling Language User Guide.
Addison-Wesley. 1999
• Coad P. at. al. Object Models, Strategies, Patterns and Applications. Yourdon Press
Computing Series, Prentice Hall. 1995
• SWEBOK. Guide to the Software Engineering Body of Knowlwdge. Trial version
Mayo 2001. www.swebok.org
• Tomayko J. E., Hazzan O. Human Aspects of Software Engineering. Charles River
Media, Computer Engineering Series. 2004.

Guadalupe Ibargüengoitia G., Hanna Oktaba 22


Ciclo de Desarrollo de software

Capítulo 3
Análisis

3.1 Introducción al Análisis


El objetivo del análisis es revisar los requerimientos para crear una descripción abstracta
del sistema a construir, así como entender mejor los requerimientos e identificar omisiones.
El enfoque en la fase de análisis es descubrir qué hará el sistema y no cómo, dejando esta
tarea para la fase de diseño.

El trabajo en el análisis es construir el modelo del análisis que consiste en identificar los
elementos con los que se construirá el sistema y estructurarlos de tal forma que conformen
una primera versión de la arquitectura del sistema. En el caso del análisis orientado a
objetos los elementos del modelo serán clases.

Para documentar los resultados del análisis orientado a objetos se construyen dos vistas: la
vista estática, formada por diagramas de clase que representan los elementos estructurales
y sus relaciones; y la vista dinámica con las interacciones de los objetos de esas clases que
se modela con diagramas de secuencia.

3.2 Vista estática


Para identificar distintos tipos de clases se usan tres estereotipos:
Clases de interfaz (interfaz con el usuario). Son los elementos con los que
interactúa directamente el usuario: las ventanas, páginas, informes, etc. Al
identificar estas clases, se les puede poner al nombrarlas el sufijo IH para
diferenciarlas de las clases de los otros estereotipos.
Clases de control (reglas del negocio o aplicación). Son los elementos que
implementan las reglas del negocio y la lógica de la aplicación.
Clases de entidad (bases de datos, archivos). Son los elementos que guardan la
información para asegurar su persistencia. Estas clases pueden tener en su nombre el
sufijo BD.

Estos tres estereotipos están definidos por UML para facilitar la identificación de las clases
del sistema que se incluyen en los diagramas de clases, que forman la vista estática del
modelo del análisis.

3.2.1 Diagramas de clases

Guadalupe Ibargüengoitia G., Hanna Oktaba 23


Ciclo de Desarrollo de software

Los diagramas de clases se usan para modelar gráficamente la vista estática del software.
Describen los tipos de objetos que son importantes para modelar un sistema y cómo se
relacionan [Arlow]. Contienen los siguientes elementos:

• Clase es la descripción de un conjunto de objetos que comparten los mismos atributos,


operaciones, métodos, relaciones y comportamiento [Rumbaugh]. Se representa
gráficamente por un rectángulo con 3 compartimentos, uno para el nombre, otro para
los atributos y el tercero para los métodos.

Desempleado
Nombre
Dirección
Teléfono
Email
Curriculum

Alta()
Modificar()
Consultar Datos()
Eliminar()
Postularse vacante()

• Relación muestra la dependencia entre dos o más clases. Los tipos principales de
relaciones entre clases son: asociación, agregación y generalización.

• Asociación es una relación estructural que describe ligas entre objetos de las clases.
Se representa por una línea que conecta a las clases asociadas. Esta liga puede tener
adornos como la multiplicidad que denota cuántos objetos de una clase pueden estar
relacionados con objetos de la otra.

Vacante
Nombre
Desempleado Requisitos
Nombre Sueldo
Dirección HoraInicio
Teléfono HoraFin
Email Descripción
Curriculum 1..*
1..* Alta()
Alta() Modificar()
Modificar() ConsultarDatos()
Consultar Datos() Eñliminar()
Eliminar()
Postularse vacante()

Esta asociación entre las clases Desempleado y Vacante indica que uno o mas
Desempleados pueden postularse para una o más Vacantes.

Guadalupe Ibargüengoitia G., Hanna Oktaba 24


Ciclo de Desarrollo de software

• Agregación es un tipo de asociación que denota que los objetos de una clase B
forman parte de un objeto de otra clase A. O sea que una clase A está compuesta por
objetos de la clase B. Se denota por una línea con un rombo del lado de la clase
compuesta, un ejemplo de este tipo de relación, es un libro que está compuesto por
varias páginas.

ClaseA

1
*

ClaseB

• Generalización relaciona a una clase general o abstracta que comparte sus atributos
y operaciones con clases que los especializan. Las subclases heredan todos los
atributos y operaciones de la superclase. La relación entre la clase general y sus
especializaciones se denota por una línea con un triángulo del lado de la general. Un
ejemplo de esta relación es una figura geométrica que puede especializarse en un
triángulo, cuadrado, círculo, etc. A todas estas figuras se les puede medir el
perímetro, el área pero cada una tiene su forma de calcularse.

ClaseGeneral

Clase

Identificación de clases

Para identificar las clases, se analiza cada caso de uso para imaginar qué clases se necesitan
de cada estereotipo. Se recomienda iniciar por la identificación de las clases de control.

Por ejemplo, si se tiene un caso de uso de Administrar Desempleado, seguramente se


necesitará una clase que represente a los desempleados en la aplicación. Entonces se
propone la clase Desempleado como una clase de control. Los atributos de esta clase serán
los datos necesarios de los desempleados y sus métodos pueden ser: alta, modificar,
eliminar, consultar datos, etc.

Guadalupe Ibargüengoitia G., Hanna Oktaba 25


Ciclo de Desarrollo de software

Una técnica para identificar las clases son las tarjetas CRC [Beck, Cunningham]. Las
tarjetas CRC (Clase-Responsabilidad-Colaboración) se usan para determinar tanto las
clases como sus responsabilidades. Para cada responsabilidad se busca la colaboración con
otras clases y así se identifican nuevas clases. Estas tarjetas tienen la forma:

Nombre de clase

Responsabilidad Colaboración

Se llaman tarjetas porque inicialmente se usaban tarjetas de fichas bibliográficas, pero


actualmente se usan tablas.

Proceso para identificar las clases de control:

1. Seleccionar un caso de uso y sus flujos de eventos.


2. Por cada paso de la interacción del actor con el sistema, se analizan los sustantivos más
significativos como candidatos a clases que se requieren para realizar cada acción. Para
cada clase candidata se escribe en una tarjeta su nombre, por ejemplo A. El nombre
debe ser un sustantivo.
3. Cada acción asociada a la clase A, es una responsabilidad de esta clase y se anota en la
columna Responsabilidad. La descripción de una responsabilidad deberá empezar con
un verbo en infinitivo.
4. Se analiza la responsabilidad R y se trata de identificar qué otras clases deben colaborar
con la clase A para poder cumplir con esa responsabilidad.
a. En caso de identificar a las clases B y C como colaboradoras de esa
responsabilidad se apuntan sus nombres en la columna de Colaboración de la
clase A para la responsabilidad R. Para las clases B y C se repite el proceso de
crear sus tarjetas y se anotan las responsabilidades de estas clases requeridas
para la colaboración.
b. En caso de no necesitar de colaboración, la columna de Colaboración se queda
vacía.
5. Se regresa al punto 2 para analizar el siguiente paso de la interacción.
6. El proceso para un caso de uso termina cuando se finaliza la secuencia de pasos en sus
flujos de eventos.
7. Se regresa al punto 1 para seleccionar al siguiente caso de uso.
8. El proceso termina cuando ya se analizaron todos los casos de uso.

Durante este proceso se van refinando y corrigiendo las tarjetas. Cuando ya se tiene un
conjunto de tarjetas para la realización de todos los casos de uso, se construye el diagrama
de clases a partir de éstas.

Construcción del diagrama de clases a partir de las tarjetas CRC:

Guadalupe Ibargüengoitia G., Hanna Oktaba 26


Ciclo de Desarrollo de software

1. Para cada tarjeta se crea una clase en el diagrama, con el mismo nombre, en singular y
empezando con mayúscula.
2. Por cada responsabilidad de la clase, se define el método correspondiente, nombrado
como verbo en infinitivo y en minúsculas.
3. Para cada colaboración entre clases, se dibuja una relación de asociación entre ambas
clases.

Figura 3.3. Diagrama de clases de control.

En la figura 3.3 se muestra el diagrama de clases de control para el sistema de Bolsa de


trabajo. La clase general Visitante se puede especializar en Desempleado por lo que esas
clases tienen una relación de herencia. La clase Desempleado tiene una relación de
agregación con la clase Currículum, porque cada Desempleado tiene un Currículum. La
clase Vacante está asociada con las clases Empresa y Desempleado.

Es necesario remarcar, que este diagrama se irá detallando y modificando conforme se


avanza en el diseño.

Guadalupe Ibargüengoitia G., Hanna Oktaba 27


Ciclo de Desarrollo de software

Al analizar todos los casos de uso, se puede construir uno o varios diagramas de clases de
control para los casos de uso con las clases que son indispensables.

Clases de Interfaz.

Una vez teniendo las clases de control, se identifican las clases de interfaz de usuario. Para
encontrarlas, se revisa el prototipo de interfaz de usuario creado en la fase de
Especificación de requerimientos y se dibuja una clase para cada pantalla. Las clases de
interfaz se podrán implementar con diversas tecnologías como serán ventanas, código html,
jsp, etc. que se decidirán en el diseño.

Clases de Interfaz

<<Pantalla>> <<Forma de enrada>> <<Forma de entrada>> <<Pantalla>> <<Pantalla>>


VerPostuladosIH AltaDesempleadoIH ModificarDesempleadoIH VerDatosPersenalesIH EliminarDesempleadoIH

-Vacante -Desempleado -Desempleado -Desempleado -Desempleado


-Empresa
-Desempleado +Abrir() +Abrir() +Abrir() +Abrir()
+Maximizar() +Maximizar() +Maximizar() +Maximizar()
+Abrir() +Minimizar() +Minimizar() +Minimizar() +Minimizar()
+Maximizar() +Cerrar() +Cerrar() +Cerrar() +Cerrar()
+Minimizar() +CapturarDatos() +CapturarDatos()
+Cerrar()

<<Forma de entrada>> <<Forma de entrada>> <<Pantalla>> <<Pantalla>> <<Pantalla>> <<Pantalla>>


AltaEmpresaIH ModificarEmpresaIH VerDatosEmpresaIH EliminarEmpresaIH PostularVacanteIH PrincipalIH

-Empresa -Empresa -Empresa -Empresa -Vacante


-Desempleado +Abrir()
+Abrir() +Abrir() +Abrir() +Abrir() +Maximizar()
+Maximizar() +Maximizar() +Maximizar() +Maximizar() +Abrir() +Minimizar()
+Minimizar() +Minimizar() +Minimizar() +Minimizar() +Maximizar() +Cerrar()
+Cerrar() +Cerrar() +Cerrar() +Cerrar() +Minimizar()
+Cerrar()

<<Forma de entrada>> <<Pantalla>> <<Pantalla>> <<Pantalla>>


ModificarVacanteIH VerTodasVacantesIH VerDetalleVacanteIH EliminarVacanteIH <<Forma de entrada>>
AltaVacanteIH
-Vacante -Vacante[] -Vacante -Vacante
-Vacante
+Abrir() +Abrir() +Abrir() +Abrir()
+Maximizar() +Maximizar() +Maximizar() +Maximizar() +Abrir()
+Minimizar() +Minimizar() +Minimizar() +Minimizar() +Maximizar()
+Cerrar() +Cerrar() +Cerrar() +Cerrar() +Minimizar()
+Cerrar()

Figura 3.4 Diagrama de clases de Interfaz

Clases de Entidad.
Para identificar las clases de Entidad, se escogen las clases de control cuyos atributos deben
ser guardados. Para cada una de estas clases, se dibuja una clase de tipo entidad, que se
encargue de resguardar estos atributos en una base de datos o un archivo.

Guadalupe Ibargüengoitia G., Hanna Oktaba 28


Ciclo de Desarrollo de software

Figura 3.5 Diagrama de clases de Entidad.

3.3 Vista dinámica


La vista dinámica describe cómo interactúan los objetos para entregar la funcionalidad
requerida del sistema. Hay varios diagramas de UML para representar esta vista. Los
diagramas de secuencia describen la interacción entre los objetos de las clases que
intervienen en cada caso de uso. Los diagramas de estado modelan el cambio de estados de
entidades del sistema.

3.3.1 Diagramas de secuencia


Los diagramas de secuencia muestran la interacción entre los objetos de las clases como
una secuencia de envío de mensajes entre ellos ordenados en el tiempo. Los elementos de
estos diagramas son:

• Objetos son instancias de las clases. Se representan por un rectángulo con el nombre
subrayado de la clase a la que pertenecen. En el diagrama, cada objeto tiene una línea
vertical que representa su línea de tiempo que avanza de arriba – abajo.

Guadalupe Ibargüengoitia G., Hanna Oktaba 29


Ciclo de Desarrollo de software

:vacante

• Mensajes que son enviados de un objeto fuente a otro receptor a través del tiempo.
Representa la invocación del método del objeto receptor. Se modela como una línea con
la flecha del objeto fuente al receptor con el nombre del método sobre la línea el cual
puede o no contener los parámetros del método.

:Vacante :VacanteDB :
BufferedWriter

guardar()

• Actor es el iniciador de la primera invocación del método en la secuencia de mensajes


que se envían los objetos entre si.

Visi tante

En un diagrama de secuencia se coloca arriba a la izquierda al actor o al objeto que inicia la


interacción entre objetos y hacia la derecha se ponen los demás objetos que participan en la
interacción. Los mensajes que los objetos se envían se dibujan con flechas entre las líneas
de vida de los objetos, etiquetados con los métodos. Los mensajes fluyen de izquierda a
derecha y de arriba hacia abajo representando el orden en el tiempo.

Construcción de diagramas de secuencia para los casos de uso

Para cada flujo normal y alternativo de eventos en los casos de uso, se construye un
diagrama de secuencia. Estos diagramas representan la vista dinámica de los casos de uso
especificados en los requerimientos. Para su construcción se parte del detalle de los casos
de uso.

Guadalupe Ibargüengoitia G., Hanna Oktaba 30


Ciclo de Desarrollo de software

Por cada flujo de un caso de uso se identifican las clases de cada tipo necesarias para su
realización y se crea un diagrama de secuencia de la siguiente manera:
1. Se representa al actor que corresponde al caso de uso poniéndolo arriba en el extremo
izquierdo del diagrama.
2. El actor inicia las acciones del caso de uso enviando un mensaje a un objeto de una
clase de interfaz identificada para este flujo.
3. Enseguida se pone uno o mas objetos de clases de control y si es necesario, uno o mas
objetos de entidad.
4. Cada mensaje entre objetos aparece como una flecha dirigida del objeto solicitante al
objeto receptor, etiquetado con el nombre del método correspondiente.
5. Para visualizar el orden temporal del envío de los mensajes, la flecha de un mensaje
posterior se dibuja un poco mas abajo que la del mensaje anterior.

En la figura 3.6, se muestra un diagrama de secuencia para el caso de uso de Consultar


Vacante, en que el Visitante (1) abre un objeto de la clase de interfaz de
VerTodasVacantesIH, (2) consulta los datos del objeto de la clase Vacante, quien (3) los
extrae de un objeto de la clase entidad VacanteDB, se los entrega al objeto de Vacante (4),
quien los pasa a un objeto de la clase de interfaz de VerTodasVacantes (5) para que los vea
el visitante. El actor selecciona una vacante (6) de la interfaz y se muestra su detalle en un
objeto de la clase de interfaz de VerDetalleVacante (7).

3.6 Ejemplo de diagrama de secuencia válido

Es común que al hacer los diagramas de secuencia surjan nuevas clases y métodos no
identificados durante la construcción de los diagramas de clase. Por lo tanto, una vez

Guadalupe Ibargüengoitia G., Hanna Oktaba 31


Ciclo de Desarrollo de software

terminados los diagramas de secuencia para todos los casos de uso, se revisa la consistencia
entre ambos los diagramas de clase y de secuencia. Se modifican los diagramas de clases
según lo encontrado durante la construcción de los diagramas de secuencia.

Los cambios en los diagramas, significan que se está entendiendo mejor el problema y el
proceso se avanza de manera iterativa en la construcción de la solución computacional.

3.3.2 Diagramas de estados

Para modelar el cambio de estados de entidades del sistema, que es otro aspecto de la vista
dinámica, se usan los diagramas de estados de UML.

Un diagrama de estados modela una máquina de estados finitos o autómata, que enfatiza el
flujo de control de un estado a otro. Es una gráfica con nodos que representan estados y
arcos dirigidos que representan transiciones entre los estados a causa de eventos. Los
elementos de estos diagramas son:

• Un estado es la condición de una entidad del sistema. Puede caracterizar a un objeto o


representar a una pantalla, que cambian de estado a causa de eventos. Los estados se
representan por rectángulos con esquinas redondeadas con el nombre del estado.

Principal

• Un evento es algo significativo que ocurre en un momento y que causa el cambio de


estado.

• Una transición modela el cambio de estado a causa de un evento. Se representa por una
flecha que va de un estado a otro. La flecha se puede etiquetar con el nombre del
evento.

• El estado inicial se dibuja como un punto negro.

• El estado final que se denota por un círculo con un punto negro en el centro. Puede
haber varios estados finales o ninguno.

Guadalupe Ibargüengoitia G., Hanna Oktaba 32


Ciclo de Desarrollo de software

Construcción de diagramas de estado para la navegación

Para modelar la navegación en la interfaz de usuario, que es un aspecto dinámico de la


construcción del sistema de software, se usan diagramas de estados. La navegación en la
interfaz de usuario es el cambio de pantallas que ve el usuario a causa de eventos que
cambian el estado del sistema, como por ejemplo, la selección de una opción en un menú
cambia el estado y puede aparecer otra pantalla.

Para construir el diagrama de estados, que modela la navegación, se parte del prototipo de
interfaz de usuario construido en la fase de Especificación de requerimientos. Las pantallas
se representan por estados y los eventos, que ocasionan el cambio de un estado a otro, por
las transiciones entre estados.

Para modelar la navegación en la interfaz de usuario con diagramas de estado, el estado


inicial del diagrama, apunta al estado que representa a la pantalla de principal del sistema.
En esta pantalla, por lo general, se tienen varias opciones para navegar. Cada opción
representa a un evento que puede llevar a otra pantalla. En el diagrama, cada pantalla se
representa por un estado y los eventos etiquetan a las transiciones entre los estados.

Figura 3.7. Diagrama de navegación.

En la figura 3.7 se muestra el diagrama de estados para el sistema de Bolsa de trabajo. El


estado inicial representa a la pantalla Principal. Dependiendo de las opciones del menú que

Guadalupe Ibargüengoitia G., Hanna Oktaba 33


Ciclo de Desarrollo de software

se elijan, se pasa a los estados correspondientes. Si en el estado Principal, el evento es que


se tiene un Registro Erróneo, la transición lleva al mismo estado..

Otro uso de los diagramas de estado, es modelar el orden válido de ejecución de casos de
uso. Por ejemplo, el caso de uso de “Autentificar al usuario” que debe realizarse antes de
cualquier otro caso de uso. Para modelar el orden válido de ejecución de los casos de uso,
se parte del diagrama general de casos de uso. Cada caso de uso se modela como un estado
y el paso de un caso de uso a otro a consecuencia de un evento, se modela por una
transición.

Referencias bibliográficas

• Arlow J., Neustadt I. UML2 and the Unified Process. Practical Object-Oriented
Analysis and Design. 2a edición. Addison Wesley 2005.
• Beck K., Cunningham W., SIGPLAN Notices October 1989, vol. 24 (10).
• Rumbaugh J., Jacobson I., Booch G. “The Unified Software Development Process”.
Addison Wesley 1999.

Guadalupe Ibargüengoitia G., Hanna Oktaba 34


Ciclo de Desarrollo de software

Capítulo 4
Diseño

4.1 Introducción al Diseño


“El diseño de software es un proceso creativo para decidir cómo se construirá el producto
de software” [Humphrey]. Los objetivos del diseño son: identificar y caracterizar las partes
o componentes principales del software, definir su interacción e integración en el producto.
En esta fase el enfoque es definir cómo se construirá el sistema.

El proceso del diseño tiene dos niveles de abstracción: el arquitectónico y el detallado. El


diseño arquitectónico identifica los componentes principales partiendo de la especificación
de requerimientos y del análisis. El diseño detallado especifica en detalle los componentes
tomando en cuenta el ambiente en que se codificará.

4.1.1 Principios del diseño

Algunos principios del diseño [Humphrey] son los siguientes:

Diseñar para el cambio. Como se indicó en los principios de la Ingeniería del software, el
software cambia constantemente, por lo que es fundamental anticiparse a los cambios. Esto
significa que el diseño debe ser flexible para permitir cambios con relativa facilidad.

Diseñar para facilitar el uso del software. Es importante diseñar teniendo en mente a los
usuarios del software y sus aptitudes. Considerar algunos escenarios del uso del software,
puede ayudar en la identificación de los componentes que deberá tener.

Diseñar para facilitar la prueba. Este principio está enfocado en el desarrollador que
probará el sistema. Se identifican los componentes del sistema como unidades que se
puedan probar sin necesidad de incluir a otros componentes.

Diseñar para la reutilización. Una manera de mejorar la productividad del equipo en


proyectos futuros o en ciclos siguientes, es definir partes genéricas que puedan volver a
usarse. Para aplicar este principio, se deben identificar los componentes comunes que se
podrán reutilizar. El reuso incluye no solo el nivel del diseño, sino de código, casos de
prueba, modelos o diagramas.

Para apoyar la aplicación estos principios del diseño, se tienen dos medidas que ayudan a
estructurar e identificar los componentes:

Guadalupe Ibargüengoitia G., Hanna Oktaba 35


Ciclo de Desarrollo de software

• Cohesión. Es el grado de relación entre los elementos que pertenecen a un


componente. Un buen diseño tiene un grado de cohesión fuerte entre los elementos
de sus componentes. El libro de [Pressman] proporciona algunos criterios sencillos
para medir el grado de cohesión de un componente: “Escribir una frase que describa
el objetivo de un componente. Si la frase tiene un solo verbo, el componente tiene
un fuerte grado de cohesión. Si la frase es compuesta, contiene mas de un verbo o
contiene comas, probablemente tiene una cohesión débil y habría que definir un
componente para cada verbo”.
• Acoplamiento. Es el grado de relación entre los componentes. Un buen diseño tiene
un acoplamiento débil entre sus componentes. Esto es, cada componente se
relaciona con otros con pocas interacciones.

Un diseño es bueno si la cohesión de sus componentes es fuerte y el acoplamiento entre


ellos es débil.

Los principios del diseño pueden usarse como criterios para evaluar los diseños. Es
importante aclarar que no existe El buen diseño.

4.2 Arquitectura de software


La arquitectura de software es el diseño del más alto nivel. Consiste en definir cuáles serán
los componentes que formarán el software. La arquitectura debe favorecer el cumplimiento
de los requerimientos funcionales y no funcionales especificados para el producto.

Las cualidades que debe tener la arquitectura son:


• Sencillez. Que sea fácil de comprender y de implementar.
• Extensión. La posibilidad de agregar nuevos componentes.
• Cambio. Que los cambios en los requerimientos no afecten mucho a la arquitectura.

El modelo de capas, es la base de la arquitectura de un sistema cuando es posible


estructurar la solución en grupos de tareas, donde cada grupo tiene un nivel de abstracción
particular.

Una capa es una abstracción que toma el resultado de la capa inferior, efectúa su función y
entrega ese resultado a la capa superior. La regla en este modelo es que cada capa se
comunica solamente con las capas adyacentes.

Para definir la arquitectura se usarán las siguientes capas:


Capa de Presentación. En esta capa se ponen los elementos con los que interactúa
directamente el usuario: las ventanas, páginas, informes, etc.
Capa Lógica de la aplicación. Son los elementos que implementan las reglas del
negocio y la lógica de la aplicación.
Capa de Almacenamiento. Contiene los elementos que guardan la información
para asegurar su persistencia tales como bases de datos o archivos.

Guadalupe Ibargüengoitia G., Hanna Oktaba 36


Ciclo de Desarrollo de software

Una vez definida la arquitectura del producto de software, se representa con diagramas de
paquetes de UML.

4.2.1 Diagrama de paquetes

Un paquete es un mecanismo general de UML para organizar elementos en grupos. Los


paquetes sirven para representar las capas de la arquitectura.

Un paquete se representa con una carpeta con su nombre. Los paquetes pueden contener
otros paquetes, clases, interfaces, código html, etc. Los elementos de cada paquete deben
tener una alta cohesión y bajo acoplamiento con los elementos de otros paquetes.

Un diagrama de paquetes contiene los paquetes y las relaciones entre ellos.

Tipos de relaciones entre paquetes:


Dependencia (se representa por una flecha punteada). Un paquete B depende de otro
paquete A, si un cambio en A, puede afectar al que depende de él, o sea el B. En este caso,
la flecha de dependencia parte de B y apunta al paquete A.

Asociación (se representa por una línea continua). Establece una relación entre dos
paquetes que requieren de los servicios uno del otro. Esta relación es bidireccional.

Generalización (se representa por una línea continua con triángulo transparente que apunta
hacia el paquete más general). Un paquete representa los aspectos más generales y otro los
especializa, es la relación de herencia.

Realización (se representa por una línea punteada con triangulo transparente que apunta
hacia el paquete que va a ser realizada por otro). Es un contrato que promete que un
paquete va a ser implementado por otro.

La arquitectura de 3 capas se representa por paquetes que son una refinación de las capas
del Análisis:
• Capa de Presentación. Esta capa puede contener uno o varios paquetes que
contengan la interfaz de usuario. Por ejemplo, el paquete de la interfaz en el
servidor y el paquete con la interfaz del cliente. Los paquetes de la capa de
Presentación tienen el sufijo IH.
• Capa de Lógica de la aplicación. En general, esta capa contiene varios paquetes,
uno para cada funcionalidad del sistema. Estos paquetes pueden tener relaciones de
dependencia, asociación o generalización.
• Capa de Almacenamiento. En este paquete puede estar la base de datos o archivos
en uno o más paquetes.

Las relaciones entre estos tres paquetes serán de asociación del paquete de nivel inferior
(Almacenamiento), al intermedio (Lógica de la aplicación) y de éste al superior
(Presentación).

Guadalupe Ibargüengoitia G., Hanna Oktaba 37


Ciclo de Desarrollo de software

En la figura 4.1 se muestra un diagrama con las 3 capas de la arquitectura. Los paquetes de
la capa de Presentación son DesempleadosIH, VacantesIH y EmpresaIH. Los siguientes
paquetes pertenecen a la capa de Lógica de la aplicación, las relaciones que se muestran
entre estos paquetes son dependencias. Por ejemplo el Paquete Postulaciones depende de
Vacantes y de Desempleado. El paquete de Base de Datos contiene la capa del
Almacenamiento.

Fig. 4.1 Ejemplo de diagrama de paquetes.

4.2.2 Diagrama de distribución

Un sistema es distribuido si se ejecuta en más de una máquina y sus componentes se


encuentran distribuidos en ellas. Los diagramas de distribución representan los
componentes que se instalarán en cada máquina y las conexiones entre ellos. Para mostrar
este aspecto de la arquitectura, UML tiene los diagramas de distribución (deployment).

Guadalupe Ibargüengoitia G., Hanna Oktaba 38


Ciclo de Desarrollo de software

Los elementos de estos diagramas son: los nodos y las conexiones entre ellos.

Un nodo es un elemento físico que existe y representa un recurso computacional [Booch].


Se representa por un cubo que debe nombrarse.

Las conexiones son relaciones que representan las comunicaciones entre los nodos. Pueden
etiquetarse con un protocolo de comunicación.

En la figura 4.2 se muestran los nodos de un sistema en web. La conexión entre servidor y
el cliente es por el protocolo http.

Figura 4.2 Ejemplo de diagrama de distribución

Proceso para definir la arquitectura:


1. Seleccionar el tipo de arquitectura del software según la aplicación. Inicialmente se
puede elegir la arquitectura de tres capas. Posteriormente, se puede revisar otras
arquitecturas alternativas.
2. Identificar los paquetes para la arquitectura del sistema.
3. Construir el diagrama de paquetes.
4. En el caso de que sea un sistema distribuido, identificar la lógica de la distribución.
5. Construir el diagrama de distribución con los nodos y sus conexiones.

4.3 Construcción de componentes


Para diseñar en detalle el sistema se usarán componentes a fin de organizar el diseño en
piezas manejables.

Un componente es como una caja negra con un comportamiento bien definido que
encapsula una cierta parte del diseño y que proporciona interfaces para interaccionar con él.
Los componentes tienen interfaces de entrada que especifican lo que se debe proporcionar
para su ejecución e interfaces de salida que especifican lo que entregan al ejecutarse.
Pueden contener otros componentes relacionados entre sí por dependencias. Hay varios
tipos de componentes:[Arlow]
• Subsistemas que son formas de descomponer sistemas grandes en unidades
jerárquicas
• De construcción, definen un conjunto de cosas para organizar la construcción.
• De entidad, son componentes persistentes que representan algún concepto que debe
almacenarse.

Guadalupe Ibargüengoitia G., Hanna Oktaba 39


Ciclo de Desarrollo de software

• Proceso, es un componente basado en una transacción.


• Etc.

Un diagrama de componentes muestra la organización y las dependencias entre un conjunto


de componentes. Cubre la vista de implementación estática y se relaciona con los
diagramas de clase puesto que un componente puede contener una o más clases. De hecho
se puede construir un componente para cada caso de uso, de forma que contenga las clases
de las capas de presentación, lógica y de almacenamiento correspondientes.

Algunos componentes pueden contener lo específico de la plataforma de implementación.

A continuación se muestra el diagrama de componentes del sistema.(Figura 4.3)

Figura 4.3. Diagrama de componentes

El desarrollo de software basado en componentes favorece la reutilización de componentes


y facilita el cambio.

4.4 Diseño de la base de datos


A partir de las clases de tipo persistente de la capa de almacenamiento, se diseña la base de
datos. Para modelar la base de datos se usan los conocimientos y técnicas de un curso de
Bases de Datos.

Guadalupe Ibargüengoitia G., Hanna Oktaba 40


Ciclo de Desarrollo de software

En el diagrama de Entidad-Relación, se mapea cada clase persistente a una Entidad. Los


atributos de las clases se convierten en los atributos de las Entidades. Las relaciones entre
las Entidades se construyen a partir de las relaciones entre clases.

4.4.1 Conversión del diagrama de clases al modelo de datos de una


base de datos relacional

La estructura de una base de datos relacional es muy sencilla, pero esta sencillez dificulta el
proceso de representar objetos completos.

Cada clase del diagrama de clases se convierte en el esquema de una tabla en la base de
datos relacional (figura 4.4). Se puede utilizar el mismo nombre de la clase para la tabla,
aunque se acostumbra que ese nombre esté en plural. Esta tabla tendrá como campos los
atributos de la clase, es decir, cada atributo se convierte en una columna de la tabla.

Figura 4.4 Clase Empresa.

La clase Empresa del diagrama de clases se transforma en un esquema como el mostrado


en la figura 4.5.

Figura 4.5 Relación Empresas.

En sistemas manejadores de bases de datos relacionales la visibilidad de cada atributo es


siempre es pública, así que esta parte se puede ignorar. Para el dominio de los atributos, es
necesario tener una forma de relacionar los tipos UML con los tipos de datos de SQL. Es
importante tratar de que las transformaciones sean sencillas, por ejemplo un tipo cadena en

Guadalupe Ibargüengoitia G., Hanna Oktaba 41


Ciclo de Desarrollo de software

UML podría traducirse como un VARCHAR (254) en SQL. Para tipos enumerados, y sobre
todo si no se tienen dominios, se puede crear una tabla para el tipo y poner los valores en
ella, pues de esta forma se podría adicionar nuevos valores cuando se requiera. Una
sugerencia de transformación es la siguiente:

Tabla 4.1. Equivalencia de tipos entre UML y SQL.

Los manejadores relacionales dependen completamente de identidad explícita, por lo que


no puede existir un identificador de objeto que no sea un valor de una columna de la tabla,
ni puede haber apuntadores a valores o renglones. Transformar la identidad explícita de
atributos marcados con la propiedad {OID} significa poner los atributos como columnas y
establecer la restricción de llave primaria sobre tales columnas. Una llave primaria en el
campo de las bases de datos es el conjunto mínimo de atributos que definen de manera
única a todo el renglón de la tabla.

La transformación de la identidad implícita a identidad relacional explícita requiere agregar


una columna de tipo entero a la tabla con la restricción de unicidad. Para los atributos
marcados con {OID alterno}, sólo es necesario crear los atributos como columnas y poner
restricciones de unicidad. Si el atributo no tiene la propiedad {nulo} significa que, en la
definición de la columna correspondiente, se debe establecer la restricción de rechazar
valores nulos para tal columna.

En la creación de tablas no hay nada con respecto a las operaciones, sin embargo existe la
posibilidad de representar conducta en el esquema a través de procedimientos almacenados.

Conversión de interfaces.

Ya que una interfaz contiene operaciones únicamente es necesario implementar los


procedimientos almacenados correspondientemente, siempre u cuando sean adecuados para
ejecutarse en el servidor de base de datos.

Conversión de asociaciones.

Una base de datos relacional contiene tablas, no asociaciones, por lo que las asociaciones
deben integrarse a las tablas a través de columnas especiales. En la conversión de una
asociación binaria a un esquema relacional se debe utilizar el concepto de llave externa.
Una llave externa, es un conjunto de columnas cuyo valor debe estar en la llave primaria de
la tabla con la que se está conectando.

Guadalupe Ibargüengoitia G., Hanna Oktaba 42


Ciclo de Desarrollo de software

Figura 4.6. Relación de asociación entre dos clases

En el ejemplo de la figura 4.6, se está especificando que una empresa coloca de 1 a varias
vacantes, y que cada vacante es colocada por una y sólo una empresa.

Las características de la multiplicidad, en la clase relacionada, se dividen en dos aspectos


de interés para la transformación relacional: en qué tabla generar columnas y cómo generar
las restricciones de nulidad sobre las columnas. Si la multiplicidad contiene un máximo de
1 entonces la tabla correspondiente a esa clase tendrá columnas como llave primaria que se
incluirán en la tabla correspondiente a la clase asociada como llave externa.

Figura 4.7. Llaves externas.

Notar en la figura 4.7, que en la tabla Empresas se define nombre como llave primaria
(PK) y en la tabla Vacantes se tiene nombreE como llave externa (FK) con lo cual se
especifica que nombreE debe ser el nombre de alguna empresa en la tabla Empresas y si
es el mismo ambas tuplas están relacionadas. En cada vacante sólo hay una nombreE, es
decir cada vacante es colocada por una empresa. Como el nombre de empresa se puede
repetir en la llave externa se tiene que cada empresa puede colocar más de una vacante.

Si la multiplicidad contiene un cero (0..*,*,0..1) entonces se pueden permitir valores nulos


en la llave externa.

Guadalupe Ibargüengoitia G., Hanna Oktaba 43


Ciclo de Desarrollo de software

Si la multiplicidad es de varios a varios como en la figura 4.8, no se puede representar


directamente en el esquema relacional, es necesario crear una tabla en la base de datos para
esta asociación, como se muestra en la figura 4.9.

Figura 4.8. Asociación n: n

La asociación varios a varios entre Desempleados y Vacantes se convierte en una


relación uno a varios entre Desempleados y DesempleadosVacantes más una
relación muchos a uno entre DesempleadosVacantes y Vacantes como se muestra
en la figura 4.9.

Figura 4.9. Tablas para la asociación n: n

Conversión de relaciones de agregación

La agregación corresponde directamente a una llave externa en la tabla dependiente con


acciones de actualización y borrado. Por ejemplo, cuando se borra un renglón en la tabla
dueña, debe borrarse los renglones asociados a su llave primaria en todas las tablas
dependientes, esto es un borrado en cascada.

Guadalupe Ibargüengoitia G., Hanna Oktaba 44


Ciclo de Desarrollo de software

Figura 4.10. Relaciones de agregación entre clases.

Todo desempleado tiene un currículo y la información de éste se encuentra en la tabla


Curriculum. Se crea la tabla para la información del currículo debido a que en una
base de datos no puede haber columnas con atributos no-atómicos.(Figura 4.10)

Figura 4.11. Tablas para la relación de agregación entre clases.

En este acaso, se agregó a cada tabla Currículum, figura 4.11, un identificador


para facilitar la manipulación de las llaves. De tal manera que en la tabla Desempleados
se tiene un identificador de currículo como llave externa que debe corresponder con el
identificador de algún currículum en la tabla de ellos.

Conversión de relaciones de generalización

Se crea una tabla para cada clase en la jerarquía de herencia, incluyendo las clases
abstractas, después se crean las llaves externas para cada relación de generalización. Si la
llave primaria de la superclase consta de varias columnas, se deben crear esas mismas
columnas en cada subclase.

Guadalupe Ibargüengoitia G., Hanna Oktaba 45


Ciclo de Desarrollo de software

Figura 4.12. Jerarquía de clases.

Tomando como ejemplo la jerarquía de herencia mostrada en la figura 4.12 se tienen las
tres tablas mostradas en la figura 4.13. En tabla usuarios se tiene como llave primaria un
identificador para cada usuario, éste se utiliza como llave externa en cada una de las tablas
que representa a cada una de las subclases.

Figura 4.13. Tablas para una jerarquía de clases.

Guadalupe Ibargüengoitia G., Hanna Oktaba 46


Ciclo de Desarrollo de software

Lo importante en la conversión del modelo de datos UML al esquema relacional es ser muy
sistemático en el método. Si se entiende como mapear cada concepto UML en conceptos
relacionales es posible representar fácilmente la mayoría de los aspectos del modelo.

Referencias bibliográficas

• Arlow J., Neustadt I. UML2 and the Unified Process. Practical Object-Oriented
Analysis and Design. 2a edición. Addison Wesley 2005.
• Booch G., Rumbaugh J., Jacobson I. “The Unified Modeling Languaje. Users guide”.
Addison Wesley 1999.
• Humphrey Watts S., “Introduction to Team Software Process”, SEI Series in Software
Engineering, Addison Wesley, 2000.
• Jacobson I., Booch G., Rumbaugh J. “The Unified Software Development Process”.
Addison Wesley 1999.
• Pressman

Guadalupe Ibargüengoitia G., Hanna Oktaba 47


Ciclo de Desarrollo de software

Capítulo 5

Construcción

5.1 Diseño detallado de clases


En el diseño detallado se completan los diagramas de clases incluyendo los detalles
necesarios para su codificación. El nivel al que se detallan estos diagramas debe ser
suficiente para que se construya su código.

El detalle de las clases de control incluye: nombres y tipos de todos los atributos, para los
métodos se especifican los parámetros con sus tipos y el tipo del valor de retorno. Si algún
método requiere para su implementación de un algoritmo más complejo, éste se especifica
en seudo-código. La Figura 5.1. muestra un ejemplo de diseño detallado de una clase.

Figura 5.1 Ejemplo del diseño detallado de una clase.

No todas las clases se codifican en un lenguaje de programación. Por ejemplo, en una


aplicación web, las clases de interfaz pueden implementarse como código html. Por otro
lado, a partir de las clases de entidad, se diseña la base de datos.

En los paquetes se incluyen las clases necesarias del ambiente de programación o las
bibliotecas disponibles para la construcción de las clases.

Algunas herramientas de diagramación de UML ayudan a completar el diseño detallado a


partir de los diagramas de clases, generando un esqueleto de código. Cuando se tienen
dichas herramientas la tarea de codificar consiste en detallar los diagramas y completar los
esqueletos con el código. Otra ventaja de estas herramientas es que se mantiene la

Guadalupe Ibargüengoitia G., Hanna Oktaba 48


Ciclo de Desarrollo de software

integridad entre los diagramas y el código, por lo que los cambios en uno se reflejan en los
otros.

Figura 5.2 Diagrama de clases detalladas

5.2 Estándares de codificación


El código de un lenguaje de programación se genera con el fin de que sea compilado y
ejecutado por la máquina. Sin embargo, este mismo código también tiene que ser
comprendido por los seres humanos. En primer lugar debe de entenderlo el propio autor del
programa aunque pase un mes desde que lo creó por primera vez. También deben de
entenderlo otros desarrolladores, que forman parte del equipo, o gente que dará el
mantenimiento al programa. Con tal objetivo se establecen estándares de codificación y
documentación de sistemas de software.

Un estándar de codificación es un conjunto de normas para hacer los programas más


legibles. Define las convenciones para escribir los encabezados de los paquetes o clases,
para nombrar clases, atributos, métodos y parámetros, para estructurar de manera legible las
instrucciones de control, manejo de errores etc.

Guadalupe Ibargüengoitia G., Hanna Oktaba 49


Ciclo de Desarrollo de software

Por ejemplo, un estándar de comentario de encabezado de una clase puede pedir que éste
contenga los siguientes elementos: el propósito de la clase, sus autores, la fecha de
creación, su versión actual y referencias cruzadas a otras clases o archivos.

Se recomienda usar estándares de codificación ya existentes para el lenguaje de


programación que se va a usar. En su defecto, se sugiere generar el estándar propio
acordado por el equipo de desarrollo y documentarlo.

5.3 Revisión de código y programación entre pares


Para evitar defectos en el código que se genera a partir del diseño detallado, [Humphrey]
propone leer el código antes de la compilación para eliminar defectos de forma temprana.
Es una actividad que es poco practicada por las prisas de compilar para encontrar los
defectos en el código recién escrito. Pero al compilador se le escapan los defectos de la
lógica del programa. La lectura detenida del código por una persona antes de compilar
puede detectar esa clase de defectos y corregirlos de manera oportuna.

Una alternativa para generar el código y leerlo a la vez por dos personas, es la
programación entre pares [Beck]. La idea principal de la programación entre pares es que
el código se escribe entre dos personas sentadas frente de una sola máquina. Un miembro
de la pareja tiene el control sobre el teclado y el ratón y es el que está codificando. La otra
persona lee lo que se va escribiendo, analiza el código, revisa la lógica y la sintaxis, y
comenta posibles alternativas y errores a su pareja. Este trabajo es dinámico, los roles
dentro de la pareja pueden cambiar constantemente.

Con esta práctica se hacen revisiones constantes al código pues quien no tiene el control del
teclado, está leyéndolo en cuanto se teclea y detecta errores que sería difícil y tardado de
encontrar posteriormente.

Aunque aparentemente con la programación entre pares se avanza mas lento, la práctica ha
demostrado que esto no necesariamente es verdad y que el código que se obtiene está mas
libre de errores lo que hace que tenga mejor calidad.

5.4 Pruebas unitarias


Las pruebas unitarias consisten en probar cada unidad lógica de código que se va
terminando. En la orientación a objetos, la unidad lógica de prueba es la clase. Se deberá
asegurar la calidad de las clases probándolas detenidamente.

Las clases se prueban a través de la invocación de sus métodos. Para probar los métodos de
una clase se definen casos de prueba. Un caso de prueba de un método consiste en definir
un conjunto representativo de valores para los parámetros del método y el valor del

Guadalupe Ibargüengoitia G., Hanna Oktaba 50


Ciclo de Desarrollo de software

resultado esperado para ese conjunto. Para cada método se pueden definir uno o más casos
de prueba según la complejidad del método.

Para hacer las pruebas unitarias de clases cada ingeniero define su Plan de las pruebas
unitarias para las clases que está construyendo.

En el Plan de pruebas unitarias se define: las clases que se probarán, los métodos y los
casos de prueba para cada método. Una forma de especificar este plan es hacer una tabla
con 4 columnas:
• La clase que se probará.
• Método a probar.
• Los casos de prueba con los conjuntos de valores para los parámetros para cada
método.
• El resultado esperado de cada caso de prueba.

Clase Método Caso de


Resultado
Prueba
Esperado
UsuarioRegistrado setNombre(nombre) miNombre
Guarda el
nombre
UsuarioRegistrado setDireccion(calle,colonia, miCalle Guarda
delegación, CP) 1 los
miColonia campos
1 de la
MiDelegacion direccion
12345

Figura 5.3 Ejemplo de Plan de pruebas unitarias.

Realización de la prueba unitaria según el Plan

Para realizar la prueba unitaria de una clase, se crea un objeto de esa clase. Se invoca cada
método a probar con los parámetros definidos en sus casos de prueba. Si el resultado
obtenido coincide con el esperado, el método pasa esa prueba. Si no coincide, se revisa el
código del método para encontrar la causa del defecto y corregirlo. Se vuelve a aplicar el
mismo caso de prueba hasta que pase. Cuando una clase pasa todas las pruebas definidas en
el Plan de pruebas unitarias, es aceptada.

Técnicas para definir los casos de prueba.

Para definir los casos de prueba se usan dos técnicas: las de caja blanca (transparente) y
las de caja negra. En las pruebas de caja blanca se toma en cuenta la estructura del código
de un método y se busca que durante las pruebas cada instrucción se ejecute al menos una
vez. Las de caja negra, consideran al código del método como un todo oculto, verificando
que para cada conjunto de valores de los parámetros se obtenga el resultado esperado.

Guadalupe Ibargüengoitia G., Hanna Oktaba 51


Ciclo de Desarrollo de software

A continuación se explican en que consisten ambos tipos de prueba y algunas técnicas para
planear ese tipo de pruebas.

5.4.1 Pruebas de caja blanca

Las pruebas de caja blanca también se conocen como pruebas estructurales. Se revisa la
estructura lógica de la unidad a probar tratando de definir casos de prueba que permiten
ejecutar por lo menos una vez, cada una de las instrucciones del método.

Una técnica que se usa como guía para saber cuántos casos de prueba se deben definir para
recorrer todas las instrucciones de la unidad por lo menos una vez, es la complejidad
ciclomática de McCabe. La complejidad ciclomática se define como el número de
condiciones encontradas en el código más 1. Una condición es un punto de decisión, como
por ejemplo if, while, for, etc.

Para planear las pruebas de caja blanca usando la complejidad ciclomática se determina el
número de casos de prueba necesarios usando la fórmula de la complejidad ciclomática.
Según este número, se definen los casos de prueba como conjuntos de valores de las
variables, que permitan recorrer las diferentes trayectorias del código. Para cada condición,
se eligen valores de las variables para que sea en una ocasión verdadera y en otra falsa. Para
cada conjunto de valores se define el resultado esperado.

Ejemplo de un plan de pruebas con la complejidad ciclomática:

En la figura 5.4, se muestra un seudocódigo de un método que revisa si un alumno ya tiene


calificación para un curso c1. Se tiene una condición (while) para buscar en todos los cursos
calificados del alumno y dos condiciones (if) para identificar si fue o no calificado. La
complejidad ciclomática de este código es por lo tanto de 4. Los casos de prueba para este
código serían:
1. No hay cursos llevados por el estudiante (la condición del while es falsa)
2. Hay un solo curso y no coincide con c1 (la condición del while es verdadera y del
primer if falsa)
3. Hay un curso, coincide con c1 y ya está calificado (las condiciones del while y de
los dos if son verdaderas)
4. Hay un solo curso, coincide con c1 y no está calificado (las condiciones del while
y del primer if son verdaderas y la del segundo if es falsa)

Guadalupe Ibargüengoitia G., Hanna Oktaba 52


Ciclo de Desarrollo de software

//Revisar si un estudiante ya tiene calificado un curso con anterioridad


Public boolean yaCalificado (Curso c1, cursos) {
1 Boolean calificado = falso;
// cursos es la lista de los cursos llevados por el estudiante
2 while (existen cursos del estudiante por revisar) {
// se revisan todos los cursos llevados por el estudiante
cursos c2 = otro curso llevado
3 if curso1 = curso2 {
4 if (c2.getCalificacion no es “ null”){
5 calificado = true;
6 break;
7 } // fin del segundo if
8 } // fin del primer if
9 } // fin del while
10 return calificado;
11 }

Figura 5.4 Ejemplo de un seudocódigo

El plan de prueba para este método es:

Guadalupe Ibargüengoitia G., Hanna Oktaba 53


Ciclo de Desarrollo de software

# Casos de prueba Resultado


esperado
No hay cursos llevados por el estudiante (la condición del while es
1 falsa) falso
falso
2 Hay un solo curso y no coincide con c1 (la
condición del while es verdadera y del primer if
falsa)
Hay un solo curso, coincide con c1 y ya está calificado ( las
3 condiciones del while y los dos if son verdaderas) verdadero
falso
4 Hay un curso, coincide con c1 y no está calificado
(las condiciones del while y del primer if son
verdaderas y la del segundo if es falsa)

5.4.2 Pruebas caja negra

Este tipo de prueba, también conocida como prueba funcional, revisa que la unidad cumpla
con la funcionalidad esperada sin considerar el detalle del código. Para definir los casos de
prueba, se establecen los posibles resultados esperados de la unidad y se identifican los
conjuntos de valores de los parámetros, para que se generen estos resultados.
Una técnica para diseñar los casos de prueba de caja negra son las Tablas de decisión. Las
tablas de decisión ayudan a describir combinaciones de datos de entrada que generan
diferentes salidas.

Una tabla de decisión tiene 2 secciones:


Condiciones de parámetros de entrada: En la parte superior de la tabla se define la lista
de condiciones de los parámetros de entrada y sus posibles combinaciones de valores cierto
y falso.

Resultados esperados: Las dos secciones de abajo especifican los resultados esperados
para las combinaciones de valores de las condiciones de entrada. Se marca con X que
resultado se espera para cada posible combinación de valores de los parámetros.

En la figura 5.5 se muestra la tabla de decisiones para el ejemplo de la figura 5.3.

Guadalupe Ibargüengoitia G., Hanna Oktaba 54


Ciclo de Desarrollo de software
Condiciones de parámetros
de entrada
c1 es uno de los cursos del verdadero verdadero falso
estudiante
c1 tiene calificación verdadero falso falso
Resultados esperados
El método yaCalificado sea X
verdadero
El método yaCalificado sea X X
falso

Figura 5.5 Ejemplo de tabla de decisión

El Plan de pruebas unitarias de caja negra, creado a partir de la tabla de decisión, es una
tabla que tiene como casos de prueba la combinación de condiciones de valores cierto y
falso para los parámetros de entrada y los resultados esperados. En la figura 5.6 se muestra
el Plan de pruebas para la tabla de decisiones.

# Casos de prueba Resultado


esperado
c1 está en los cursos y c1 tiene calificación
1 verdadero
falso
2 c1 está en los cursos y no tiene calificación
c1 no está en los cursos y no tiene calificación
3 falso

Figura 5.6 Plan de prueba caja negra.

Las tablas de decisión es una técnica que se puede emplear durante el desarrollo del
software, en diferentes etapas, cuando hay combinaciones de condiciones para ayudar en la
toma de decisiones.

Efectuar las pruebas

Para efectuar las pruebas unitarias, se recomienda primero ejecutar los casos de prueba de
caja negra. Posteriormente se agregan otros casos de prueba que permitan revisar la
estructura, según la técnica de caja blanca.

Muchas veces al querer probar una operación o método requiere de otros que no están
disponibles. Para simular su comportamiento se declaran métodos sustitutos llamados
Stubs. Los sustitutos no hacen nada excepto regresar el valor esperado, por lo que se puede
programar una pequeña interfaz por el cual el programador simula que se invocó el método
y que eventualmente proporciona el resultado esperado.

Guadalupe Ibargüengoitia G., Hanna Oktaba 55


Ciclo de Desarrollo de software

Otro tipo de sustituto es un Driver que es un programa que inicializa


variables no locales y los parámetros para activar a la unidad que se
está probando.

Referencias bibliográficas

• Beck K., Extreme Programming Explained, Addison Wesley, 2000.


• Humphrey Watts S., “Introduction to Team Software Process”. SEI Series in Software
Engineering, Addison Wesley, 2000.
• Pressman R.S. Ingeniería del Software. Un enfoque práctico. McGraw Hill.
• Sommerville I. Ingeniería de Software. 6ª Edición, Addison Wesley, 2002.

Guadalupe Ibargüengoitia G., Hanna Oktaba 56


Ciclo de Desarrollo de software

Capítulo 6
Integración y prueba del sistema

6.1 Integración del sistema


El objetivo de la integración es unir todos los componentes construidos y probados para
comprobar que funcionen bien juntos.

Para hacer la integración, se usa como guía el diseño arquitectónico, y se asegura que se
tienen todos los componentes definidos en el diseño en la última versión aprobada.

Cuando ya se tienen todos los componentes en los paquetes de la arquitectura, se planea


como se irán integrando en un sistema completo.

Se planea la integración identificando el orden en que se unirán los paquetes de la


arquitectura. A esto se le conoce como integración del sistema. Además, se proponen las
pruebas que se aplicarán para verificar la correcta interacción entre estos componentes.

Estrategias para la integración del sistema

Para definir el orden de integración de los elementos del sistema, se puede seguir alguna de
estas estrategias [Binder]

• Estrategia de paquetes. La idea es hacer las integraciones según los paquetes del
diseño. Por ejemplo, se integran todos los elementos del paquete de interfaz de usuario
para un actor.

Este enfoque tiene la ventaja, de que se integran los componentes de un paquete y


posteriormente se unen a otros paquetes ya integrados, siguiendo la arquitectura.

• Estrategia por funcionalidad o casos de uso. La idea es integrar los paquetes de las
tres capas que corresponden a la realización de un caso de uso. Se puede hacerlo para
varios casos de uso en paralelo, cuando no hay dependencia entre ellos.

No existe una estrategia adecuada para todos los sistemas, decidir cuál usar es decisión del
proyecto y el nivel de diseño efectuado.

El elemento del paquete que no dependa de otros, es el primero que se integra. En el caso
de las clases, una clase depende de otra si invoca alguno de sus métodos. Bajo esta regla, se
puede crear una gráfica de dependencias entre clases que sirve de guía para definir el orden
de integración.

Guadalupe Ibargüengoitia G., Hanna Oktaba 57


Ciclo de Desarrollo de software

Al integrar los componentes se identifican los métodos que se invocan entre clases. Estos
métodos deben ejecutarse para comprobar que el paso de parámetros y los resultados
devueltos son los adecuados.

6.2 Prueba del sistema


En la prueba del sistema ya integrado, se trata de comprobar que el sistema cumple con
todos los requerimientos establecidos, tanto los funcionales como los no funcionales.

Como es muy difícil probar al cien por ciento todos los aspectos del sistema, se debe
planear a qué se le dará prioridad. Por ejemplo, se puede decidir primero asegurar que
cumple con sus funciones, luego evaluar la usabilidad, posteriormente comprobar el
sistema bajo condiciones de estrés y medir el desempeño.

Se prueban los siguientes aspectos definiendo casos de prueba para:


• La instalación del sistema.
• Funcionalidades según los casos de uso
• La usabilidad del sistema con la participación de usuarios reales.
• Se deben incluir pruebas de los otros requerimientos no funcionales como:
• Rendimiento
• Robustez – recuperación de errores de hardware
• Tiempo de respuesta
• Capacidad de carga (memoria, accesos)

Técnicas para la prueba funcionales del sistema.

Al probar el sistema se debe comprobar que cumplan con los requerimientos y asegurar que
todas las funcionalidades están cubiertas.

Una técnica para documentar lo que se quiere probar son las tablas cruzadas. Una tabla
cruzada contiene en los renglones los requerimientos y en las columnas los componentes
del sistema. En el interior de la tabla se pone “X” si el requerimiento “i” está cubierto en el
componente “j” para indicar en qué componentes están cubiertos los requerimientos.

requerimientos/componente componente 1 componente 2 componente 3


Req. 1 X X
Req. 2 X
Req. 3 X
Req. 4 X
Figura 9.1 Ejemplo de tabla cruzada.

Guadalupe Ibargüengoitia G., Hanna Oktaba 58


Ciclo de Desarrollo de software

De esta manera se tiene una lista de comprobación de que se están cumpliendo todos los
requerimientos, pues ningún renglón deberá estar vacío, lo que indica que al menos algún
componente del sistema cubre ese requerimiento.

Por otro lado, al revisar las columnas ninguna estará en blanco, lo que significa que los
componente cooperan con al menos un requerimiento.

Esta tabla documenta qué componentes cubren a qué requerimientos, lo que es útil para
mantener el sistema al hacer cambios a los requerimientos.

Planeación de las pruebas del sistema

El plan de pruebas que debe incluir:


• Qué se va a probar.
• En qué orden.
• El material de prueba, esto es, el componente a probar, los datos de prueba, el
software que se necesita.
• El resultado esperado para cada dato de prueba.
• Responsable de la prueba, los participantes en la prueba, la fecha y lugar en que se
hará la prueba.
• Plantilla para el informe de los resultados obtenidos indicando el número de
defectos encontrados.

Efectuadas las pruebas, se corrigen los defectos encontrados. Se vuelven a aplicar pruebas,
conocidas como pruebas de regresión. Las pruebas de regresión sirven para detectar
defectos al hacer cambios a componentes ya probados. Al iniciar un nuevo ciclo de
desarrollo, se generan nuevos componentes o se modifican los que se tenían para incluir
nuevas funcionalidades o características. Esos componentes pueden ocasionar fallas en lo
que ya funcionaba por efectos laterales o nuevas interacciones.

Si el sistema pasa todas las pruebas, se libera y entrega al cliente.

6.3 Manuales
Al construir un sistema, siguiendo el ciclo de desarrollo, se ha generando la documentación
del sistema para los desarrolladores en siguientes ciclos o para el mantenimiento. Sin
embargo, generalmente se requiere de manuales para otros involucrados en el sistema,
principalmente sus usuarios.

• Los manuales deberán estar escritos en el lenguaje del lector a quien está dirigido.

Guadalupe Ibargüengoitia G., Hanna Oktaba 59


Ciclo de Desarrollo de software

Manual de usuario
Este manual debe contener información que permita usar el sistema. Es un documento
electrónico o impreso que describe la forma de uso del software, organizado con base a la
interfaz de usuario. El contenido debe incluir:
• Cómo se entra, qué aparece en la interfaz, qué se espera en cada opción o campo,
qué responderá el sistema, cómo resolver problemas a la hora de la ejecución.

Este manual también podría contener información sobre la instalación que pueda ser útil al
usuario.

Manual de operación o instalación


Debe estar escrito de forma que lo entienda el encargado de la instalación del software.
Puede estar en formato impreso o electrónico. Su contenido será:
• La versión que se está instalando.
• Necesidades de hardware indicando capacidades y velocidades mínimas.
• Necesidades de software con versiones mínimas.
• Procesos para la instalación.
• A quién recurrir en caso de problemas.

Se aplican pruebas de usuario a cada manual para asegurarse que la escritura es clara,
precisa, completa y entendible.

Referencias bibliográficas

• Binder R. V. “Testing Object-oriented Systems. Models, patterns and Tools”. Addison


Wesley 2000.

Guadalupe Ibargüengoitia G., Hanna Oktaba 60

También podría gustarte