Adenda
Adenda
Adenda
del Software
Ejercicios y actividades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2. Fase de especicación 41
Ejercicios y actividades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3. Fase de diseño 65
III
IV Índice general
3.1.1. Patrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Ejercicios y actividades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4. Fase de implementación 79
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5. Fases de pruebas 83
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Bibliografía 181
Contexto de la asignatura en la
Ingeniería de Software
El proceso de construcción del software requiere, como en cualquier otra ingeniería, iden-
ticar las tareas que se han de realizar sobre el software y aplicar esas tareas de una forma
ordenada y efectiva. Adicionalmente y aunque no es el objeto principal de esta asignatura, el
desarrollo del software es realizado por un conjunto coordinado de personas simultáneamente y,
por lo tanto, sus esfuerzos deben estar dirigidos por una misma metodología que estructure las
diferentes fases del desarrollo. En temas posteriores, en primer lugar se explicarán en detalle las
mencionadas fases y a continuación las metodologías usuales que las gestionan.
En esta asignatura se hará especial énfasis en los temas relacionados con el análisis, diseño
y mantenimiento del software, mencionando apenas los temas especícos de la organización y
gestión de proyectos que conciernen a la distribución de medios y tareas entre las personas a
cargo del desarrollo, ya que estos últimos temas son objeto de otras asignaturas de la titulación.
1.1.1. Sistemas
1
2 Contexto de la asignatura en la Ingeniería de Software
Desde el momento en que se introdujeron computadores con capacidad para soportar apli-
caciones de tamaño considerable (años 60), las técnicas de desarrollo para los hasta entonces
pequeños sistemas dejaron progresivamente de ser válidas. Estas técnicas consistían básicamen-
te en codicar y corregir (code-and-x) que se resume en lo siguiente:
La ventaja de este enfoque es que no se gasta tiempo en planicación, gestión de los recursos,
documentación, etc. Si el proyecto es de un tamaño muy pequeño y lo realiza un equipo pequeño
(una sola persona o dos) no es un mal sistema para producir un resultado pronto. Hoy en día es
un método de desarrollo que se usa cuando hay plazos muy breves para entregar el producto
nal y no existe una exigencia explícita por parte de la dirección de usar alguna metodología de
ingeniería del software. Puede dar resultado, pero la calidad del producto es imprevisible. Las
consecuencias de este tipo de desarrollo son:
Aunque se han desarrollado técnicas para paliar estos problemas, hoy en día aún se consi-
dera normal que una aplicación rebase sus proyecciones iniciales de tiempo y dinero y que se
descubran bugs (errores informáticos) en su ejecución. Esto se debe a que todavía no se aplica
de un modo sistemático la ingeniería del software durante el desarrollo.
En la literatura sobre este tema existen muchas deniciones sobre lo que es una metodología.
El común denominador de todas ellas es la siguiente lista de características:
1. Dene cómo se divide un proyecto en fases y las tareas que se deben realizar en cada una
de ellas.
2. Especica para cada una de las fases cuáles son las entradas que recibe y las salidas que
produce.
La diferencia entre code-and-x (no usar ninguna metodología) y usar una es que se pueden
alcanzar los siguientes atributos en el producto nal:
2. Mantenibilidad: facilidad para realizar cambios una vez que el sistema está funcionando
en la empresa del cliente.
6. Eciencia: capacidad del sistema de realizar su tarea con el mínimo consumo de recursos
necesario.
Existen dos grupos de metodologías en función de la mentalidad con la que aborda un pro-
blema: metodología estructurada y metodología orientada a objetos.
Metodología estructurada
Diagramas de ujo de datos (DFD): representan la forma en que los datos se mueven y se
transforman. Incluyen:
• Procesos
• Flujos de datos
• Almacenes de datos
Los procesos individuales se pueden a su vez explosionar en otros DFD de mayor nivel
de detalle.
4 Contexto de la asignatura en la Ingeniería de Software
Alta/Baja
Película Gestionar
Altas/Bajas
Películas
Disponibles
Pedido
Devolución
Película
Gestionar Película
Gestionar
Pedidos
Devoluciones
Diccionario de datos: nombres de todos los tipos de datos y almacenes de datos junto con
sus deniciones.
Diagramas entidad-relación: los elementos del modelo E/R se corresponden con almace-
nes de datos en el DFD. En este diagrama se muestran las relaciones entre dichos elemen-
tos.
Los lenguajes de programación también reejan esta dicotomía que existe entre las metodo-
logías; así, existen lenguajes para la programación estructurada. Los más famosos son: Cobol
(destinado a aplicaciones nancieras, en su mejor momento el 90 % del código estaba escrito
en este lenguaje), Fortran (usado en aplicaciones matemáticas), C (aplicaciones de propósito
general en los años 80), Pascal y Modula 2.
La mentalidad que subyace al diseño estructurado es: ¿Cómo se puede dividir el sistema en
partes más pequeñas que puedan ser resueltas por algoritmos sencillos y qué información se
intercambian?. En el diseño orientado a objetos la idea es sin embargo: ¿Cuáles son los tipos de
datos que hay que utilizar, qué características tienen y cómo se relacionan?.
1.2 Ciclo de vida del software 5
Objetos y clases Un objeto consta de una estructura de datos y de una colección de métodos
(antes llamados procedimientos o funciones) que manipulan esos datos. Los datos denidos den-
tro de un objeto son sus atributos. Un objeto sólo puede ser manipulado a través de su interfaz,
esto es, de una colección de funciones que implementa y que son visibles desde el exterior.
Los conceptos importantes en el contexto de clases y objetos se pueden consultar en [Pre01,
sec. 20.1] y [Pre01, sec. 20.2]. En resumen son:
Durante la etapa de análisis se identican los objetos del dominio del problema. En el diseño se
denen las características de los objetos.
Al igual que otros sistemas de ingeniería, los sistemas de software requieren un tiempo
y esfuerzo considerable para su desarrollo y deben permanecer en uso por un periodo mucho
mayor. Durante este tiempo de desarrollo y uso, desde que se detecta la necesidad de construir
un sistema de software hasta que éste es retirado, se identican varias etapas (o fases) que en
conjunto se denominan ciclo de vida del software. En cada caso, en función de cuáles sean las
características del proyecto, se congurará el ciclo de vida de forma diferente. Usualmente se
consideran las fases: especicación y análisis de requisitos, diseño del sistema, implementación
del software, aplicación y pruebas, entrega y mantenimiento. Un aspecto esencial dentro de las
6 Contexto de la asignatura en la Ingeniería de Software
tareas del desarrollo del software es la documentación de todos los elementos y especicaciones
en cada fase. Dado que esta tarea siempre estará inuida por la fase del desarrollo en curso, se
explicará de forma distribuida a lo largo de las diferentes fases como un apartado especial para
recalcar su importancia en el conjunto del desarrollo del software.
Tal como ya hemos mencionado, las fases principales en cualquier ciclo de vida son:
2. Diseño: partiendo del modelo de análisis se deducen las estructuras de datos, la estructura
en la que descompone el sistema, y la interfaz de usuario.
Las etapas se dividen en actividades que constan de tareas. La documentación es una tarea
importante que se realiza en todas las etapas y actividades. Cada etapa tiene como entrada uno
o varios documentos procedentes de las etapas anteriores y produce otros documentos de salida
según se muestra en la gura 1.2.
Algunos autores dividen la fase del diseño en dos partes: diseño global o arquitectónico y
diseño detallado. En el primero se transforman los requisitos en una arquitectura de alto nivel,
se denen las pruebas que debe satisfacer el sistema en su conjunto, se esboza la documentación
y se planica la integración. En el detallado, para cada módulo se rena el diseño y se denen
los requisitos del módulo y su documentación.
Las formas de organizar y estructurar la secuencia de ejecución de las actividades y tareas
en las diferentes fases de cada uno de los métodos pueden dar lugar a un tipo de ciclo de vida
diferente. Los principales ciclos de vida que se van a presentar a continuación realizan todas las
fases, actividades y tareas. Cada uno de ellos tiene sus ventajas e inconvenientes.
1.2 Ciclo de vida del software 7
El ciclo de vida inicialmente propuesto por Royce en 1970, fue adaptado para el software
a partir de ciclos de vida de otras ramas de la ingeniería. Es el primero de los propuestos y el
más ampliamente seguido por las organizaciones (se estima que el 90 % de los sistemas han sido
desarrollados así). La estructura se muestra en la gura 1.3.
Descripción
Este modelo admite la posibilidad de hacer iteraciones. Así por ejemplo, si durante el man-
tenimiento se ve la necesidad de cambiar algo en el diseño se harán los cambios necesarios en
la codicación y se tendrán que realizar de nuevo las pruebas, es decir, si se tiene que volver a
una de las etapas anteriores al mantenimiento se recorrerán de nuevo el resto de las etapas.
Después de cada etapa se realiza una revisión para comprobar si se puede pasar a la siguiente.
Trabaja en base a documentos, es decir, la entrada y la salida de cada fase es un tipo de
documento especíco. Idealmente, cada fase podría hacerla un equipo diferente gracias a la
documentación generada entre las fases. Los documentos son:
Análisis: Toma como entrada una descripción en lenguaje natural de lo que quiere el
cliente. Produce el S.R.D. (Software Requirements Document).
Codicación: A partir del S.D.D. produce módulos. En esta fase se hacen también pruebas
de unidad.
Ventajas
La planicación es sencilla.
Inconvenientes
1
No se tienen indicadores ables del progreso del trabajo (síndrome del 90 %).
Aquellos para los que se dispone de todas las especicaciones desde el principio, por
ejemplo, los de reingeniería.
Como el modelo en cascada ha sido el más seguido ha generado algunas variantes. Ahora vere-
mos algunas.
Ciclo de vida en V
Propuesto por Alan Davis, tiene las mismas fases que el anterior pero tiene en consideración
el nivel de abstracción de cada una. Una fase además de utilizarse como entrada para la siguiente,
sirve para validar o vericar otras fases posteriores. Su estructura está representada en la gura
1.4.
1
Consiste en creer que ya se ha completado el 90 % del trabajo, pero en realidad queda mucho más porque el
10 % del código da la mayor parte de los problemas
1.2 Ciclo de vida del software 9
Según el modelo en cascada puro una fase sólo puede empezar cuando ha terminado la
anterior. En este caso, sin embargo, se permite un solapamiento entre fases. Por ejemplo, sin
tener terminado del todo el diseño se comienza a implementar. El nombre sashimi deriva del
estilo de presentación en rodajas de pescado crudo en Japón. Una ventaja de este modelo es
que no necesita generar tanta documentación como el ciclo de vida en cascada puro debido a la
continuidad del mismo personal entre fases. Los problemas planteados son:
Es aún más difícil controlar el progreso del proyecto debido a que los nales de fase ya
no son un punto de referencia claro.
La fase de concepto consiste en denir los objetivos del proyecto, benecios, tipo de tecno-
logía y tipo de ciclo de vida. El diseño arquitectónico es el de alto nivel, el detallado el de bajo
nivel. En la gura 1.5 se ha representado la estructura del ciclo de vida sashimi.
Si, una vez que se ha llegado al diseño arquitectónico, se comprueba que el sistema se divide
en varios subsistemas independientes entre sí, sería razonable suponer que a partir de ese punto
cada uno se puede desarrollar por separado y en consecuencia en paralelo con los demás. Cada
uno tendrá seguramente fechas de terminación distintas. Una vez que han terminado todos se
integran y se prueba el sistema en su conjunto. La ventaja es que se puede tener a más gente
10 Contexto de la asignatura en la Ingeniería de Software
trabajando en paralelo de forma eciente. El riesgo es que existan interdependencias entre los
subproyectos.
Hay dos partes en el ciclo de vida, que lo hacen similar al ciclo de vida tipo sashimi. Por un
lado están el análisis y el diseño global. Por otro lado están los pequeños incrementos que se
llevan a cabo en las fases de diseño detallado, codicación y mantenimiento.
Como se ha comentado anteriormente, uno de los problemas del ciclo de vida en cascada es
que si se entienden mal los requisitos esto sólo se descubrirá cuando se entregue el producto.
Para evitar este problema se puede hacer un desarrollo iterativo durante las fases de análisis y
diseño global. Esto consistiría en:
1. Preguntar al usuario.
3. Hacer un prototipo de interfaz de usuario, hacer entrevistas con los usuarios enseñándoles
el prototipo y volver con ello al punto 1 para identicar más requisitos o corregir malen-
tendidos.
Propuesto inicialmente por Boehm en 1988. Consiste en una serie de ciclos que se repiten.
Cada uno tiene las mismas fases y cuando termina da un producto ampliado con respecto al ciclo
anterior. En este sentido es parecido al modelo incremental, la diferencia importante es que tiene
en cuenta el concepto de riesgo. Un riesgo puede ser muchas cosas: requisitos no comprendidos,
1.2 Ciclo de vida del software 11
Alternativas: son las diferentes formas posibles de conseguir los objetivos. Se consideran
desde dos puntos de vista
Restricciones: son condiciones o limitaciones que se deben cumplir. Hay dos tipos:
• Desde el punto de vista del producto: interfaces de tal o cual manera, rendimiento,
etc.
Resolución de riesgos: son las posibles soluciones al problema anterior. La técnica más
usada es la construcción de prototipos.
Al terminar una iteración se comprueba que lo que se ha hecho efectivamente cumple con los
requisitos establecidos; también se verica que funciona correctamente. El propio cliente evalúa
el producto. No existe una diferencia muy clara entre cuándo termina el proyecto y cuándo
empieza la fase de mantenimiento. Cuando hay que hacer un cambio, éste puede consistir en un
nuevo ciclo.
Ventajas
Es más fácil validar los requisitos porque se entregan productos desde el nal de la primera
iteración.
El riesgo de sufrir retrasos es menor, ya que al identicar los problemas en etapas tempra-
nas hay tiempo de subsanarlos.
El riesgo en general es menor porque, si todo se hace mal, sólo se ha perdido el tiempo y
recursos invertidos en una iteración (las anteriores iteraciones están bien).
1.2 Ciclo de vida del software 13
Inconvenientes
Dónde es adecuado
Los tipos de ciclos de vida que se han estudiado hasta se han utilizado sobre todo en pro-
yectos desarrollados con análisis y diseño estructurados. El desarrollo de sistemas orientados a
objetos tiene la particularidad de estar basados en componentes, que se relacionan entre ellos a
través de interfaces, o lo que es lo mismo, son más modulares y por lo tanto el trabajo se pue-
de dividir en un conjunto de miniproyectos. Debido a todo esto, el ciclo de vida típico en una
metodología de diseño orientado a objetos es el ciclo de vida en espiral.
Además de lo anterior, hoy en día existe una tendencia a reducir los riesgos y, en este sentido,
el ciclo de vida en cascada no proporciona muchas facilidades.
En este texto sólo veremos un tipo de ciclo de vida orientado a objetos, que es además el
más representativo: el modelo fuente.
Modelo fuente
Fue creado por Henderson-Sellers y Edwards en 1990. Es un tipo de ciclo de vida pensado
para la orientación a objetos y posiblemente el más seguido. Un proyecto se divide en las fases:
3. Entrega o liberación.
Cada clase puede tener un ciclo de vida sólo para ella debido a que cada una puede estar en una
fase diferente en un momento cualquiera. La ventaja es que permite un desarrollo solapado e
iterativo. En la gura 1.8 se muestra un esquema de este tipo de ciclo de vida.
Una parte esencial de todas las tareas del desarrollo del software, en particular de la espe-
cicación de requisitos y del diseño, es la utilización de una notación para la descripción de
modelos que permita la mecanización parcial del proceso de producción. Dado que en la ac-
tualidad la fase de implementación se suele realizar con tecnologías orientadas a objetos, y que
adicionalmente este tipo de enfoque también es aplicable en otras fases del desarrollo, es im-
portante que el alumno conozca al menos los principios básicos de las notaciones orientadas a
objetos, y en especial de la más extendida últimamente, la notación UML (Unied Modelling
Language, Lenguaje Unicado de Modelado).
1.3.1. Introducción
Modelos
Historia
Grady Booch, Jim Rumbaugh e Ivar Jacobson (los apodados "tres amigos") desarrollaron los
tres métodos de desarrollo orientado a objetos más seguidas de la industria. De la unicación del
OMT (Object Modeling Technique) de Rumbaugh y el método de Booch nació la primera versión
del UML en el año 1994. Posteriormente, se incorporaron el método OOSE (Object-Oriented
Software Engineering) de Jacobson y algunos conceptos de otros lenguajes de modelado. En la
actualidad el UML es un estándar abierto del grupo OMG (Object Management Group) y se
halla en su versión 2.0.
A continuación se presenta una clasicación general de los elementos del lenguaje UML. En
las secciones siguientes se explica cómo estos elementos se combinan para construir diferentes
tipos de modelos, y se denen algunos elementos adicionales que intervienen especícamente
en estos modelos.
En el lenguaje UML se distinguen básicamente tres tipos de elementos:
16 Contexto de la asignatura en la Ingeniería de Software
3. Reglas de combinación
De agrupamiento: Son los Paquetes. Tipos particulares de paquetes son los Modelos
y los Subsistemas. Entre los modelos se distinguen Modelos de casos de uso, Mode-
los estructurales estáticos, Modelos de comportamiento y Modelos estructurales de
implementación.
Dependencias
Asociaciones
Generalizaciones
Casos de uso
Clases
Objetos
Secuencia
Colaboración
Estados
Actividades
Componentes
Despliegue
Como veremos en las secciones siguientes, los modelos de casos de uso se describen me-
diante diagramas de casos de uso y diagramas de secuencia; Los modelos estructurales estáticos
mediante diagramas de clases y de objetos, los modelos de comportamiento mediante diagramas
de secuencia, diagramas de colaboración,diagramas de estados y diagramas de actividades; y los
modelos estructurales de implementación mediante diagramas de componentes y diagramas de
despliegue.
En cuanto a los Mecanismos comunes se clasican en:
1.3 Notaciones de especicación y diseño (UML) 17
Adornos: Elementos grácos y textuales que pueden añadirse a la notación gráca básica
para proporcionar detalles adicionales de la especicación (símbolos de visibilidad, com-
partimentos adicionales, notas, roles, representación de clases y características especiales
- abstracta, raíz, hoja - etc).
En las secciones siguientes explicamos los diferentes tipos de modelos que pueden denirse
en UML, describiendo al mismo tiempo los elementos que intervienen en los correspondientes
diagramas. Hemos optado por describir estos elementos a medida que se hace referencia a ellos
por entender que en un contexto de modelado concreto se pueden entender mejor su utilidad y
signicado. Por lo general no distinguiremos entre los diferentes tipos de adornos o mecanismos
de extensión que estos elementos constituyen, por no considerarlo relevante en el nivel de estu-
dio del lenguaje exigido para esta asignatura. Los símbolos grácos que los denotan aparecen
ilustrados en las guras de esta sección. Las antes mencionadas reglas de combinación están
implícitas en la descripción de los diferentes diagramas.
Representa la visión que tendría del sistema un usuario externo, y es desarrollado por los
analistas con la colaboración de los expertos del dominio de aplicación. Un caso de uso expresa
lo que comúnmente se denomina una transacción, esto es, una interacción entre el sistema y el
usuario u otro sistema que es visto como un actor externo: p.e., un usuario que pulsa el botón
de llamada de un ascensor, o un periférico que solicita datos de un ordenador central.
Los casos de uso sirven para especicar los requisitos funcionales del sistema e identicar
los escenarios de prueba. Normalmente se utilizan en las primeras etapas de desarrollo. En par-
ticular, algunas metodologías están dirigidas por casos de uso, de forma que es a partir de ellos
que se derivan los modelos estructurales y de comportamiento. En cualquier caso, siempre es
preciso asegurarse de que el modelo de casos de uso es coherente con estos modelos.
En UML los casos de uso se denen mediante diagramas de casos de uso y de secuencia, y
descripciones textuales (especicaciones) que resultan de cumplimentar unas plantillas estándar.
Entidades
Actores: Denen un conjunto de roles que desempeñan los usuarios cuando interaccionan
con los casos de uso.
18 Contexto de la asignatura en la Ingeniería de Software
Interviene también en los casos de uso una entidad de agrupamiento, el Límite del sistema,
que representa el límite entre el sistema físico y los actores que con él interaccionan.
Relaciones
En los modelos de casos de uso pueden estar implicadas relaciones de los tres tipos princi-
pales:
Generalización: Muestra una taxonomía entre casos de uso o actores generales, y casos
de uso o actores más especícos.
Diagramas
En la gura 1.9 se ilustra un diagrama de casos de uso elemental. En cuanto a los diagramas
de secuencia, que completan los modelos de casos de uso, se verán en detalle en la sección
posterior Modelado de comportamiento.
1.3 Notaciones de especicación y diseño (UML) 19
Mecanismos comunes
Al modelar casos de uso es importante asegurarse de que cada caso denido describe una
parte signicativa del funcionamiento del sistema. Para evitar la denición de un número ex-
cesivo de casos de uso, hay que tener presente que un caso de uso no es un paso, operación o
actividad individual de un proceso, sino un proceso completo que incluye varios pasos.
Otro aspecto importante a tener en cuenta es la utilidad de los casos de uso en la comuni-
cación entre analistas, desarrolladores del software y expertos del dominio de aplicación: deben
se entendibles por todos y constituir una descripción de alto nivel del sistema que no incorpore
conceptos de diseño.
Para identicar casos de uso es recomendado comenzar por modelar el contexto con que
habrá de relacionarse, fase que implica los siguientes pasos:
A continuación, para cada uno de estos actores, habrán de identicarse los procesos que
inician o en los que participan. Los casos de uso resultantes deben constituir un modelo de
requisitos del sistema.
Los siguientes pasos a seguir en la denición de casos de uso serán pues:
3. Identicación de los casos de uso que pueden ser especializaciones de otros y búsqueda
de secuencias parciales comunes en los casos de uso ya encontrados.
Muestra una visión de la estructura interna del sistema en términos de las entidades que
lo integran y las relaciones que existen entre ellas, capturando el vocabulario del dominio de
aplicación. Este modelo es desarrollado por analistas, diseñadores y programadores y se dene
mediante diagramas de clases y de objetos.
20 Contexto de la asignatura en la Ingeniería de Software
Entidades estructurales
Clase : Descripción de un conjunto de objetos que comparten los mismos atributos, ope-
raciones, relaciones y semántica.
Clases Las clases son abstracciones del dominio de aplicación o bien de la tecnología utilizada
en su desarrollo. Constituyen el elemento básico de modelado en el paradigma de orientación a
objetos. Una clase se instancia en objetos excepto cuando se dene como Clase abstracta (un
adorno de clase).
Las clases abstractas se utilizan en niveles altos de las jerarquías de clases para denir abs-
tracciones muy generales de las que derivar otras clases. En una jerarquía de clases existe una
clase Raíz o base sin Superclases, que da origen a la jerarquía, y clases Hojas sin Subclases.
El signicado de estas jerarquías está ligado al concepto de Herencia, que se presentará en una
sección posterior.
En la gura 1.11 se ilustran las partes de una clase, que se disponen de arriba a abajo en el
orden siguiente:
1. Nombre: Distingue a la clase del resto de clases en el ámbito del modelo. Consiste en una
cadena de cualquier longitud que puede contener letras, números y signos de puntuación
(exceptuando y ::). Aparece en cursiva en el caso de las clases abstractas (clases que
carecen de instancias). El nombre de clase puede aparecer opcionalmente precedido del
nombre del paquete en que la clase se utiliza; su sintaxis se dene pues, en notación BNF:
[paquete::]nombre-simple.
2. Atributos: Representan propiedades características compartidas por todos los objetos de
la clase. Una clase puede tener cualquier número de atributos. Un nombre de atributo
consiste en una cadena de cualquier longitud que puede contener letras y números. Sobre
ellos pueden proporcionarse diferentes informaciones:
1.3 Notaciones de especicación y diseño (UML) 21
a) Tipo: Atributo:Tipo
b) Valor inicial: Atributo:Tipo=Valor ó Atributo=Valor
d) Visibilidad o Alcance: Determina en qué medida otras clases pueden hacer uso del
atributo. Un atributo público (+) es visible para cualquier clase externa; un atributo
protegido (#) es visible para cualquier descendiente en la jerarquía de herencia; y un
atributo privado (-) es sólo visible para la propia clase. El valor por defecto de la
visibilidad es siempre público.
de clase: cuando todas las instancias de una clase comparten un valor. (p.e., las
variables static en Java). Este tipo de ámbito se indica subrayando el nombre
del atributo.
3. Operaciones: Son servicios básicos ofrecidos por los objetos de una clase, que con fre-
cuencia provocan cambios en sus estados (se adornan con query aquellas operaciones que
no tienen ningún efecto secundario, esto es, que no modican el estado del sistema). Al
igual que en el caso de los atributos, pueden especicarse su visibilidad, ámbito y pro-
piedades. Se pueden indicar también el tipo de los argumentos que reciben y el tipo del
valor que retornan. Tanto si se especican sus argumentos como si no, han de añadir-
se un paréntesis abierto y otro cerrado al nal de su nombre, de acuerdo a la sintaxis:
[visibilidad]nombre([parámetros])[:tipoRetorno][propiedades]. La sintaxis
completa de los parámetros es: [dirección]nombre:tipo[= valorPorDefecto]. La
implementación concreta que una clase hace de una operación se denomina Método. La
descripción de un método puede realizarse mediante una especicación textual descrita
en cualquier lenguaje elegido (p.e., el OCL). Al igual que existen clases abstractas exis-
ten Operaciones abstractas, esto es, operaciones que se denen exclusivamente como
una signatura. Las clases que contienen este tipo de operaciones requieren subclases que
proporcionen métodos para su implementación. Las operaciones de las clases hoja de una
jerarquía de clases obligadamente habrán de tener un método asociado.
5. Otras: Una clase puede incluir partes adicionales predenidas (p.e., excepciones) o de-
nidas por el usuario.
La información que se ha incluido en la gura 1.11 es mucha más de la que se suele mostrar:
una clase puede representarse con un simple rectángulo que contiene su nombre; véase la gura
1.12. También es común omitir parte de la información de un apartado. Los puntos suspensivos
que aparecen el la gura 1.11 al nal de las secciones de atributos y operaciones indican que la
representación de la clase es abreviada, o lo que es lo mismo, que faltan atributos y operaciones
que no se ha considerado necesario detallar para el propósito del diagrama en cuestión.
Ascensor
Las instancias de clase se denominan objetos. Los objetos se caracterizan por un estado
denido por los valores especícos de sus atributos en cada instante de tiempo.
La notación gráca de una clase en un diagrama de clases coincide con la de un objeto en
un diagrama de objetos. La sintaxis de su nombre, que aparece subrayado, es: [nombreInstan-
cia][:nombreClase] (véase la gura 1.13).
ascensor2:Ascensor
Interfaces Las interfaces son conjuntos de operaciones que especican parte de la funciona-
lidad (un servicio) proporcionada por una clase o componente, con independencia de su imple-
mentación. Pueden verse como contratos entre los clientes de la interfaz y sus implementaciones;
el programador responsable de la interfaz puede optar por implementar una nueva o bien adquirir
o reutilizar otra implementación, con tal de que el estipulado contrato se cumpla.
Una interfaz y la clase que la implementa están relacionadas mediante una realización (un
tipo particular de relación de dependencia), donde una clase puede realizar varias interfaces y
una interfaz puede realizarse por más de una clase. Por otro lado, una clase cliente puede
usar varias interfaces con las que estará relacionada mediante una relación de uso (otro tipo de
relación de dependencia).
Las interfaces establecen conexiones entre los componentes de una aplicación, y representan
los principios de modularidad y ocultación necesarios en diseños orientados a objetos de calidad.
En cuanto a su representación diagramática, las interfaces se muestran como clases sin atri-
butos mediante dos representaciones alternativas que se muestran en la gura 1.14: como clases
con estereotipo «interfaz» y, en forma abreviada, sin mostrar las operaciones. Al tratarse de un
tipo particular de clases, entre las interfaces pueden darse relaciones de herencia. Todas las
operaciones de una interfaz son públicas.
1.3 Notaciones de especicación y diseño (UML) 23
<<interface>>
<<interface>>
Iterable
ObjetoGrafico Dibujable
+Dibujar()
<<interface>>
Dibujable
Collection
ObjetoGrafico
<<interface>>
SortedSet
Relaciones
Asociación Es una relación conceptual, que no es inherente a la naturaleza de las clases sino
al papel que juegan en el modelo. Especica que las instancias de una clase están conectadas
con las de otra. No se trata de una relación fuerte, es decir, el tiempo de vida de dos objetos
relacionados es independiente (a menos que exista una restricción asociada a la relación que
indique lo contrario).
La representación gráca de una asociación (véase la gura 1.15) es básicamente una línea
que conecta las clases, pero puede incluir opcionalmente un nombre que da idea de su interpre-
tación en el dominio de la aplicación, así como otros adornos en sus extremos tales como:
Un nombre de rol que cualica el papel que juega cada una de las partes en la asociación
(una clase puede desempeñar distintos roles en distintas asociaciones).
Una indicación de Navegabilidad, propiedad del rol que consiste en la posibilidad de ir
desde el objeto origen al objeto destino, es decir, implica la visibilidad de los atributos del
objeto destino por parte del objeto origen. Por defecto la navegabilidad es bidireccional,
En la gura 1.17 se ilustra una asociación no bidireccional: dada una password, no se
puede acceder directamente al usuario a que pertenece (al menos en principio).
Una Calicación, atributo de la asociación que permite localizar una cierta instancia cuan-
do la multiplicidad de la asociación es mayor que la unidad en el extremo considerado.
(véase la gura 1.18).
En una composición, cada componente pertenece a un todo y sólo a uno (en la gura 1.19
no se cumple esto, por ejemplo, la antigua Unión Soviética tenía una parte europea y una parte
asiática). En la gura 1.20 vemos un ejemplo de este tipo de relación.
Es posible que dos clases estén relacionadas entre sí por más de una asociación o que una
clase esté relacionada con muchas clases por diferentes asociaciones. Por lo general, las asocia-
ciones son relaciones simétricas. Se dice que una relación es reexiva cuando asocia entre sí a
objetos de una misma clase. La notación con que se expresa la multiplicidad de una asociación
es diversa:
4. Combinación de los elementos anteriores: Por ejemplo: 1..4,6,9..* (que signica entre
1 y 4, ó 6, ó 9 ó más de 9, es decir, los valores 0, 5, 7 u 8 no estarían permitidos); 2,4,6
(los valores 2, 4 ó 6 y ninguno más).
Un alumno puede estar matriculado como mínimo en una asignatura (si no está en ninguna
no es alumno) y como máximo en 11.
En una asignatura se puede matricular un número ilimitado de alumnos pero tiene que
haber al menos un matriculado, o de lo contrario la asignatura no existe.
Existen asignaturas que tienen prácticas y algunas de ellas se realizan entre varios alum-
nos. Un alumno puede estar asociado con un número variable de compañeros para reali-
zarlas.
Estudiante 1..*
Cursa
1..11 Asignatura
1
Estudiante Num.Matrícula Cursa
1..11
Asignatura
Continente Pais
Generalización Es una relación entre una abstracción general y una abstracción más concreta.
Las relaciones de generalización entre clases (una superclase o clase principal y una subclase
o clase secundaria) se denominan relaciones de herencia. Indica que la subclase hereda las
operaciones y atributos denidos en la superclase. Este tipo de conexión se lee como es un tipo
de. En la gura 1.21 se muestra un ejemplo de representación.
Una clase puede tener ninguna, una (Herencia simple) o varias (Herencia múltiple) su-
perclases. La relación de generalización o herencia permite denir taxonomías de clases. En
una jerarquía de herencia, las clases sin superclases se denominan clases Raíz, y las clases sin
subclases se denominan clases Hoja. En las jerarquías de herencia se da el Polimorsmo, que
consiste en que un objeto de una subclase puede comportarse como un objeto de cualquiera
de sus superclases en cualquier contexto (el recíproco no es cierto). Así, si una operación de
la subclase tiene la misma signatura que una operación de la superclase, cuando se invoque la
operación de un objeto de la subclase se ejecutará el método denido en la subclase y, cuando
se invoque la operación de un objeto de la superclase, se ejecutará el método de la operación de
la superclase.
26 Contexto de la asignatura en la Ingeniería de Software
Motor Cabina
Ascensor
Electrónica
Cable
Figura 1.20: Composición con una agregación (la electrónica puede ser compartida por un grupo
de ascensores)
Prof.Universidad
CatedráticoEscuela Catedrático
Figura 1.21: Herencia; los nombres de las clases abstractas se escriben en cursiva
Dependencia Es una relación entre dos entidades estructurales tal que un cambio en una de
ellas (la independiente) puede afectar a la otra (la dependiente). Suele ser unidireccional y se
interpreta muchas veces como una relación de uso, entendiéndose que una clase usa a otra
cuando ésta dene el tipo de alguno de los argumentos que aparece en las signaturas de sus
operaciones (véase la gura 1.22).
UsoServicio DoyServicio
Diagramas
Veamos cómo sería el modelo de clases que corresponde con este texto: En un conocido
juego de estrategia hay tres tipos de razas: Terrans, Zergs y Protos. Cada tipo de raza dene
a su vez dos tipos de personajes: Trabajadores (consiguen recursos y construyen edicios) y
Soldados (pegan a personajes de otro bando). Un personaje tiene como características: Si es
aéreo o terrestre, salud (número entero), velocidad, escudo, etc. Un soldado además dene si
puede pegar a personajes aéreos o terrestres, daño que hace, etc. Un trabajador recoge recursos
y los lleva a un edicio de recogida. Los recursos son de dos tipos: Gemas y Gas y se van
agotando a medida que son explotados. Hay diferentes tipos de edicios propios de cada raza
y cada uno proporciona capacidades diferentes a los miembros de su bando, por ejemplo, el
máximo número de personajes de un bando está determinado por el número de edicios granja
multiplicado por 8; el edicio armería mejora en +1 el daño de los soldados. Un bando está
denido por un conjunto de personajes y edicios de una o más razas. El juego tiene lugar sobre
un tablero denido en una retícula romboidal. En cada punto de la retícula se dene el tipo de
terreno y se pueden posicionar personajes, edicios y recursos. Un bando puede ser dirigido
por un jugador o por la inteligencia articial del programa.
Diagrama de objetos Este diagrama permite modelar una instantánea del sistema en un mo-
mento dado de su funcionamiento. Nótese que, no obstante, describe un modelo estructural está-
tico, ya que no incluye información alguna sobre evolución temporal. Contiene principalmente
objetos y enlaces que ligan estos objetos (esto es, instancias de clases y relaciones denidas en
los diagramas de clases). Los objetos pueden aparecer agrupados en paquetes. En los diagramas
de clases también es posible mostrar objetos que son instancias de las clases denidas, siempre
que se considere relevante para el propósito de la representación; por esta razón, los diagramas
de objetos pueden verse como diagramas de clases que no contienen clases. En el ejemplo de la
gura 1.24, se ilustra la notación de un diagrama de objetos. Hacemos notar que:
1. Dar nombre a objetos y enlaces es opcional pero, en el caso de los objetos, es obligado
indicar la clase de que son instancia.
2. También pueden mostrarse opcionalmente los atributos, con sus correspondientes valores,
en caso de considerarse relevantes.
Matrícula = www-1234
Modelo = Citroen ZX 1.9 D
asientoIzdo:AsientoDelantero Color = Verde oscuro metalizado carroceria:Carroceria
asientoTrasero:AsientoTrasero
salpicadero:Salpicadero
Mecanismos comunes
En los modelos estructurales estáticos suele utilizarse todo tipo de mecanismos comunes del
UML. Algunos de ellos han sido mencionados en las secciones anteriores, donde se ha explica-
do cómo se añaden a las notaciones básicas de los bloques de construcción para enriquecer la
representación (símbolos de visibilidad, estereotipos, etc) Denimos brevemente a continuación
el sentido preciso de los dos más comúnmente utilizados:
Estereotipos. Suponen una extensión del metamodelo del UML, esto es, del conjunto
de conceptos (metaconceptos) predenidos (tales como clase, atributo, caso de uso, etc.)
en términos de los cuales se denen los modelos. Denir un nuevo estereotipo supone
añadir un nuevo concepto por herencia, de modo que constituya un caso particular de
algún concepto ya denido. Está aceptado asimismo denir nuevas notaciones grácas
para representar los nuevos conceptos (es el caso del símbolo de actor, que representa una
clase estereotipada como «actor».
1.3 Notaciones de especicación y diseño (UML) 29
Entidades de agrupamiento
En los modelos estructurales, los Paquetes agrupan clases vinculadas por alguna relación
(su representación se ilustra en la gura 1.26). En cuanto a los Subsistemas, agrupan paquetes
que participan en un comportamiento, desde una visión de alto nivel del sistema.
AWT
Button Canvas
Label CheckBox
Figura 1.26: Paquete incluido en las librerías estándar de Java para la implementación de inter-
faces grácos
Modelado estructural
Los modelos estructurales son útiles tanto cuando análisis y diseño se abordan con una pers-
pectiva ascendente (bottom-up) como cuando se abordan con una perspectiva descendente
(top-down). En el primer caso, el objetivo del modelado estructural será especicar la estruc-
tura de alto nivel del sistema, para lo que se utilizarán clases con signicado arquitectural y
entidades de agrupamiento para gestionar la complejidad (paquetes y subsistemas). En el segun-
do caso, se tratará de especicar la estructura de bajo nivel, que se irá renando a medida que
progrese el desarrollo (añadiendo detalles, reclasicando, deniendo nuevas relaciones, etc.).
Para comenzar un desarrollo especicando el modelo estructural estático es preciso conocer
bien el dominio de aplicación. De otro modo, será más adecuado utilizar, p.e., un método dirigido
por casos de uso, y el modelo estructural habrá de denirse en coherencia con los casos de uso
o colaboraciones ya especicados.
Un buen modelo estructural debe constituir un esqueleto extensible y renable a medida que
se profundiza en el conocimiento del dominio de aplicación. En las primeras fases de denición
30 Contexto de la asignatura en la Ingeniería de Software
siempre es preferible limitarse a utilizar las notaciones más básicas, dejando las más avanzadas
para añadir detalles en fases posteriores. En particular, es importante evitar limitar los modelos
iniciales añadiendo aspectos propios de fases de implementación. También debe evitarse mez-
clar en un mismo diagrama entidades descritas en niveles de abstracción diferentes. Finalmente,
constituye también una buena práctica organizar las clases en paquetes cuando empiezan a re-
sultar numerosas.
Un modelo de comportamiento describe la evolución del estado del sistema y las interaccio-
nes que tienen lugar entre sus elementos. Se expresa mediante diagramas de interacción (de dos
tipos: diagramas de colaboración y diagramas de secuencias), diagramas de estado y diagramas
de actividad. Entre las entidades de comportamiento, las principales entidades implicadas en los
diagramas de interacción son los mensajes, mientras que en los diagramas de estado y actividad
las entidades protagonistas son los estados, las transiciones y las acciones. Los cuatro tipos de
diagramas de comportamiento pueden implicar asimismo diferentes entidades estructurales, y
los diagramas de colaboración exhiben, adicionalmente, asociaciones.
Diagramas de interacción
Instancias (de clases, de componentes o de casos de uso). Entidades con identidad única
a las que se puede aplicar un conjunto de operaciones, que tienen un estado y almacenan
los efectos de estas operaciones.
• Síncronas: las instancias en comunicación tienen que estar sincronizadas, esto es, la
instancia que invoca se queda bloqueada hasta recibir una respuesta.
Las señales siempre son asíncronas. Existen algunos tipos característicos de señales:
• Creación de instancia.
• Destrucción de instancia.
Como ya hemos mencionado, existen dos tipos de diagramas de interacción: los diagramas
de secuencias y los diagramas de colaboración. Además de los elementos antes listados, en los
diagramas de colaboración pueden gurar explícitamente enlaces que conectan las diferentes
instancias, y atributos de estos enlaces.
2. Activación: Punto en que un objeto pasa a tener un método en ejecución, bien por autoin-
vocación de la correspondiente operación, bien por invocación procedente de otro objeto.
[Condición X]Mensaje
5. Iteración: Indica una acción que se repite mientras se satisfaga una cierta condición. Se
denota con el símbolo * previo a la condición (ver gura 1.28).
buscador:Buscador lista:Lista
*[hayMasElementos]getNextElement()
controlador:Controlador
<<create>>
complicado:Algoritmo
hazAlgo()
mensajeRecursivo()
Fin de la llamada:
<<destroy>> "hazAlgo()"
Nótese que, en los diagramas de secuencias, los estímulos se denotan mediante echas ho-
rizontales trazadas desde la línea de vida del objeto que los envía hasta la del objeto que los
recibe. En cuanto a las señales de creación y destrucción de objetos, la creación se representa
mediante un mensaje de creación que termina en la cabecera de una línea de vida (la de la nueva
instancia creada), mientras que la destrucción se representa mediante un aspa que gura al nal
de la línea de vida del objeto destruido (véase la gura 1.29).
Diagrama de colaboración Muestran las interacciones que tiene lugar entre los objetos, or-
ganizadas en términos de los objetos y de los enlaces que los conectan (véase el ejemplo de la
gura 1.30). Proporcionan una visión de la secuencia de interacciones alternativa de la propor-
cionada por los diagramas de secuencia. Para cada diagrama de colaboración existe un diagrama
de secuencias equivalente (se puede generar de un modo automático un tipo de diagrama a partir
del otro). Es un diagrama más compacto que el de secuencias pero muestra peor la evolución
temporal.
Diagrama de estados
La evolución de un sistema a lo largo del tiempo puede modelarse como la transición entre
una serie de estados de un autómata o máquina de estados. Los diagramas de estados del UML
representan el comportamiento de las instancias de clases, componentes o casos de uso, como
1.3 Notaciones de especicación y diseño (UML) 33
jugar() 1:r1:=lanzar()
jugador:Jugador primerDado:Dado
2:r2:=lanzar()
segundoDado:Dado
máquinas de estados extendidas que constan siempre de un estado inicial y un estado nal. A
cada estado se asignan:
Nombre.
Variables de estado.
Transiciones, asociadas a los respectivos conjuntos de eventos que las estimulan y, op-
cionalmente, a un conjunto de acciones, parámetros y condiciones que habilitan o no la
transición.
bajar
llegar
time-out
llegar
Sótano
1. Identicar una clase que participa en el comportamiento que se desea modelar, cuyas
actividades de proceso deban ser especicadas.
Este tipo de diagrama es útil para modelar el ujo de trabajo de un negocio a alto nivel (véase
el ejemplo de la gura 1.32).
Ducha
Cerrar puerta
Abrir puerta
Conducir
2. Punto nal. Representa el estado diana. Se denota mediante un círculo negro rodeado
exteriormente por otro círculo.
Diagrama de componentes
Modelan una visión estática del sistema en el nivel de implementación. Ilustran la organiza-
ción y las dependencias entre componentes software. Los componentes pueden ser código fuente
(clases de implementación,una implementación de una interfaz, cheros de scripts...) binarios,
ejecutables, tablas, o cualquier otro tipo de elemento que forme parte de la implementación de
sistema o de su documentación. En un diagrama de componentes no necesariamente estarán pre-
sentes todos los componentes. En la gura 1.33) se muestra cómo un componente implementa
una interfaz.
Componente
GUI Dibujar
Interfaz
El estándar de UML dene cinco estereotipos para caracterizar tipos de componentes: exe-
cutable, library, table, le y document.
Ejecutables Estos componentes se modelan siguiendo los siguientes pasos (véase el ejemplo
de la gura 1.34):
<<library>>
TCP/IP.dll
<<executable>>
Servidor.exe
<<library>>
BaseDatos.dll
Figura 1.34: Ejecutable que usa una librería de comunicaciones y una base de datos
Código fuente Modelar estos componentes es útil para expresar las dependencias que existen
entre los módulos, con vistas a componer librerías o programas ejecutables (véase el ejemplo en
la gura 1.35).
<<file>> <<file>>
stderr.h stdio.h
<<file>>
Agenda.h
<<file>>
Agenda.c
Diagrama de despliegue
Este diagrama reeja la organización del hardware. Su entidad central es el nodo. Los nodos
pueden o no tener capacidad para ejecutar componentes. Un nodo lleva asociado un nombre y un
conjunto de componentes (que pueden representarse sólo mediante sus nombres o bien mediante
un diagrama de componentes). Cada nodo puede estar físicamente conectado a otros nodos. La
38 Contexto de la asignatura en la Ingeniería de Software
Servidor
Aplicación BD
Servidor Oracle
Tutorial posterior
Resumen de contenidos
2. Ciclos de vida: Se explica lo que es un ciclo de vida, las fases de las que se compone y la
forma en que se ordenan estas fases. Se presenta una clasicación de los distintos ciclos de
vida que se pueden dar en un proyecto. Básicamente, se consideran dos tipos principales
que son: el ciclo de vida en cascada (el más antiguo y preferido en las metodologías
estructuradas) y el ciclo de vida en espiral (el más nuevo, preferido en las metodologías
orientadas a objetos). Estos se dividen a su vez en varios subtipos que cumplen diferente
propósitos. Los ciclos de vida son:
a) Ciclo de vida en cascada. Subtipos: ciclo de vida en V, Sashimi, cascada con sub-
proyectos, cascada incremental y cascada con reducción de riesgos.
1.3 Notaciones de especicación y diseño (UML) 39
b) Ciclo de vida en espiral. Subtipos: Fuente y además los subtipos cascada incremental
y cascada con reducción de riesgos, que también se pueden considerar como ciclos
de vida en espiral.
Una biblioteca de cálculo numérico para hacer operaciones con matrices de gran
tamaño.
Una agenda electrónica para guardar teléfonos, direcciones, etc. Es más que posible
que se quiera ampliar.
4. En el ejercicio anterior con los tres grupos de personas, ¿Cómo representaría en un dia-
grama de clases a un estudiante que trabaja al mismo tiempo?
Fase de especicación
Los métodos tradicionales en cualquier ingeniería requieren como primer paso la obtención
de los requisitos en forma de especicaciones por parte del cliente. Este problema habitualmente
tiene complicaciones debidas al paso entre el lenguaje natural y los lenguajes más formales en
ingeniería. Por lo tanto la obtención de los requisitos es un paso complejo y que no tiene una
solución sencilla. Se suelen utilizar los métodos de pregunta-respuesta o los de cuestionarios
plantilla para perlar la versión inicial, pero se requieren sucesivas iteraciones (incluso con otras
fases de desarrollo) antes de obtener unas especicaciones adecuadas.
2.1.1. Introducción
Un requisito se dene como una capacidad que el sistema debe tener porque el cliente lo ha
pedido explícita o implícitamente. Lógicamente, la determinación del conjunto de requisitos es
el primer paso que se debe dar en la construcción de una aplicación. Existen dos subtareas en la
obtención de los requisitos:
Análisis: Consiste en comprender el problema del cliente para conseguir una lista de las
características que debe tener el producto.
41
42 Fase de especicación
• Falta de conocimientos técnicos (informáticos) por parte del cliente para expresarse
con claridad.
Análisis
Especicación
Después del análisis se redacta un documento técnico con todos los requisitos anteriores,
este documento tiene que tener estas propiedades:
Concisión: Es importante no hacer una novela, hay que contar lo que hay pero pensando
que quien se lea el documento cobra por horas.
Facilidades de prueba: De algún modo se debe poder comprobar cada uno de los requi-
sitos.
Facilidades de seguimiento: Debe ser posible comprobar si se van cumpliendo los obje-
tivos.
Factibilidad: Los objetivos denidos deben ser alcanzables con el tiempo y presupuesto
disponibles.
Tipos de requisitos
Requisitos funcionales: Dicen qué debe hacer el sistema, en el sentido de servicios proporcio-
nados al usuario.
Requisitos no funcionales: Hablan de características del sistema, como pueda ser la abili-
dad, mantenibilidad, sistema operativo, plataforma hardware, lenguaje de programación,
etc.
En el siguiente texto: Se desea desarrollar un editor de texto para programadores que emplee
menos de cinco megas de memoria y tarde menos de un segundo en cargarse. Debe reconocer y
colorear adecuadamente el código fuente de programas escritos en C, C++, Java y Modula 2.
2.1 Obtención de requisitos 43
Entrevistas genéricas
Las entrevistas en términos generales generan estrés porque se ponen de maniesto las ca-
rencias de formación, de conocimiento o realización del propio trabajo, problemas personales o
interpersonales, pero sobre todo porque suele haber algo en juego.
Aparte del tema del estrés en toda reunión suele haber una relación de poder entre los inte-
grantes. Las relaciones de poder son el mejor contaminante de la buena comunicación, ejemplos:
si digo que nuestra parte del proyecto tiene tal problema delante del jefe de mi jefe directo,
mi jefe directo me despide, el individuo X impone una alternativa peor que otras porque no
las comprende o por interés personal: el servidor web de contenidos se programa en C desde
cero (porque es el lenguaje que X conoce) o las compras de hardware se hacen siempre en la
empresa Z (que es de mi hermana), etc.
Debido a lo anterior, sobre éste tema de las entrevistas y reuniones se han vertido ríos de tinta.
El resultado ha sido una burocratización del proceso que es necesaria por como funciona la
psicología humana. Veremos un resumen de lo esencial adaptado a las necesidades de construir
una especicación software.
1
Sistema de proceso de textos de varias décadas de antigüedad muy usado por investigadores
44 Fase de especicación
Figura 2.1: Relaciones de poder en la empresa. El dibujo es del autor argentino Quino (Joaquín
Salvador Lavado)
Aunque también existan otras técnicas, ésta es inevitable. La tendremos al menos al inicio del
proyecto. Una entrevista genérica sigue este patrón: Preparación, Desarrollo y Análisis.
• Personal: se seleccionan las personas a las que se va a entrevistar. Existen dos tipos
de personas:
◦ Directivos: dan una imagen de alto nivel de la empresa. Puede ser útil para
determinar la estructura arquitectónica de la aplicación. Ejemplos (inspirados en
la gura): política que se sigue para comprar escobas, departamento responsable
de su compra, almacenaje y distribución, etc.
2.1 Obtención de requisitos 45
◦ Plantilla de base: dan una imagen de un grano más no. Son los que pueden
concretar las funciones a implementar. Ejemplos (inspirados en la gura): un
requisito sería el desarrollo de una escoba especializada en barrer rincones, otra
con mango más largo para llegar al techo, etc.
Desarrollo
◦ No insinuar que el entrevistado debería saber algo que no sabe para que
no se ponga a la defensiva. También hay que dejar claro que los intere-
ses del entrevistador son únicamente la adquisición de requisitos, no hacer
un examen de conocimientos, y por tanto las lagunas que pueda tener no
trascenderán a sus superiores.
2
Diccionario de la Real Academia de la Lengua
46 Fase de especicación
◦ Usar técnicas para mantener la atención del entrevistado, como por ejem-
plo evitar las circunstancias que sometan a la persona a interferencias o
intentando estimular su creatividad.
Análisis: se trata de ver como utilizar los conocimientos adquiridos. Para ello las activi-
dades son:
Para validar una vez más la entrevista se puede mandar la documentación generada al
entrevistado.
En el apartado anterior se vio una somera introducción a una entrevista clásica donde existe
un entrevistador y un entrevistado. Ahora se contempla un tipo de entrevista desarrollada por
IBM para varias personas. Consiste en un conjunto de reuniones en un periodo de entre dos y
cuatro días. Se basa en cuatro principios:
1. Dinámica de grupo: son técnicas de discusión para generar ideas y confrontar puntos de
vista.
3. Modo de trabajo sistemático: se sigue el guión que se expone en las fases. Todo el mundo
tiene asignado un rol.
Existen dos tipos de sesiones JAD: JAD/Plan, para obtención de requisitos y JAD/Design,
para el diseño. Veremos sólo el primero.
1. La información obtenida se puede contrastar in situ porque están todos los interesados.
En las entrevistas individuales este es un proceso lento. Además en esta contrastación
participan tanto los usuarios como los desarrolladores, esto quiere decir que los requisitos
que se obtienen son los correctos.
2. Los clientes se sienten involucrados en el proceso de desarrollo porque ellos mismos par-
ticipan en la exploración de los problemas que se plantean, con lo cual la resistencia al
cambio será menor.
Inconvenientes:
1. Al ser varias personas es difícil encontrar un hueco en la agenda de todos para estas reunio-
nes.
Participantes: Participan de ocho a doce usuarios a parte de los analistas. Hay seis tipos:
1. Jefe del JAD: debe tener las características clásicas de una persona que dirige una reunión:
Dotes de comunicación y liderazgo. Son deseables también conocimientos de psicología
para por ejemplo conseguir que todo el mundo participe o evitar conictos, pero sobre
todo, para dirigir la sesión a sus objetivos.
5. Desarrolladores: son las personas que pueden informar de las dicultades de implemen-
tación de ciertas características.
6. Especialistas: son la autoridad a consultar sobre aspectos puntuales tanto por parte de
los usuarios como por parte de los desarrolladores.
1. Adaptación: el jefe del JAD es quien debe adaptar la sesión a las características propias
del proyecto en curso. Para ello debe:
Decidir cuestiones organizativas sobre las sesiones JAD: Número y duración, lugar
(mejor si es fuera de la empresa para evitar interrupciones), fechas, etc.
48 Fase de especicación
Denición de requisitos de alto nivel: esto ya es parte del trabajo productivo. El jefe
del JAD hace preguntas del tipo: ¿Qué benecios se esperan del sistema? ¿Cuáles
son los recursos disponibles? Estos requisitos se van escribiendo en algún medio
que permita que todo el mundo lo pueda ver, por ejemplo transparencias.
Documentar temas abiertos: si un tema queda sin resolver se debe documentar para
otra sesión y asignar una persona responsable de su solución.
Concluir la sesión: el jefe del JAD hace un repaso de la información obtenida con
los participantes. Es el momento de hacer correcciones o añadidos.
Es un subconjunto de las sesiones JAD. Se caracterizan por estar dirigidas a la alta dirección
y en consecuencia los productos resultantes son los requisitos de alto nivel o estratégicos. La
planicación de una sesión consiste en varios pasos:
3. Lugar: es importante que al igual que en la sesión JAD sea fuera de la organización para
evitar interrupciones. La sala de reuniones debe ser además confortable y equipada con el
mobiliario adecuado. Las ayudas audiovisuales pueden ser pizarras, proyectores, etc. Se
debe contar además con ordenadores equipados con herramientas CASE, procesadores de
texto, hojas de cálculo y herramientas de prototipado.
Jefe JRP: debe tener las mismas aptitudes que en el caso del JAD.
2.1 Obtención de requisitos 49
Usuarios de alto nivel: Denen los procesos organizativos y los sistemas de infor-
mación afectados por el plan de sistemas de información y las prioridades de im-
plantación.
5. Redactar la agenda de asuntos a tratar. Esta agenda debe ser planicada asignando tiem-
pos para cada cuestión.
Brainstorming
Este es otro tipo de entrevista de grupo. A diferencia del JAD que está fuertemente estructu-
rada, el brainstorming (tormenta de ideas) se caracteriza precisamente por lo contrario, porque
aunque existe un jefe del grupo, su función es meramente anecdótica. El objetivo es la generación
de ideas novedosas para la resolución de un problema. Su utilización es adecuada al principio
del proyecto, pues puede explorar un problema desde muchos puntos de vista. Una característica
importante es que sirve para encontrar soluciones novedosas.
1. Es fácil (la única norma es que vale todo y no se puede criticar a nadie). Esta técnica es
muy usada por este motivo.
Inconvenientes
1. Preparación
2. Desarrollo: El jefe expone el problema a resolver, entonces cada persona expone sus
ideas para la solución. El jefe da la palabra a una persona u otra. Cuando se han generado
sucientes ideas se termina la reunión. Normas a seguir:
50 Fase de especicación
Se promueven las ideas más creativas aunque no sean factibles para estimular la
creatividad del resto del grupo.
Prototipos
Un prototipo es una versión reducida de la aplicación nal. Se puede construir con dos
losofías[Som98]:
1. Prototipos de desarrollo rápido. Sirven para obtener y validar requisitos. Cuando han
cumplido esta nalidad se desechan.
El segundo caso se ha discutido ya en el capítulo dedicado a ciclos de vida. El primer caso sigue
el proceso indicado en la gura 2.2.
Un prototipo no es utilizable como sistema nal porque se ha desarrollado con la máxima
rapidez y en consecuencia:
2. No hay documentación.
3. El sistema será caro de mantener porque el prototipo habrá sufrido muchos cambios a lo
largo del desarrollo y su estructura estará en mal estado.
Existen tres técnicas de desarrollo rápido de prototipos[Som98] que se pueden usar conjun-
tamente: Lenguajes de alto nivel, Programación de bases de datos y Componentes reutilizables.
Lenguajes de alto nivel: Son lenguajes de gran nivel de abstracción que necesitan menos
líneas de código para hacer lo mismo que en un lenguaje de bajo nivel como C. Ejemplos
de lenguajes de alto nivel son: Lisp, Smaltalk y Prolog. Los lenguajes de alto nivel tienen la
desventaja de cargar mucho al sistema, razón por la cual no están más extendidas, aunque
este motivo es cada vez menos importante dada la potencia de las máquinas actuales.
2.1 Obtención de requisitos 51
Requisitos
iniciales
Desarrollo
prototipo
Evaluación
Especificación
Desarrollo
sistema
Validación
Cuando se desarrolla un prototipo hay que responder algunas cuestiones para escoger el
lenguaje, tales como cual es el mejor lenguaje para el dominio del problema que se está
abordando. Por ejemplo, Lisp y Prolog pueden ser adecuados para inteligencia articial,
Java si se necesita un software multiplataforma, etc. Se deben tener en cuenta asimismo
factores tales como las facilidades suministradas por la herramienta para la construcción
automatizada de interfaces de usuario, la experiencia que tiene con dichas herramientas
el personal con el que contamos, si se puede conectar o forma parte de una herramienta
CASE, etc.
1. No existen todos los componentes necesarios para el prototipo que se quiere desa-
rrollar, con lo que hay que desarrollarlos.
2. Los componentes existen, pero no son exactamente lo que se necesita y hay que
adaptarlos.
1. Nivel de aplicación: Los sistemas que componen la aplicación pueden ser compartidos
por otras aplicaciones. Por ejemplo: se puede insertar un gráco desarrollado con una
aplicación en otra. Las aplicaciones actúan como si estuvieran conectadas entre si al estilo
de las tuberías de Unix.
1. Tienen un constructor predeterminado sin parámetros (es decir, un bean es una clase que
cumple una serie de restricciones)
3. No son nunca clases abstractas, es decir, siempre se pueden crear instancias de ellos.
Casos de uso
Son una forma de especicar los requisitos de un sistema. Un caso de uso consiste en una
interacción de algo externo al sistema y el sistema. Fueron introducidos por Jacobson en 1992.
Aunque es una técnica denida dentro del ambiente del análisis orientado a objetos no tiene que
ver con objetos, se podría utilizar perfectamente dentro del análisis estructurado. Más adelante
veremos la técnica de los casos de uso. Un caso de uso:
Describe la interacción entre un actor externo al sistema y el sistema con texto en lenguaje
natural.
2.1 Obtención de requisitos 53
Representa los requisitos funcionales desde el punto de vista del usuario y por lo tanto
produce un resultado observable por él.
1. Actores: El actor puede ser tanto una persona como otro sistema que juega un rol en la
interacción con el mismo. Un mismo rol puede ser desempeñado por varias personas y
una persona puede desempeñar más de un rol. Un usuario no es un actor, sino que asume
un rol cuando interactúa con el sistema y por lo tanto funciona como un tipo de actor.
1. Identicar los usuarios del sistema. Para ello tener en cuenta para quien se está diseñando
o con que personas va a interactuar de un modo directo (actores principales) y quienes va
a tener un papel de supervisión o mantenimiento del sistema (actores secundarios).
2. Identicar los roles que juegan esos usuarios desde el punto de vista del sistema. Hay
varios tipos, gestores de alto nivel, gente que introduce datos, etc.
3. Identicar otros sistemas con los cuales exista comunicación. Estos sistemas también se
consideran como actores dado que son algo externo a nuestro sistema.
Identicar operaciones Una vez que se tienen los actores se trata de encontrar los casos de
uso, como lo que tenemos en este momento son los actores, partimos de esta base para encontrar
la información que falta. Los actores interactuarán con el sistema realizando un conjunto de
tareas que tendremos que enumerar y manejarán información, tanto la que suministren al sistema
como la que el sistema les suministre a ellos. Una vez que se dispone de los actores y de los casos
de uso hay que encontrar las relaciones que hay entre ellos. Las relaciones que hay entre casos
de uso son de dos tipos:
54 Fase de especicación
Aquellas en las que uno extiende a otro: Son muy parecidos (comparten muchos pasos)
pero tienen ligeras diferencias adaptadas a la forma particular en la que se realiza una
tarea.
Aquellas en las que uno usa a otro: En esta situación un caso de uso es similar a una
función o subrutina que es llamada por otro.
Otra forma de hallar casos de uso es hacer una lista de eventos. Un evento es una ocurrencia a la
que el sistema tiene que responder. No supone un diálogo como un caso de uso porque ocurre de
un modo atómico. Los pasos a seguir en este caso son por un lado identicar todos los eventos a
los que el sistema tiene que responder y luego relacionarlos con los actores adecuados.
Una vez identicados estos casos de uso podemos sacar otros nuevos de varias formas:
Existen diferentes actores que puedan utilizar un mismo caso de uso pero con varia-
ciones signicativas.
Existen diferentes versiones del mismo caso de uso con variaciones signicativas.
2. Buscando el caso de uso opuesto a uno dado, por ejemplo, si tengo dando de alta cliente
podría existir el caso de uso dando de baja cliente
3. Preguntarnos que tiene que ocurrir para que se cumplan las precondiciones de un caso de
uso, por ejemplo, para hacer un pedido es necesario que el cliente entre con su password,
con lo que tiene que existir un caso de uso para dar de alta.
1. Identicar actores
Identicamos roles que juegan. Los estudiantes por un lado consultan datos (asigna-
turas disponibles en las que pueden matricularse) e introducen datos (asignaturas en
las que quedan matriculados). Los profesores tienen los mismos papeles. El jefe de
estudios juega un papel de gestor de alto nivel.
2. Identicar operaciones:
Matricular a un alumno.
Introducir notas.
Modicar notas.
Generar horarios.
Estos tres casos de uso se parecen entre si. Podemos pensar que entre ellos puede haber
algún tipo de relación de herencia. Como la herencia trata de hallar la parte común de-
beríamos buscar el más sencillo. El más sencillo es el de matricular alumno antiguo, los
otros dos son modicaciones más o menos complicadas.
El hecho que un caso de uso haya generado otros dos relacionados entre si por herencia
nos puede hacer pensar que al actor relacionado (alumno) le pasa lo mismo. Lo que está
claro es que un mismo alumno sólo va a emplear uno de los tres casos de uso, aunque no
3
creemos que esto por si solo sea motivo para crear tres tipos de alumno . Si que está claro
sin embargo que se deben hacer tres casos de uso diferentes y relacionados del modo en
el que lo están porque son funciones que dieren ligeramente entre ellas.
Se puede pensar en crear un caso de uso para seleccionar las asignaturas en las que se
matricula un alumno. El criterio para generar el caso de uso o dejarlo como una mera línea
en la descripción de los casos de uso va a ser la complejidad del proceso. Vamos a suponer
3
Esto es subjetivo, la otra solución sería perfectamente válida. La ventaja de esta es no complicar el modelo más
de lo necesario.
56 Fase de especicación
4
que es lo sucientemente complejo , con lo que tendremos el caso de uso Seleccionar
asignaturas, usado por los casos de uso de matriculación.
Hemos visto también que hay un tipo de profesor especial llamado Jefe de estudios. Como
tiene una función especíca dentro de la organización podemos suponer que es un tipo de
actor con algunas características que le distinguen del profesor normal.
Dar detalle a los casos de uso descritos Esto que se ha descrito hasta ahora es la forma de
construir un armazón de casos de uso, veamos como se pueden concretar un poco más. Para cada
caso de uso hay que:
Identicar las precondiciones, o lo que es lo mismo, todo lo que se tiene que cumplir antes
de realizar el caso de uso.
Identicar las postcondiciones; lo que se tiene que cumplir después de realizar el caso de
uso.
• Variantes posibles para realizar este caso de uso. Diagramas de interacción de detalle
(de secuencia o colaboración).
4
Sólo para poner el ejemplo
2.2 Análisis de requisitos 57
4. Se expresa en una tabla con la secuencia de interacciones. La tabla puede tener una co-
lumna con el curso normal de acontecimientos y otra con posibles alternativas. Cada al-
ternativa representa un error o excepción y no tienen suciente entidad como para ser un
caso de uso al que se llegue con una relación extiende.
5. El actor responsable.
Un caso de uso que sólo exista para ser utilizado por otros casos de uso se dice que es
abstracto. Como ese caso de uso no tiene un actor que lo utilice, nos inventamos un actor cticio
(abstracto). La manera en la que se relaciona este nuevo actor cticio con los de verdad es por
medio de la herencia. Por lo tanto, todos los actores que utilicen un caso de uso que a su vez
utiliza un caso de uso abstracto heredarán de él. Un actor puede heredar de cualquier otro, tanto
si es abstracto como si no, con lo que hereda también todas las funcionalidades a las que puede
acceder.
Casos de uso temporales Son aquellos iniciados no por un actor, sino por un evento de reloj.
Se debe indicar el momento en el que esto ocurre, p. ej.: cada 500 milisegundos. La notación
consiste en poner el caso de uso en un óvalo con línea de puntos o con símbolo de reloj.
Casos de uso primarios y secundarios Los casos de uso secundarios son aquellos que
existen por que son necesarios para que el sistema funcione pero que no son inherentes a su
funcionalidad.
Una vez que hemos extraído los requisitos del problema es necesario convertir esos requisi-
tos en un modelo del problema que distinga los elementos que forman parte de los requisitos y
las relaciones entre ellos, así como las funcionalidades esperadas del conjunto. En este apartado
se estudiarán las diferentes estrategias o patrones de modelado del problema.
58 Fase de especicación
Como resultado del análisis de los requisitos especicados inicialmente, se obtiene un mode-
lo del problema que es necesario representar de una manera formal que permita la aplicación de
técnicas sistemáticas para su resolución. Existen diversos lenguajes y métodos de especicacio-
nes que tienen características diferentes según el método posterior del desarrollo. Por ejemplo
diagramas entidad-relación para modelado, diagramas contextuales, plantillas o marcos con-
ceptuales, diagramas funcionales, etc. El método más extendido de representación es mediante
técnicas orientadas a objetos y los lenguajes asociados a ellas.
Ya desde los primeros pasos del desarrollo del software es necesario comenzar a organizar
toda la documentación. En primer lugar se han de gestionar los formatos en los que se va a
escribir la documentación. Preferiblemente se deben utilizar herramientas de ayuda que semi-
automatizan la recopilación de la documentación durante el desarrollo. Evidentemente, tanto las
especicaciones iniciales del problema (en lenguaje natural probablemente) como las especi-
caciones nales de los requisitos (en un lenguaje formal), pasando por los estados intermedios
de análisis y modelado y las diferentes pruebas de validación se deben guardar como parte inicial
de la documentación.
El documento de especicación de requisitos SRS (Software Requirements Specication) es
como el contrato ocial que se establece entre los desarrolladores y los clientes. Incluye tanto los
requisitos funcionales como los no funcionales. Una recolección correcta y completa es crucial
para el desarrollo de un sistema de información exitoso. Para alcanzar el mayor grado de calidad
es esencial que el SRS sea desarrollado de un modo sistemático e inteligible, en cuyo caso
reejará las necesidades del usuario y será útil para todos. Lo que sigue es una plantilla del SRS
según el estándar IEEE 830.
En la portada se indican: Nombre de la empresa, Nombre del proyecto, Número de versión
y Fecha.
El índice debe constar de las siguientes secciones: Introducción, Descripción general, Re-
quisitos especícos, Gestión del cambio del proceso, Aprobación del documento e Información
de soporte. El desarrollo del índice anterior debe contener la siguiente información:
1. Introducción. Las siguientes subsecciones dan una visión general del documento.
2.5 Bases de documentación 59
Se debe ser coherente con especicaciones similares de más alto nivel si existen,
es decir, en el caso de que estas sean las especicaciones de un subsistema.
d) Referencias:
Se especican las fuentes desde las que se pueden obtener las referencias.
2. Descripción general: Describe los factores generales que afectan al producto y sus requi-
sitos. No se denen requisitos especícos (sección 3), sólo su contexto.
a) Perspectiva del producto: Relación del producto con otros similares. Si el producto
es independiente y autocontenido se debe decir aquí. Si es un componente de un
sistema mayor aquí deben estar los requisitos para que el sistema mayor lo pueda
utilizar e identica las interfaces entre el sistema y el software. Se puede poner un
diagrama de bloques para mostrar las interconexiones del sistema con otros e inter-
faces externas.
a
0 Para cada producto se debe incluir: Nombre, Mnemónico, Número de ver-
sión y Fabricante.
0
b Para cada interfaz se debe desarrollar en: motivos para interactuar con el
producto y denición de la interfaz acerca de contenido de los mensajes y
formatos.
c) Restricciones de memoria.
4) Operaciones de backup.
i) Suposiciones y dependencias: Lista de cada uno de los factores que afectan a los
requisitos. No son restricciones de diseño pero un cambio en ellos afectaría a los
requisitos.
a) Interfaces externos: Es una lista detallada de todas las entradas y salidas. Comple-
menta las descripciones de interfaz en el apartado 2b pero sin repetir información.
2.5 Bases de documentación 61
b) Requisitos funcionales: Denen las acciones que el software tiene que tomar para
producir las salidas a partir de las entradas. Ejemplos:
d) Requisitos relativos a bases de datos: Requisitos lógicos que tiene que tener la in-
formación que se deje en la base de datos. Por ejemplo: Tipos de información, fre-
cuencia de uso, etc.
e) Restricciones de diseño: Restricciones de diseño que pueden ser impuestas por otros
estándares, limitaciones de hardware, etc.
f ) Atributos del sistema software: Son propiedades del sistema. El hecho de tenerlas
constituye un requisito. Los más importantes son: Fiabilidad, Disponibilidad, Segu-
ridad, Mantenibilidad y Portabilidad.
h) Comentarios adicionales.
4. Gestión del cambio del proceso: Seleccionar la gestión del proceso de cambio que deba
ser usada para identicar, registrar, evaluar y actualizar el SRS para que reeje el alcance
de los cambios en el proyecto y sus requisitos.
5. Aprobación del documento: Identicar a las personas que deben dar su visto bueno.
Deben constar su nombre, rma y fecha.
6. Información de soporte. Hace que este documento sea más fácil de usar. Incluye índice
y apéndices.
Tutorial posterior
Resumen de contenidos
1. Entrevistas: Consiste en hablar con el cliente. Hay que tener sobre todo conocimientos
de psicología para facilitar la comunicación.
5. Prototipos: Se trata de construir una mini-aplicación inicial para claricar algunos puntos
y luego tirarla o bien para usarla como base para añadir más cosas.
Análisis de requisitos
Características del análisis antes de la existencia de técnica alguna del tema: Monolítico,
ambiguo, difícil de mantener y redundante. Posteriormente (años 70 y 80) surge el análisis es-
tructurado moderno que es gráco y soluciona algunos de los problemas anteriores. Su objetivo
es modelar por separado los datos, procesos y el control usando como nexo común el diccionario
de datos.
2.5 Bases de documentación 63
1. Diagramas de ujo de datos: Se describen los elementos de los que consta, lo que es el
diagrama de contexto y heurísticas para desarrollarlo.
4. Modelo Entidad / Relación: Usado para representar los datos y la forma en la que se
relacionan entre ellos.
5. Diccionario de datos: Se puede denir como el pegamento que mantiene unido a todo lo
anterior. Es una descripción detallada de los datos.
Es la otra forma de ver el problema. Se representa el mundo en función sobre todo de los
datos, características e interrelaciones entre ellos en vez de en función de los algoritmos o fun-
ciones.
Sesión CRC: Es una simulación hecha por personas del funcionamiento dinámico de un siste-
ma orientado a objetos. Se basa en que cada persona representa una clase y su interacción
con las demás. Cada clase tiene escritas sus propiedades en una tarjeta.
Renamiento del modelo: Consiste en otro conjunto de heurísticas para eliminar elementos
sobrantes o identicar otros nuevos en el modelo anterior.
Validación de requisitos
Bases de documentación
Es el documento que resulta de todo lo anterior pero orientado al cliente, es decir, a las
obligaciones contraídas con él, la idea no consiste en usar este documento como entrada para
otra fase. Se ha tomado la plantilla de documento denida por el estándar IEEE 830.
64 Fase de especicación
1. Compare los diagramas del análisis estructurado y los del UML. ¿Existen similitudes?
1. ¿Qué diferencia existe entre los requisitos que se obtienen en una sesión JAD y una sesión
JRP?
2. Si se tiene que construir un sistema novedoso en el que los requisitos están claros pero se
tienen dudas técnicas acerca de la mejor solución discuta que tipos de sesiones serían las
más adecuadas.
3. Un videoclub tiene diferentes tipos de precios para sus películas en función de su cate-
goría. Cada película tiene un código y aunque haya varias películas con el mismo título
el código es distinto para cada una. Los datos que interesa guardar de cada película son:
Título, Director, Actores principales, Localización, Categoría y Código. Los clientes tie-
nen asignado un Código de cliente y se conoce también su Nombre, Dirección, Teléfono.
El videoclub hace préstamos a sus clientes por dos días y se podrá sancionar a quien se
retrase según el número de días.
Fase de diseño
3.1.1. Patrones
En otras ramas de la ingeniería establecidas desde hace más tiempo, existen prototipos de
soluciones estándar para problemas conocidos, por ejemplo, los tornillos siguen una normativa
en cuanto a diámetro de la rosca, longitud, material, forma de la cabeza, etc. Los patrones se
pueden ver como un intento de hacer eso mismo pero a diferentes niveles de abstracción.
Es frecuente encontrarse con el mismo tipo de problema más de una vez. Si se ha diseñado
una solución para ese problema sería deseable ahorrar trabajo de algún modo. Un patrón da una
solución ya ensayada para un tipo de problema. La idea partió en un principio del arquitecto
Christopher Alexander en los años 70.
Un patrón de diseño identica las clases y sus instancias, sus papeles y colaboraciones y la
distribución de responsabilidades.
Un anti-patrón es un error y las consecuencias que se deducen de él. Hay dos tipos:
Un framework (suele traducirse por armazón pero usaremos el término inglés) es un conjunto
integrado de componentes que colaboran para proporcionar una arquitectura reutilizable para
una familia de aplicaciones.
65
66 Fase de diseño
El tamaño: los patrones son elementos arquitectónicos más pequeños (un framework pue-
de contener varios patrones).
Tipos de patrones
Patrones de diseño: son esquemas para renar los subsistemas o componentes de un sis-
tema o las relaciones entre ellos. Describen estructuras de comunicaciones entre compo-
nentes en un contexto.
Patrones de codicación: es un patrón de bajo nivel que describe como implementar as-
pectos particulares de los componentes o relaciones entre ellos con un lenguaje de progra-
mación.
La diferencia entre unos tipos y otros está tanto en el nivel de abstracción como en el
contexto en el que son aplicables.
Además de esta clasicación general se pueden encontrar otros tipos de patrones para si-
tuaciones más especícas como programación concurrente, interfaces grácas, organización y
optimización del código, etc.
Para que un patrón se pueda considerar como tal debe pasar unas pruebas llamadas test de
patrones, mientras tanto recibe el nombre provisional de proto-patrón. Según Jim Coplien un
patrón debe cumplir con estos requisitos:
Soluciona un problema.
La solución no es obvia.
Ha sido probado.
Descripción de un patrón
3. Contexto: son las precondiciones que se han de dar para que el patrón sea aplicable.
5. Solución. relaciones estáticas y reglas dinámicas que describen como realizar la función.
Es una descripción que puede tener diagramas y texto que muestra la estructura del pa-
trón, sus participantes y sus colaboraciones. Esta solución no muestra sólo la estructura
estática, sino también el comportamiento dinámico. En la descripción se incluyen además
las posibles trampas que puedan existir y las variantes de la solución.
7. Justicación: es una explicación de porque se sigue cada uno de los pasos y del patrón
como un todo.
8. Patrones relacionados.
Patrones arquitectónicos
La arquitectura divide la aplicación en las partes que la componen. Este paso es el primero
y supondrá la futura división del trabajo en los diferentes grupos.
1. Sistemas genéricos
Layers: organiza la estructura de las aplicaciones que pueden ser divididas en grupos
de subtareas en las que cada una de ellas tenga un nivel de abstracción. El ejemplo
más representativo de este patrón es la arquitectura de siete niveles OSI (físico, en-
lace, red, transporte, sesión, presentación y aplicación.) donde se deniría una clase
para cada nivel.
Tuberías y ltros: está pensado para aplicaciones que manejan corrientes de datos.
Cada paso del proceso se encapsula en un ltro. Los datos se pasan a través de
tuberías entre ltros adyacentes. Se deniría una clase tubería, una clase genérica
ltro y una clase por cada ltro concreto por donde deban pasar los datos. Ejemplo:
La estructura de un compilador (análisis léxico, sintáctico, semántico, generador de
código intermedio, optimizador y generador de código nal).
Pizarra: contiene una estructura de datos llamada pizarra en la que varios procesos
pueden escribir una solución parcial al problema. En este caso el sistema se des-
compone en la pizarra y en los diferentes subsistemas. Es apropiado para sistemas
expertos o no deterministas.
2. Sistemas distribuidos
68 Fase de diseño
Broker: se tienen varios sistemas diferentes que interactúan entre ellos. El broker es
el elemento que coordina la comunicación y gestiona los errores.
3. Sistemas interactivos
4. Sistemas adaptables
Microkernel: se tiene por una parte un núcleo de funcionalidad y por otro una fun-
cionalidad extendida y partes especícas de cada cliente. El microkernel funciona
además como un punto de conexión al que se podrán añadir extensiones a las que
gestionará. Se ha utilizado en la construcción de sistemas operativos. Es adecuado
para sistemas que van a ser sometidos a cambios en sus requisitos.
Patrones de diseño
El problema del diseño es que es la etapa difícil del ciclo de vida por estar menos sistemati-
zada y su calidad depende sobre todo de la experiencia del personal. Un patrón de diseño puede
aliviar esa dicultad al tener guardada en si la experiencia de los diseñadores que lo crearon, que
pueden no formar parte del equipo actual.
Los patrones de diseño han sido clasicados. Una de las clasicaciones es la del libro Pat-
terns in java (volume 1), según la cual hay seis categorías (se exponen también los patrones de
cada una). Durante el diseño se trata de identicar situaciones en las que sonaplicables.
No es necesario estudiar en detalle la siguiente lista, sólo es una panorámica general.
1. Fundamentales: son los más importantes y los más utilizados en la denición de otros
patrones.
Interface: una clase utiliza los servicios suministrados por instancias de otras clases
a través de un interfaz.
Inmutable: pensado para objetos referenciados por muchos otros o accedidos por va-
rios procesos concurrentes de modo que no cambie su estado después de ser creados.
Marker interface: son para clases que utilizan interfaces que acceden a objetos sin
hacer suposiciones acerca de la semántica de tales objetos.
Proxy: utilizado para que un objeto A (cliente) haga llamadas a otro B (servidor) a
través de un tercer objeto C que actúa como representante de B.
2. De creación: describen cómo crear objetos cuando hay que tomar alguna decisión.
Factory method: dene una interfaz para crear un objeto, pero la elección de la clase
que se va a instanciar se decide en tiempo de ejecución. Los objetos de las subclases
tienen una interfaz común.
Abstract factory: este patrón permite, al igual que el anterior, crear objetos partiendo
de un conjunto de clases abstractas de las cuales heredan clases concretas.
Builder: un objeto cliente crea otro objeto especicando tipo y contenido pero sin
detalles acerca del objeto creado.
Prototype: un objeto crea objetos sin conocer su clase o detalles de los mismos dando
objetos prototipo a un objeto de creación que se encarga de ello haciendo copias de
esos objetos prototipo.
Singleton: es el caso en el que se quiere garantizar que sólo se crea una instancia de
una clase.
Object pool: gestiona un objeto para que pueda ser reutilizado cuando es cumpu-
tacionalmente costoso crear instancias de ese objeto.
3. De partición: dan una guía sobre como dividir los casos de uso y actores en clases.
Filter: permite que un conjunto de objetos con la misma interfaz y que realizan
distintas operaciones sobre datos puedan de un modo dinámico conectarse en el
orden en el que se realizan las operaciones.
Adapter: es como un puente entre dos clases con interfaces incompatibles que per-
mite que puedan relacionarse.
Facade: es una forma de crear una interfaz unicada para manipular un conjunto de
objetos.
Flyweight: trata el caso cómo crear una sola instancia en vez de muchas cuando
contienen la misma información. Está pensado para mejorar la eciencia.
Dynamic linkage: permite que un programa solicite cargar clases que implementan
un interface conocido.
Cache management: se tiene una copia de los objetos que son costosos de construir
para acelerar el acceso a los mismos.
Little languaje: si la solución a varios problemas se puede expresar como las combi-
naciones de una serie de operaciones del tipo creación o búsquedas en estructuras de
datos y asignación de valores este patrón dene un lenguaje con estas operaciones
para resolver un conjunto de problemas.
Mediator: modela una clase cuya responsabilidad es controlar y coordinar las in-
teracciones de un grupo de objetos. Encapsula el comportamiento colectivo en una
clase mediadora.
Snapshot: es una vista de un objeto sin información temporal acerca de él. El objeto
puede ser capturado o restaurado.
State: es útil cuando un objeto tiene que cambiar su comportamiento cuando cambia
su estado. Cada estado queda encapsulado como un objeto separado.
Null object: cuando no existe un objeto se denota con un puntero a null, el problema
de esto es que supone añadir estructuras de control que comprueben si el objeto es
null antes de hacer algo. La alternativa es denir un null object, que es un objeto que
3.1 Conceptos y elementos del diseño 71
no hace nada.
Template method: si se tiene un algoritmo que tiene una secuencia ja de pasos y
uno o más de los pasos son variables este patrón lo que hace es poner cada paso
variable en una función abstracta, después extiende la clase con una clase derivada
que implementa la variación que se necesita.
Visitor: una forma de realizar una operación es implementar la lógica de esa opera-
ción en los objetos involucrados. El patrón visitor es una alternativa a esta opción
que implementa esa lógica en una clase separada visitor. Las ventajas son que no se
complican las clases de los objetos involucrados y que se pueden usar varias clases
visitor distintas.
Acceso a recursos compartidos. el problema que se debe resolver son los interblo-
queos.
Single threaded execution: evita que se hagan llamadas concurrentes que accedan a recur-
sos compartidos al mismo tiempo.
Guarded suspension: impide que se llame a un método hasta que se cumpla una precon-
dición.
Balking: hace que se retorne de un método sin hacer nada en el caso de que el objeto no
esté preparado para procesar la llamada.
Scheduler: dene una política sobre cuando se permite que un thread use un recurso com-
partido.
Para realizar el diseño de una solución a un problema concreto se pueden utilizar diferen-
tes enfoques, según se basen en los datos en la funcionalidad o en la interacción. En este tema
se describen los dos métodos más utilizados: estructurado y orientado a objetos. El diseño es-
tructurado con estilo procedimental (o funcional) descendente, en el cual se van renando y
dividiendo los módulos funcionales de la solución, se basa en la utilización de los elementos:
secuencia, condición y repetición.
El otro tipo de métodos de diseño es el diseño orientado a objetos, que se basa en dividir
jerárquicamente los elementos del diseño (objetos) y encapsular conjuntamente los datos con
sus funciones de acceso, de forma que la interacción se realiza por paso de mensajes entre los
objetos.
1
Es el paradigma que se empezó a seguir a partir de la década de los 80. A continuación
veremos los conceptos más importantes.
2
El concepto central en orientación a objetos es la clase. Una clase es una forma de llamar
por el mismo nombre un conjunto de cosas que comparten características comunes. Por ejemplo
podríamos pensar en una clase llamada NumeroComplejo. Un número complejo está formado
por dos números reales (uno es la parte real y otro la imaginaria) y esos dos números son los
atributos que describen el objeto. Un objeto es un individuo concreto que pertenece a la clase
NumeroComplejo, por ejemplo (3, 4i).
Figura 3.1: Representación en UML de una clase. Tiene Nombre de la clase, Atributos y Métodos
Otra cuestión es que posiblemente queramos tener rutinas manipular esos números: suma,
escribir por pantalla, etc. Cada una de esas rutinas las llamamos métodos.
Denición de clase
1
El concepto de objeto surgió a mediados de los 60 gracias a dos noruegos: Dahl y Nygaard, que desarrollaron el
primer lenguaje orientado a objetos: Simula 67
2
La palabra clase viene de clasicador
3.3 Diseño orientado a objetos 73
Primera denición (de andar por casa): Una clase es un conjunto de atributos (≡ datos) y de
métodos (∼
= funciones ∼
= procedimientos ∼
= rutinas) con los que se manipulan dichos datos ≡
Estructura de datos.
Las clases suelen representar cosas que existen en el mundo real. Por ejemplo: La clase
Estudiante la podemos denir con los atributos: Nombre, Apellido1, Apellido2, NIF, etc. Podría
tener los métodos: irAula() (Mueve al estudiante del punto A al punto B dada una ruta), ha-
llarRuta() (este método averigua la ruta mencionada antes y es usado por el método anterior),
etc.
Los métodos públicos son aquellos que pueden ser invocados por otros objetos. El con-
junto de métodos públicos es lo que se conoce como la Interfaz del objeto. En este ejemplo,
irAula() sería un método público, el método hallarRuta() sería un método privado que solo los
objetos de la clase Estudiante serían capaces de invocar cuando necesitasen ir de un punto a otro
y por tanto no formaría parte de su interfaz.
Segunda denición (un poco mejor): Una clase es algo que tiene responsabilidades. Pueden
ser de dos tipos: De comportamiento, que se implementan con métodos y de estado, que se
implementan con datos.
½
Comportamiento (Métodos)
Responsabilidades
Estado (Datos)
Una responsabilidad es como un contrato entre dos partes, es algo que una clase se
compromete a hacer a cambio de otra cosa. En el ejemplo anterior la clase Estudiante tiene la
responsabilidad de saber llegar al aula x. En general, cuando una clase A invoca un método de una
3
clase B, A es responsable de que los parámetros que se pasen a B sean coherentes (precondición)
y B es responsable de que se devuelvan resultados correctos (postcondición).
Encapsulamiento: una clase debe ocultar los detalles de cómo está implementada y en ge-
neral toda aquella información que no sea imprescindible para manipularla. En el ejemplo del
estudiante el método hallarRuta() no es conocido por las otras clases. El encapsulamiento reduce
la complejidad.
3
La denición de coherencia dependerá del dominio de aplicación
74 Fase de diseño
Ejemplo: un Abonado es una persona que usa un Teléfono. Cuando un abonado quiere hablar
puede usar el teléfono para llamar a otras personas y colgar cuando acaba la conversación.
Existen dos tipos de teléfonos: Móvil y Fijo. Un teléfono sea del tipo que sea se compone de un
Teclado, un Altavoz y un Micrófono.
Asociación: Es una relación que existe entre dos clases. En el ejemplo anterior la clase Abo-
nado está relacionada con la clase Teléfono. Una asociación se suele implementar en el código
con un puntero dentro de un objeto de una clase a la otra. Una composición es un tipo de aso-
ciación entre clases del tipo es parte de. Un teclado, un altavoz y un micrófono son parte de un
(y solo un) teléfono.
Herencia: Es una relación entre clases cuando una es un tipo de la otra. En el ejemplo, las
clases Móvil y Fijo son tipos de teléfonos. Se dice que la clase Teléfono es padre de Móvil y Fijo.
La herencia permite encapsular en una clase antecesora los aspectos comunes de las clases hijas.
Se dice que una clase es abstracta cuando no se pueden crear instancias de objetos partiendo
de ella. En el ejemplo todos los teléfonos son o jos o móviles, así que no sería posible crear un
objeto de la clase Teléfono porque hay que concretar de qué tipo sería. La nalidad de Teléfono
es especicar la parte compartida de la interfaz.
Una colaboración es una solicitud hecha por un objeto a otro. Para identicarlas, se debe
examinar cada par clase-responsabilidad con el n de determinar si es necesario que la clase
interactúe con otra/s para llevar a cabo esa responsabilidad. En el ejemplo anterior un abonado
debe usar una instancia de la clase teléfono para poder hablar con otro abonado.
Para cerrar un paso en la fase de diseño es necesario hacer la validación de los resultados ob-
tenidos y comprobar si cumplen con las especicaciones de requisitos que eran la entrada a esta
fase. Se trata de un conjunto de actividades para garantizar que se esta construyendo el producto
correcto de la manera adecuada. Cada una de las actividades del diseño deben estar reejadas
en los planes del mismo, estos planes se actualizaran cuando sea necesario para adaptarse a los
cambios que vayan surgiendo pero cada cambio deberá ser revisado y aprobado.
Debe existir un procedimiento de control de diseño que especique cómo se planica y
desarrolla. Por otra parte, la información de entrada al diseño, que es la resultante de la fase
anterior debe incluir además de los requisitos del usuario cosas tales como requisitos legales y
regulaciones que se apliquen al proyecto. Las entradas al diseño deben tener en cuenta cualquier
modicación del contrato. Los resultados del diseño deben ser documentados de forma que se
pueda hacer una vericación y validación de los mismos.
Durante el proceso de diseño se deben planicar algunas revisiones formales del trabajo que
se va realizando. Los participantes son todas aquellas personas involucradas en el diseño que se
esté revisando, así como representantes del cliente. Cuando nalice la revisión se debe redactar
un documento con el resultado de la revisión y las partes afectadas. La forma de revisar el diseño
estará documentada en el procedimiento de control del diseño.
Pruebas y demostraciones
Garantiza que el producto cumple con los requisitos denidos por el cliente. Se realiza des-
pués de la vericación si esta fue satisfactoria. Una validación se realiza en un entorno operativo
normal. También esto se realizará conforme al procedimiento de control del diseño.
será el elemento clave para la fase siguiente de implementación que debe seguir elmente los
dictados del diseño.
Para dejar constancia de los diseños se deben utilizar lenguajes lo más formales posible,
como tablas, diagramas y pseudocódigo, que en algunos casos pueden permitir incluso la utili-
zación de herramientas para automatizar parcialmente el proceso de construcción del código en
la siguiente fase de implementación.
Tutorial posterior
Resumen de contenidos
2. Intercambio de información entre subsistemas: Hay dos opciones: con una base de
datos central o por medio de mensajes.
Sistemas distribuidos: Son un tipo especial de sistema que merece un tratamiento aparte debi-
do a que parece ser la tendencia actual. Hay varios tipos de arquitecturas:
Diseño estructurado
Es el análisis clásico. Esta basado en el ujo de los datos a través del sistema. En una pri-
mera fase se hace un diseño preliminar y posteriormente un diseño detallado. Objetivos: Com-
prensión, mantenibilidad, facilidad de pruebas e integración con otras aplicaciones. Principios:
Abstracción, modularización, independencia, arquitectura, ocultamiento de la información y re-
namiento paso a paso. Sus elementos importantes son:
3. Cohesión: un módulo es cohesivo si sus tareas se realizan con independencia del sistema
pero relacionadas entre sí.
Diseño detallado: es una especicación con mayor nivel de detalle de las estructuras de datos
y algoritmos.
Otras notaciones que forman parte de metodologías pensadas en torno al diseño estructurado
(no se tratan en este curso) son las siguientes:
1. Diagramas HIPO: muestran entradas, salidas y funciones. Muestran lo que hace el sistema
pero no el cómo.
Como se ha dicho antes, es la otra forma de hacer el diseño. Se incluye también en este
resumen el diseño arquitectónico por ser parte integrante de la metodología, aunque lo dicho en
el apartado anterior dedicado al tema es igualmente válido. Hay dos partes:
Documentación
Se incluye una plantilla para redactar el documento correspondiente al igual que en la fase
anterior.
78 Fase de diseño
1. ¿Cuáles son las principales diferencias entre el diseño estructurado y el orientado a obje-
tos?
4. {Este ejercicio no se tratará en este curso} ¿Qué es necesario para que un objeto pueda
invocar los servicios de otro en CORBA?
5. {Este ejercicio no se tratará en este curso} ¿Cuál es la secuencia de pasos que ocurre
cuando un cliente utiliza los servicios de un servidor en CORBA? ¿Podría el servidor ser
cliente de su cliente?
6. ¿Qué nivel de acoplamiento hay entre dos módulos A y B donde A utiliza una función de
B pero ambos manipulan el mismo conjunto de variables globales?
Capítulo 4
Fase de implementación
Durante el desarrollo de la fase de implementación se deben realizar dos tipos de labores re-
lacionadas con la comprobación del código obtenido. La primera consiste en elaborar los conjun-
tos de prueba para los diferentes módulos que se programan. La segunda consiste en comprobar
si los módulos cumplen las especicaciones de diseño con esos conjuntos de prueba. También
se puede incluir dentro de este proceso la comprobación de corrección en la ejecución de los
módulos y evitar posteriormente la aparición de errores frecuentes como pérdidas de memoria,
comportamientos extraños ante entradas de datos imprevistas, etc.
Distinguiremos tres tipos de comentarios desde el punto de vista de la parte que comentan y
dónde se localizan.
79
80 Fase de implementación
Directorio: Son los situados al principio de cada módulo. La información que contiene es:
Lista de funciones o clases implementadas en el módulo, Versión, Fecha, Programador,
Copyright e Interfaces con otros módulos.
Prólogo: Cumple la misma función que el directorio pero para cada función o método.
Indica la siguiente información: Finalidad, Comentarios acerca de las variables signica-
tivas, Descripción general del funcionamiento e Información para la reutilización (efectos
colaterales, variables globales que utiliza, etc.)
Explicativo: Aclaraciones acerca de partes del código. Hay dos tipos: de línea y de bloque.
Las ventajas de los comentarios de bloque es que están localizados en un punto concreto y
no dispersos por varias líneas entre el código, con lo que además son fáciles de modicar.
Los comentarios de una línea deben ponerse en la misma línea del código que se esta
comentando y se usan para explicar sentencias complicadas.
Los tipos de comentarios según cómo están redactados son estos cinco (de peor a mejor):
Repetir el código: Consiste en expresar el código de otra forma pero sin añadir informa-
ción signicativa. Este tipo de comentarios son innecesarios.
Marcadores: Son notas temporales para la gente que trabaja en el proyecto. Se eliminan
cuando el proyecto naliza.
Los datos se deben comentar cuando el nombre no sea suciente como para que se entien-
da. Si un dato se compone de otros más pequeños aplicar esta misma regla recursivamente
caso de ser necesario.
Tutorial posterior
Resumen de contenidos
para pasar el diseño a código fuente y como redactar este código fuente en un conjunto de len-
guajes.
Estilo de programación orientado a objetos: Son un conjunto de consejos para conseguir: reusa-
bilidad, reconocer la herencia, construir métodos extensibles, código robusto y trabajo en
grupo ecaz.
Normas para programadores en C: Son un conjunto de normas que cubren todos los aparta-
dos de la codicación, tanto del tamaño de los cheros, como de la elección de nombres
(quizás lo más importante), indentación, etc.
Normas para programadores en C++: Es una recopilación similar para el lenguaje C++. Es
más extenso debido a la complejidad del lenguaje. Estas normas fueron compiladas por
Ellmentel Telecomunications System Laboratories.
Normas para programadores en Java: Es un resumen de las normas publicadas por S UN para
el lenguaje Java.
Técnicas de depuración
Al igual que el diseño el análisis producen documentos según una plantilla estándar, el có-
digo tiene que tener una documentación interna. Se distinguen los tipos de comentarios (Direc-
torio, prólogo y explicativo), donde se colocan, que información se incluye en cada uno de ellos
y la forma de redacción de la información.
}
}
Escriba comentarios.
2. Suponga que tiene un programa en C++ que calcula un fractal y lo dibuja como una ima-
gen en la pantalla. Para estas funciones utiliza un módulo con una estructura de datos que
dene los números complejos y las operaciones relativas a ellos: Producto, Suma, Resta,
Potencia. A cada punto de la pantalla se le aplica un algoritmo, lo cual estaría en otro
módulo. Se tendría otro módulo con las funciones relativas a los grácos: Dibujar matriz
de puntos, Zoom, etc.
Redacte la documentación de cada módulo del programa: prólogo y comentarios antes de
cada función (haga las suposiciones que considere oportunas sobre que funciones existi-
rían).
Capítulo 5
Fases de pruebas
Existen diferentes técnicas para realizar las pruebas de vericación del software en diferentes
fases. La mayoría hacen uso de las características de modularidad del diseño e implementación
para ir integrando de forma ascendente o descendente los módulos de diferentes niveles.
Como en toda fase, todos los elementos preparados para las pruebas y los resultados de las
mismas deben ser documentados y adjuntados a cada versión correspondiente de los productos
de las fases anteriores. Esta forma de proceder evitará la repetición de pruebas y facilitará la
preparación de nuevas pruebas a partir de otras anteriores.
Plan de pruebas
Son un conjunto de actividades que pretenden demostrar que el producto cumple con lo
estipulado en el contrato. En el plan de pruebas se especica:
1. Identicador del plan: debería ser una palabra que lo identicase con su alcance. Debe
incluir además la versión y fecha.
3. Items a probar: conguración a probar y condiciones que se deben satisfacer para ello.
4. Estrategia: técnica y herramientas que se van a utilizar. Hay que indicar el número mí-
nimo de casos de prueba que se van a realizar y el grado de automatización tanto en la
generación de casos de prueba como en la ejecución
Repetido.
83
84 Fases de pruebas
6. Documentación: Según el estándar IEEE 829-1983 hay que producir los siguientes docu-
mentos:
Plan de prueba.
Bitácora de pruebas.
Resumen de pruebas.
7. Procedimientos especiales: grafo de las tareas necesarias para preparar y ejecutar las prue-
bas, así como habilidades necesarias.
10. Riesgos: riesgos del plan, acciones para mitigarlos y planes de contingencia.
Pruebas funcionales: se realizan con los datos de entrada normales en el uso diario del
sistema. Se comprueban sobre todo valores en los límites de las variables y un poco más
allá de los límites. También algunos valores especiales.
Pruebas de tensión: se trata de sobrepasar los límites de tolerancia del sistema de varias
maneras, por ejemplo: conectar más usuarios al sistema de los permitidos, si se tienen que
gestionar x mega-bits por segundo de una línea de comunicaciones probar a aumentar a
x + 1, etc.
Tutorial posterior
Resumen de contenidos
Vericación y validación
Se abordan un conjunto de actividades y tareas para garantizar que se da una respuesta positiva
a esas dos cuestiones. Uno de los puntos importantes es que la V&V debe ser independiente, es
decir, no pueden hacerlo las mismas personas que están construyendo el producto. Esta indepen-
dencia se debe dar tanto en la gestión como en la nanciación. Las tareas de V&V se contemplan
desde tres perspectivas: sistemas genéricos, sistemas expertos y software reutilizado, y en todas
y cada una de las etapas del ciclo de vida.
Se trata en esta sección de realizar las pruebas que den una garantía acerca del código. Se
introducen los conceptos de Error, Defecto y Fallo. Se denen un conjunto de principios que
debe seguir toda prueba:
Casos de prueba: Es un conjunto de entradas y salidas esperadas para ellas. Existen dos tipos
de pruebas: de caja blanca y de caja negra. Existe un método para crear casos de prueba
para casos de uso.
Cleanroom: Es una metodología de desarrollo pensada para producir software muy able.
Calidad del software: El modelo de McCall tiene en cuenta una serie de factores de calidad.
Documentación de pruebas
Como en los demás capítulos este es el apartado donde se pone sobre el papel el trabajo reali-
zado con un documento llamado plan de pruebas que es un documento que pretende demostrar
que el producto cumple con lo estipulado en el contrato.
86 Fases de pruebas
Ejercicios
B C D
E F G
b) Si se considera que el módulo B hay que probarlo cuanto antes, porque es problemá-
tico, ¿cuál es el orden de integración hasta llegar a B con integración ascendente.
Si en algún caso hay más de un módulo para integrar escoger por orden alfabético.
Solución
b) Orden: E, H, F, B, ... (El resto de los módulos ya no importa porque hemos llegado
a B)
2. Sea un algoritmo que para dos intervalos de fechas consecutivas denidos por sus fechas
de comienzo y n (I1 , F1 para el primero y I2 y F2 para el segundo) devuelve verdadero (V)
si alguna fecha coincide en ambos intervalos, incluidas las de comienzo y n, y falso (F)
en caso contrario. Se pide: programación en pseudolenguaje, grafo de ujo, los caminos
independientes, la complejidad ciclomática y los casos de prueba.
I1 F1
I 2 F 2
Solución Algoritmo:
a) Programación en pseudolenguaje:
if F2 < I1
then Falso
else if I2 > F1
then Falso
else Verdadero
b) Diagrama y Grafo de ujo
F2<I1 1
No
Sí
I2>F1
2
Sí
No
Verdadero Falso 4 3
Fin 5
c) Caminos independientes:
Camino 1: 1-3-5
Camino 2: 1-2-3-5
Camino 3: 1-2-4-5
d) Complejidad ciclomática:
O bien:
e) Casos de prueba:
Camino 1: F2 = I1 − 1, I1 = F2 − 1
88 Fases de pruebas
Camino 2: F2 = F1 + 2, I1 = F2 − 1
Camino 3: F2 = I1 , I1 = F2 − 1
3. ¿Cuáles son los motivos por los que es conveniente que las actividades de V&V sean
realizadas por un equipo independiente?
4. ¿Cuándo es mejor hacer la V&V, después de construir el producto, antes, después de una
etapa concreta, ...?
a=a−3*b
si
a>1000
no
a<100
no si
Write(msg)
¿Hay algún bucle? ¿De qué tipo? ¿Cuántas veces conviene ejecutarlo?
Capítulo 6
Dentro del ciclo de vida del software, y como en cualquier actividad de ingeniería, es nece-
sario tener presente la nalidad del desarrollo y la obligación de entrega del producto acabado
al cliente. Una vez que el sistema ha pasado las pruebas se trata de entregárselo al cliente y
ponerlo en condiciones de empezar a funcionar. La estrategia de implantación se decide desde
la fase de especicación y se tiene en cuenta tanto la cobertura global como la geográca. Es
recomendable hacer las siguientes consideraciones:
2. Tipo de medios para cada parte del software, incluyendo formato y versión en lenguaje
legible por humanos.
6. Instalación.
89
90 Fase de entrega y mantenimiento
6.1.1. Aceptación
Se dice que el proyecto ha nalizado cuando todas las actividades técnicas han terminado o
se ha agotado su plazo y se han facturado todos los conceptos al cliente (se hayan cobrado o no).
Para evitar problemas en el momento en el que se pide al cliente su aceptación se debe redactar
un documento que especique claramente los requisitos (lógicamente este documento se redacta
en la fase de especicación). Una vez que el cliente lo rma acepta que está conforme.
• Informe económico.
1. Indicadores económicos:
Margen del proyecto: Diferencia entre ingresos y costes, en valor absoluto y en por-
centaje.
Componentes del coste del proyecto. Son los porcentajes del coste total del proyecto
dedicados a cada uno de estos apartados.
2. Indicadores nancieros:
Porcentaje de endeudamiento interno (propio): Son los gastos que en caso de im-
pago la empresa debería cubrir. Es el complementario del anterior. Porcentaje de
endeudamiento externo + Porcentaje de endeudamiento propio = 100 %.
Valor actual neto del proyecto: es un método para calcular el valor presente de un
determinado número de ujos de caja futuros teniendo en cuenta una tasa de interés
i.
n
Fi
VAN =∑ (6.1)
i=1
(1 + r)i
Donde: Fi son los ujos monetarios del proyecto, n es el número de años o meses
desde que se produjo el ujo monetario y r es la inación anual o mensual acumulada
desde entonces.
Tasa interna de retorno (tasa de rendimiento interno (r) : es el interés que hace que
el VAN sea 0. Se puede utilizar para comparar diferentes inversiones. Se escoge la
que tiene el T IR más alto.
n
Fi
VAN = −I + ∑ =0 (6.2)
i=1
(1 + r)i
Índice de ocupación.
Plazo de ejecución.
Margen.
Contingencias.
Adicionalmente a las revisiones durante el proceso de desarrollo inicial del software, tam-
bién hay que considerar las posibles modicaciones y revisiones como consecuencia del mante-
nimiento y actualización del mismo.
También hay que considerar la posibilidad/certeza de que el cliente solicite cambios posterio-
res no previstos inicialmente, es decir, hay que estar preparados para esta posibilidad.
La documentación global del producto es una parte integral del mismo. En esta fase es
necesario reunir todos los documentos generados y clasicarlos según el nivel técnico de sus
descripciones. Es muy importante distinguir entre la documentación orientada a futuros desarro-
llos o modicaciones de mantenimiento (documentación de diseño, implementación y pruebas,
manual técnico, manual de referencia), y la documentación de uso y aplicación (introducción de
uso rápido, manual de conguración, manual de usuario, manual de interfaz). Cuando ha nali-
zado el proyecto se debe tener una documentación útil para el mantenimiento posterior y para la
operación normal por parte de los usuarios. Esta sección es una enumeración bastante exhaustiva
de esta documentación.
2. Facilita la auditoría. Una auditoría es un examen del sistema que se puede hacer desde
varios puntos de vista. Por ejemplo, una auditoría permite saber si se están cumpliendo
plazos o las normas de la empresa en la redacción del código.
6.3 Recopilación y organización de documentación 93
En general todos los tipos de documentos deben tener un estilo homogéneo, para ello se debe
seguir un formato que tenga estos elementos:
Respecto a la forma. P. ej: Tipo de letra Times new roman 11pt, los párrafos se
indentarán con cuatro espacios, etc.
4. Se deberían usar las mismas herramientas de proceso de textos para todos los documentos,
preferiblemente de alguna que haya demostrado su continuidad en el tiempo, por ejemplo,
L
AT X, porque nunca se sabe cuanto durará el mantenimiento (quizás décadas).
E
5. Se cuidará en especial la claridad de expresión; los manuales deben tener ejemplos.
6. Los diagramas deben tener distribuidos los elementos de un modo lógico, no se deben
poner demasiados elementos en un único diagrama.
9. Consistencia interna: No debe haber contradicciones entre diferentes partes del documen-
to. Esto suele ocurrir cuando se hacen cambios durante el mantenimiento y no se revisa
correctamente toda la documentación.
Veremos ahora una lista de documentos. En un proyecto no es necesario que estén todos, sobre
todo en proyectos pequeños donde posiblemente no se haga un análisis de riesgo o un análisis
coste-benecio.
La información que se recoge en estos documentos deberá ser actualizada durante el man-
tenimiento o cuando se hagan cambios en los requisitos durante el desarrollo para conservar la
consistencia entre lo que dice la documentación y la realidad.
5. Plan de proyecto: Dene los objetivos y actividades para cada fase. Incluye estimaciones
de recursos y objetivos de los hitos a lo largo de todo el ciclo de vida. Es donde están
denidos los procedimientos para diseño, documentación, noticación de problemas y
control del cambio. Se detallan las herramientas y técnicas seguidas.
6. Requisitos funcionales: Son una lista de los servicios que suministra el sistema a los usua-
rios, que estarán denidos en términos cualitativos y cuantitativos. También están los re-
quisitos de seguridad y control interno.
9. Especicaciones del programa: Es otro documento dirigido a los desarrolladores. Son los
requisitos, entorno operativo y características de diseño de cada uno de los ejecutables.
10. Especicaciones de la base de datos: Descripción física y lógica de la base de datos junto
a las especicaciones de seguridad y control.
11. Pruebas: Estrategia de pruebas del sistema, con especicaciones detalladas, descripciones
y procedimientos, así como datos de prueba y criterios de evaluación.
12. Manual de usuario: Describe las funciones del sistema. No debe usar jerga técnica.
13. Manual de operación: Describe el software y el entorno operativo en el que puede funcio-
6.3 Recopilación y organización de documentación 95
nar el software.
14. Manual de mantenimiento: Información acerca del código fuente, sistemas y subsistemas
para que el equipo de mantenimiento pueda entender el funcionamiento del programa y
hacer cambios.
15. Plan de instalación: Una vez que el sistema haya superado todas las pruebas está listo para
ser instalado. Este manual describe como se realiza el proceso en diferentes entornos.
Recursos
1. El usuario debe saber introducir los datos de entrada y obtener los de salida.
3. Es deseable que una parte del mismo pueda servir como tutorial del sistema.
Es importante tener en cuenta a qué personas va dirigido el manual; no se redacta igual para
un directivo, que probablemente esté más interesado en una visión general del sistema que no
va a usar directamente que a un empleado de base que se dedica a introducir algunos datos, o
que a un miembro administrativo que usará el sistema para por ejemplo sacar estadísticas de
ventas. Como existen diferentes perles de utilización el manual de usuario deberá reejar esto
estructurándose en módulos dirigidos a tipos diferentes de personas.
Dentro de cada uno de los módulos del sistema deberían existir procedimientos especícos
para funcionalidades concretas. Un procedimiento sería una lista ordenada de acciones para
conseguir algo. Las posibles bifurcaciones de cada procedimiento respecto al camino principal
deberán documentarse igualmente.
Existen estándares de documentación que especican el índice del manual (y algunos como el
de GNU incluso el formato, que debe ser T EXINFO para así poder ser traducido automáticamente
a otros formatos). En cualquier caso, el índice deberá contener los siguientes puntos:
1. Instalación del producto. Se indicarán los requisitos, tanto software como hardware.
3. Si el manual tiene varios módulos en función de los perles de usuario, para cada uno de
ellos:
Si se manejan documentos de entrada y/o salida se dará si ha lugar una breve ex-
plicación sobre su nombre, formato, origen, localización, usuarios que lo manejan y
procesos de backup.
5. Lista de errores con su signicado y posible solución; el usuario no tendrá que recurrir
a esta parte del manual si esta información está disponible en la propia aplicación. Esta
parte puede estar en el manual de referencia.
6. Glosario de términos.
Procedimientos y tutoriales
Pantallas y mensajes: Contienen las instrucciones de operación para los procesos on-line,
incluyendo el ujo de pantalla para cada uno de ellos, los mensajes del sistema y las
asignaciones de las teclas de función. Se debe confeccionar un glosario, preferentemente
on-line, con todos los mensajes de error que puede generar el sistema.
6.3 Recopilación y organización de documentación 97
Informes del sistema: Presenta el inventario, el ejemplo y la descripción detallada de los in-
formes del sistema, incluyendo su ordenamiento, cortes de control, frecuencia de emisión,
número de copias y forma de distribución. Se debe dividirlos en categorías de acuerdo al
nivel de los usuarios a quienes están orientados.
Procedimientos de usuario: Son los procedimientos requeridos para el uso del sistema.
Deben quedar reejadas las responsabilidades de cada tipo de usuario, en cuanto al envío
y/o carga de información (tiempos y oportunidad de proceso), como también sus respon-
sabilidades en cuanto al control y aprobación de las salidas del sistema.
Soporte a usuarios: Son los procedimientos disponibles para obtener ayuda sobre el uso
del sistema. Deben quedar reejadas las opciones que tiene el usuario para solucionar una
duda identicando el o los sectores responsables del servicio.
Material de capacitación: Inventario de cada una de las opciones disponibles para capa-
citación, ya sea autoasistida o a través de cursos, tutoriales, etc.
Desde el punto de vista de las personas que hacen el mantenimiento los problemas que se
encuentran es que la documentación:
1. ¡Nunca existió!
2. Es escasa o incompleta.
3. No está actualizada con los cambios que se han ido haciendo al sistema.
5. No es clara.
Objetivos
Servir como base para el mantenimiento futuro de los procesos y programas del sistema.
Contenidos
Objetivos: Descripción breve del objetivo general del nuevo sistema, incluyendo re-
ferencia a las funciones del negocio (planicación, gestión, etc) qué cubre y cómo lo
hace.
Alcance: Diagrama de contexto que muestre la interacción del sistema con el resto
de los sistemas de la organización.
• Herramientas de desarrollo.
• Tipo de procesos.
Políticas relacionadas con su uso. Siguiendo las políticas, normas y estándares vi-
gentes, se deberán adjuntar:
• Plan de contingencia que explique los métodos de trabajo alternativos ante fa-
llos.
Principales funciones: descripción breve que describa las principales funciones del
sistema. Se podrá acompañar de un esquema donde se identiquen las actividades
del negocio cubiertas por el sistema y sus necesidades de información.
Eventos del sistema: extraer del modelo de eventos una lista conteniendo todas aque-
llas funciones ejecutadas por los distintos usuarios que originan una entrada al siste-
ma. Indicando:
a) Número de evento.
b) Descripción.
c) Origen de la información.
d) Destino de la información.
6.3 Recopilación y organización de documentación 99
e) Flujo de datos.
Diálogo del sistema: Muestra la comunicación entre las distintas pantallas de la apli-
cación identicando las condiciones que provocan la navegación entre las mismas.
3. Especicaciones de los módulos. Por cada módulo deberá tenerse la siguiente informa-
ción:
Inventario general de procesos del sistema: es una lista de todos los procesos, que
contendrá para cada proceso los siguientes datos: nombre del proceso, Descripción
breve y Módulo al que pertenece ó módulos que incluye.
Descripción y objetivos.
Modelo conceptual de datos: Permite visualizar las entidades de datos requeridas por
el sistema y sus relaciones. Se deberán adjuntar:
100 Fase de entrega y mantenimiento
• Diagrama general.
• Diccionario de datos.
Diseño físico de base de datos: Contiene las deniciones detalladas de todos los
archivos y/o bases de datos del sistema y cada uno de sus componentes (tablas, co-
lumnas, claves, índices, integridad referencial, triggers, etc). Adjuntar la forma en
que cada programa los accede y procesa sus datos, su localización física y la descrip-
ción de su sistema de backup. Para aquellos que tengan proceso de mantenimiento
independiente del sistema, se deberá adjuntar la forma de acceso al menú correspon-
diente y las instrucciones para su uso.
Objetivos
Contener los procedimientos requeridos para asegurar el mantenimiento del sistema des-
pués de su instalación.
Contenidos
1. Documentación del sistema: Contiene el inventario y una breve descripción del conteni-
do de cada uno de los manuales que conforman la documentación del sistema, así como
el número de copias emitidas, su distribución y las ubicaciones físicas en las que se en-
cuentran almacenadas. Esta información permite asegurar que todas las modicaciones
que se efectúen sobre el sistema después de su instalación se reejen en la documentación
existente.
2. Librerías del sistema: Presenta el inventario de todas las librerías fuente y objeto del sis-
tema, detallando para cada una de ellas los siguientes datos:
Nombre, versión, fecha, ubicación, tipo y uso (de test, producción, etc.)
Instrucciones de uso.
3. Modelo de pruebas del sistema: Contiene toda la información generada para la ejecución
de las pruebas del sistema (pruebas unitarias, prueba de integración, pruebas de usuario y
prueba de aceptación del usuario).
Tutorial posterior
Resumen de contenidos
Se exponen los motivos para documentar, directrices genéricas a seguir para la redacción
de un documento, una clasicación de los documentos y una plantilla a seguir para los más
importantes. El tipo de documentos que se contemplan aquí son los dirigidos a usuarios o man-
tenedores. Se hace hincapié en el manual de usuario, el manual del sistema y el manual de
mantenimiento.
102 Fase de entrega y mantenimiento
3. Las pruebas de regresión son las mismas pruebas que se han aplicado antes pero que
vuelven a pasarse cada vez que se hace un cambio. ¿Es razonable pasar las pruebas de
regresión de los módulos que no se cambian?.
Tutorial
Metodologías de desarrollo
En los capítulos precedentes hemos visto las fases del ciclo de vida del desarrollo de apli-
caciones. Estas fases son relativamente independientes del tipo de metodología que se siga. Una
metodología consiste en concretar el tipo de ciclo de vida que se va a seguir y la forma en la
que se realizan las actividades dentro de cada etapa, ahora bien, las etapas tienen que seguir
siendo las mismas sea cual sea la metodología; es necesario tener una fase de especicación
porque se trabaja con los requisitos que proporciona el cliente. Que una metodología utilice el
ciclo de vida en cascada y que esto se haga solo al principio o que sea iterativa y haya varias
mini-fases de este tipo es lo que distingue una de otra, pero esta actividad hay que realizarla de
todas formas. El diseño es otra fase que es necesaria sea cual sea la metodología por los mismos
motivos. La especicación es relativamente independiente de la metodología porque las técnicas
de comunicación con el cliente son siempre las mismas, pero en el caso del diseño es donde las
cosas empiezan a divergir. Existen dos tipos de diseño: estructurado y orientado a objetos. Una
metodología se decanta entre uno de los dos. En este capítulo hemos decidido dar como botón
de muestra dos metodologías de diseño orientadas a objetos actuales: Extreme Programming y
el Proceso Unicado de Rational. El análisis y diseño estructurados, que son métodos bastante
formalizados, han sido cubiertos en capítulos anteriores.
Es una de las metodologías más extendidas y conocidas por su amplia difusión comercial.
Se puede estudiar como una metodología representativa de tipo clásico. Fue denida por los
creadores del UML unicando los métodos de Jacobson, Booch y Rumbaugh. El hecho de que
la empresa R ATIONAL también distribuya herramientas especícas basadas en el mismo método,
que facilitan el desarrollo, ha contribuido a su gran expansión.
Este proceso se maneja por casos de uso (correspondientes a los modos uso por los actores
o agentes usuarios) para la extracción de requisitos y la identicación de las partes funcionales
en las que se divide la solución. La arquitectura del proceso se modela con orientación a objetos.
103
104 Metodologías de desarrollo
7.2.1. Introducción
Toda esta sección es un resumen de los 11 primeros capítulos del libro [JBR00]. Las ilustra-
ciones también están tomadas de ese libro. El Proceso Unicado de Rational es una metodología
de desarrollo de software orientada a objetos creada por Rational Software Corporation. Los
creadores de la metodología son los mismos que los del UML: Ivar Jacobson, Grady Booch y
James Rumbaugh, que respectivamente eran autores de las metodologías: Process Objectory, el
método Booch y la metodología OMT. Como toda metodología de desarrollo software su nali-
dad es convertir las especicaciones que da el cliente en un sistema software. Las características
que tiene el R.U.P. son:
4. Se centra en la arquitectura.
Los casos de uso se vieron en el apartado dedicado a UML. Lo importante acerca de ellos
son dos cosas:
1. Representan los requisitos funcionales del sistema desde el punto de vista del usuario.
2. Se usan como guía para el proceso de diseño, implementación y pruebas, por eso se dice
que el RUP está dirigido por casos de uso.
El proyecto se divide en una serie de partes o mini-proyectos. Cada uno de esos mini-
proyectos va a ser una iteración. En cada iteración se trata un conjunto de casos de uso y los
riesgos más importantes.
El proceso unicado consiste en una serie de ciclos. Al nal de cada ciclo se tiene una
versión del producto. Las fases de cada ciclo son: inicio, elaboración, construcción y transición.
Cada fase termina con un hito (ver gura 7.1), que se determina por la disponibilidad de un
conjunto de artefactos (modelos o documentos desarrollados hasta cierto punto).
¿Cuáles son las principales funciones del sistema para sus usuarios más importan-
tes?. La respuesta está en el modelo de casos de uso simplicado.
7.2 Proceso unicado de Rational 105
Requisitos
Analisis
Diseno
Implementacion
Prueba
3. Construcción:
Se construye el producto.
La pregunta es: ¿ Cubre el producto las necesidades de los usuarios como para hacer
una primera entrega?
4. Transición:
Tipos de defectos:
106 Metodologías de desarrollo
a) Los que tienen importancia como para justicar una versión incremental (ver-
sión delta)
A su vez, cada fase puede tener varias iteraciones, cada una con cinco ujos de trabajo: Requi-
sitos, Análisis, Diseño, Implementación y Prueba.
El producto
El producto terminado debe incluir más cosas que el código ejecutable: requisitos, casos de
uso, especicaciones no funcionales y casos de prueba. Para llevar a cabo un ciclo se necesitan
todas las representaciones del producto software:
2. Modelo de análisis para renar los casos de uso y establecer la asignación inicial de fun-
cionalidad del sistema a un conjunto de objetos que proporciona el comportamiento.
6. Modelo de prueba, que describe los casos de prueba que denen los casos de uso.
1. Personas: existen una serie de factores motivacionales que pueden mejorar o empeorar la
eciencia. Conviene tener en cuenta lo siguiente:
El proceso debe parecer viable, se debe gestionar el riesgo, la gente debería estar
estructurada en pequeños equipos (de seis a ocho personas), la planicación del pro-
yecto debe ser realista, el proyecto debe ser comprensible y es mejor tener sensación
de cumplimiento de objetivos.
Debe existir un proceso de desarrollo estandarizado que será conocido por todos.
7.2 Proceso unicado de Rational 107
Una persona puede asumir uno o varios papeles como trabajador en el proceso de
desarrollo en función de sus aptitudes, que deben ser consideradas cuidadosamente.
2. Proyectos: los equipos de proyecto tienen que tener en cuenta que un proyecto es una su-
cesión de cambios, que pasa por iteraciones, que cada una es en sí misma un miniproyecto
y se debe tener un patrón organizativo.
3. Producto
Un sistema software no es solo los binarios (código ejecutable), es todos los arte-
factos que se necesitan para representarlo en forma comprensible para máquinas y
personas (trabajadores y usuarios)
Artefactos: Son la información que crean y manejan los trabajadores, como los dia-
gramas UML, prototipos, etc. Hay dos tipos: de ingeniería (los que nos ocupan) y de
gestión.
• El sistema está formado aparte de sus modelos por las inter-relaciones que se
establecen entre estos.
4. Proceso:
Un proceso es una plantilla que sirve para hacer proyectos igual que de una clase se
derivan instancias.
Las herramientas: El RUP está soportado por herramientas CASE. Es mejor esto al pro-
ceso manual para evitar trabajo repetitivo. La herramienta escogida deberá dar soporte a
todo el ciclo de vida y usará UML. Las herramientas son importantes porque inuyen en
el proceso, el cual a su vez dirige a las herramientas.
Los casos de uso son los encargados de la captura de requisitos. Con ellos se identican y
especican clases, subsistemas, interfaces, casos de prueba y se planican las iteraciones del
108 Metodologías de desarrollo
desarrollo y de la integración. En una iteración nos guían a través del conjunto completo de
ujos de trabajo. Los objetivos de la captura de requisitos son dos:
Veamos ahora lo que es un caso de uso. Un actor es una persona o proceso externo al sistema
que interactúa con él. Un caso de uso es una secuencia de acciones que el sistema lleva a cabo
para ofrecer un resultado de valor para un actor, es decir, un caso de uso proporciona un resul-
tado observable para el usuario. Dentro de una interacción con el sistema puede haber muchas
variantes, muchas de ellas pueden ser recogidas en un único caso de uso. Durante el análisis y el
diseño el modelo de casos de uso se transforma en un modelo de diseño a través de un modelo
de análisis. Los casos de uso son importantes por lo siguiente:
3. Un pequeño subconjunto de ellos sirve para idear la arquitectura (cada iteración imple-
menta un conjunto de casos de uso proporcionando un incremento).
Las vistas que se incluyen son: los casos de uso, modelo de análisis, modelo del diseño, etc.
La arquitectura es necesaria para: Comprender el sistema, Organizar el desarrollo, Fomentar la
reutilización y Hacer evolucionar el sistema.
Se construye la arquitectura de forma que permita implementar los casos de uso actuales y
previsibles en el futuro. Otros factores que inuyen en la arquitectura son:
Para integrar todas estas necesidades primero se hace un diseño de alto nivel para la arqui-
tectura, a modo de arquitectura de capas (una capa es una parte bien denida de un sistema a
partir de paquetes o subsistemas). Después formamos la arquitectura en un par de construccio-
nes (versión ejecutable del sistema o de una parte del mismo). Todo esto dentro de la primera
iteración. Al principio se trabaja con las partes generales de la aplicación y requisitos generales
no funcionales. En esta primera pasada se trata de tener una visión general.
Segunda construcción: Se trabaja con requisitos especícos a base de escoger unos cuantos
casos de uso relevantes. Se implementan subsistemas a través de una serie de iteraciones. Al
nal se debería conseguir una arquitectura estable. Con una arquitectura estable se implementan
los casos de uso que quedan para proporcionar toda la funcionalidad.
El proceso de desarrollo consta de una serie de hitos que dan el criterio a seguir por los
diseñadores para dar el paso de una fase a la siguiente. En una fase se pasa por una serie de
iteraciones e incrementos que nos llevan hasta esos hitos. Los criterios que se siguen en las fases
son:
Inicio: Viabilidad.
Un proceso iterativo e incremental signica llevar a cabo un desarrollo en pequeños pasos. Para
ello:
1. Se escoge una pequeña parte del sistema y se sigue con el todo el ciclo de vida clásico en
cascada (planicación, especicación, diseño ... ).
2. Si estamos satisfechos con el paso anterior damos otro. Cada uno proporciona retroali-
mentación.
3. Las iteraciones son distintas. Al principio del proyecto proporcionan una comprensión de
los requisitos, del problema, de los riesgos y el dominio de la solución; las últimas nos
proporcionan la visión externa (producto para el cliente).
1. Para identicar riesgos. Esto ocurre en las dos primeras fases: Inicio y Elaboración, en
vez de en la etapa de integración como con el modelo en cascada.
110 Metodologías de desarrollo
3. Gestión de requisitos cambiantes: Gracias a que se hace una integración continua los
usuarios disponen desde las primeras iteraciones de versiones ejecutables que permiten
un cambio de impresiones en este sentido.
4. Fallos: Al igual que en los puntos anteriores, la ventaja de este ciclo de vida es que los
fallos se van descubriendo a medida que se implementan nuevas funcionalidades; esto
signica que no hay una avalancha de problemas al nal.
5. Aprendizaje: Con un par de iteraciones es suciente para que todo el mundo comprenda
los diferentes ujos de trabajo.
Gestión de riesgos
Un riesgo es cualquier cosa que pone en peligro el éxito del proyecto. Las iteraciones se
organizan para reducir riesgos. Tipos de riesgos:
1. Técnicos:
a) Relacionados con nuevas tecnologías como puede ser distribuir procesos en muchos
nodos o técnicas aún incompletas como reconocimiento de lenguaje natural.
Iteraciones
Cuando una iteración termina se analiza para ver si han aparecido nuevos requisitos. Se
examinan también los riesgos que quedan. Las pruebas de regresión comprueban que no se
han introducido errores sobre partes anteriores a las de la iteración en curso. La planicación
7.2 Proceso unicado de Rational 111
de cada iteración sólo se puede hacer en detalle para iteración más cercana a la actual y con
menos detalle para las siguientes.
Secuenciación
Los casos de uso establecen una meta y la arquitectura un patrón. Con esto en mente se
planica la secuencia de iteraciones. Las primeras se centran en los requisitos, problemas y
riesgos y las siguientes en la visión externa. Es posible que las iteraciones se solapen un poco en
el tiempo. El orden de las iteraciones es el que permita que las decisiones importantes se tomen
antes.
El conjunto de modelos que representa al sistema en un momento dado se llama línea base. En
la fase de elaboración se identican los casos de uso que tienen un impacto sobre la arquitectura
y se representan como colaboraciones. De esta forma se construye la línea base. El resultado de
una iteración es un incremento, y consiste en la diferencia entre dos líneas base sucesivas. Cada
fase termina con un hito, el desarrollo iterativo supone un cambio de actitud: es necesario dejar
de valorar tanto las líneas de código y valorar más la reducción de riesgos y la línea base.
Cada tipo de proyecto es diferente y tendrá una aproximación diferente pero se puede decir
que un ujo de trabajo arquetípico tendrá que cubrir los siguientes puntos:
1. Enumerar los requisitos candidatos: es una lista provisional de características que se van
convirtiendo en requisitos o en artefactos. Sirve para la planicación del trabajo. Se indica:
su nombre, una descripción, su estado, su coste estimado, prioridad y nivel de riesgo.
2. Comprender el contexto del sistema. Hay dos forma de entender este contexto:
a) Modelado del dominio: Describir los objetos importantes del contexto como objetos
del dominio (clases) y enlazarlos. Se modela en UML. Estos objetos se pueden edu-
cir gracias a reuniones con expertos del dominio. Los productos son: Un glosario de
términos y los objetos. Tipos de objetos: Objetos del negocio (p. ej: pedidos, cuentas,
contratos), Objetos del mundo real y Sucesos.
2) Se desarrolla un modelo de objetos del negocio que realiza los casos de uso
anteriores compuesto por trabajadores, entidades del negocio y unidades de tra-
bajo.
3. Capturar requisitos funcionales: se hace con casos de uso. Aparte de esto hay que especi-
car cómo será la interfaz de usuario.
En la fase de inicio se capturan los casos de uso para delimitar el sistema y el alcance del
proyecto. En la fase de elaboración se capturan los requisitos para delimitar el esfuerzo. Al
nalizar esta fase se deben haber capturado el 80 %.
Artefactos
1. Modelo de casos de uso: es un modelo con actores, casos de uso y relaciones entre ellos.
Pueden agruparse en paquetes y se puede ver desde distintos puntos de vista.
2. Actor: un actor es cualquier cosa externa al sistema, desde un usuario hasta otro sistema.
El conjunto de actores delimita todo lo externo. Puede jugar varios roles y para cada uno
de ellos tendrá un caso de uso.
3. Caso de uso: cada uno es una especicación, una secuencia de acciones que el sistema lle-
va a cabo para realizar una funcionalidad. Puede incluir diagramas de estados, diagramas
de actividad, colaboraciones y diagramas de secuencia. Cada caso de uso tiene atributos.
Una instancia de caso de uso es la ejecución de un caso de uso, que estará desencade-
nada por un evento o por la instancia de un actor. El ujo de sucesos de un caso de uso
especica cómo interactúa el sistema con los actores. Consta de secuencias de acciones.
5. Glosario: conjunto de términos comunes en el sistema. Sirve para evitar confusiones. Sale
del modelo de negocio o del modelo del dominio.
Trabajadores
Vemos a un trabajador como una persona real que desempeña una función dentro del pro-
yecto. Una misma persona puede ser varios trabajadores. Tipos de trabajadores:
1. Analista de sistemas: modela los casos de uso, encuentra los actores y redacta el glosario.
También es la persona que se encarga de capturar los requisitos.
2. Especicador de casos de uso: es un asistente del anterior. Realiza cada caso de uso en
detalle trabajando con el usuario.
3. Diseñador de interfaz de usuario: se suelen usar prototipos, uno por cada actor.
4. Arquitecto
Flujo de trabajo
Se representa mediante un diagrama (ver gura 7.2). El diagrama tiene calles, en la cabecera
se sitúan los actores y en las calles las actividades. Cuando un trabajador ejecuta una actividad
crea y modica artefactos. Se representa el ujo lógico, pero las actividades reales no tienen por
qué ser secuenciales. Veamos las actividades una a una.
Priorizar
Arquitecto los casos de uso
Especificador Detallar
de casos de uso un caso de uso
Diseñador Prototipar
de interfaces de usuario la interfaz de usuario
b) Encontrar los casos de uso: Si se parte del modelo del negocio cada rol de cada
trabajador se corresponderá con un caso de uso. En otro caso se identican hablando
con los usuarios. Por otra parte, los casos de uso se caracterizan por proporcionar
algún servicio de utilidad al actor y es mejor que el actor sea una persona real.
c) Describir brevemente cada caso de uso: Una vez identicados los casos de uso se les
da una descripción breve o con los pasos a seguir.
d) Describir el modelo de casos de uso completo: Se trata de dar una visión general de
los casos de uso. Se puede utilizar cualquier conjunto de diagramas que se consideren
oportunos.
2. Priorizar casos de uso: Se trata de ver qué casos de uso se hacen en qué iteraciones, para
ello hay que tener en cuenta consideraciones económicas y en general no técnicas. El
resultado se pone en la vista del modelo de casos de uso.
4. Prototipar la interfaz de usuario: Se trata de crear una interfaz que permita la interacción
del usuario para poder realizar los casos de uso. Se hace en dos pasos:
Crear el diseño lógico: Se identican todos los elementos de la interfaz con los que
va a interactuar el usuario. Cada elemento puede jugar varios roles porque puede
estar en varios casos de uso.
Análisis
3. Si se tienen varias opciones de diseño, el análisis da una visión unicadora de todas ellas.
El modelo de análisis describe los resultados del análisis y mantiene la consistencia de este
modelo durante el ciclo de vida. En las primeras iteraciones se hace énfasis en este modelo, más
adelante se deja de actualizar.
Artefactos
1. Modelo del análisis: consiste en una jerarquía de paquetes, que son abstracciones de sub-
sistemas o capas de diseño. Los paquetes contienen clases del análisis y realizaciones de
casos de uso.
2. Clase del análisis: es una abstracción de una o varias clases y/o subsistemas del diseño del
sistema. Se centra en los requisitos funcionales. Su comportamiento en lugar de denirse
de con interfaces se dene con responsabilidades: que son una descripción textual. Estas
clases tienen atributos del dominio del problema, que en el diseño pueden pasar a ser
clases. Se pueden corresponder con tres estereotipos: de interfaz, de control o de entidad.
3. Realización de caso de uso-análisis: explica como se lleva a cabo un caso de uso. Utiliza
para ello diagramas de clases, diagramas de interacción y una descripción textual del ujo
de sucesos.
4. Paquete del análisis: incluye clases del análisis, realizaciones de casos de uso y posible-
mente otros paquetes de análisis. Los paquetes deben tener cohesión fuerte y acoplamiento
débil. Cada paquete representa cosas distintas, reconocibles por los conocedores del do-
minio.
Trabajadores
2. Ingeniero de casos de uso: Es responsable de que cada caso de uso responda a la funcio-
nalidad requerida, tanto en el análisis como en el diseño.
3. Ingeniero de componentes: Comprueba que cada clase del análisis cumpla los requisitos
que se esperan de ella. Mantiene la integridad de los paquetes del análisis. El ingeniero de
componentes de un paquete lo es también de las clases del análisis contenidas en él.
Flujo de trabajo
Diagrama del ujo de trabajo en el análisis (ver gura 7.3) que muestra las actividades, los
artefactos y los participantes. Veamos las actividades:
Arquitecto Analisis
de la arquitectura
Ingeniero Analizar un
de casos de uso caso de uso
a) Identicar los paquetes de análisis. Una forma es asignar casos de uso a un paquete y
realizar esa funcionalidad en el paquete. Si hay clases comunes entre diferentes pa-
quetes se pueden sacar a otro paquete o fuera de cualquier paquete. Los paquetes de
servicio se identican cuando el análisis ya está avanzado. La forma de identicarlos
es:
7.2 Proceso unicado de Rational 117
Por cada servicio que pueda hacerse opcional o por clases que estén relaciona-
das funcionalmente.
b) Identicar clases de entidad obvias. Se trata de identicar las clases necesarias para
esbozar la arquitectura y no más. Las agregaciones y asociaciones entre clases del
dominio pueden identicar asociaciones entre las clases de entidad.
4. Analizar un paquete: Cada paquete debe realizar algunas clases del dominio o casos de
uso, además, se trata de que cada paquete sea tan independiente de los demás como sea
posible y deben documentarse las dependencias entre paquetes para el mantenimiento. Las
normas que se deben seguir con los paquetes respecto a cohesión y acoplamiento son las
mismas que con los módulos en la programación estructurada, es deseable que el paquete
sea cohesivo, es decir, que solo tenga clases relacionadas funcionalmente.
7.2.7. Diseño
La entrada del diseño es la salida de la fase anterior y la salida del diseño es un modelo direc-
tamente implementable. Debido a esta proximidad con la implementación hay que comprender
aspectos no funcionales como lenguajes de programación, sistema operativo, etc. También es
necesario tener el sistema dividido en trozos manejables por equipos de trabajo. Los interfa-
ces entre los diferentes subsistemas deberían estar claros. La implementación debería seguir
la misma estructura que el diseño y de esta forma se podría hacer un camino de ida y vuelta
automatizado.
Se realiza sobre todo en las fases de elaboración y de construcción. Los artefactos son:
1. Modelo de diseño: es un modelo de objetos que describe cómo los casos de uso inuyen
en el sistema. Es también una abstracción de la implementación. Cada subsistema o clase
118 Metodologías de desarrollo
del diseño representa una abstracción con una correspondencia con la implementación.
Los casos de uso se realizan por clases de diseño, lo cual se representa por colaboraciones
en el modelo del diseño.
2. Clase del diseño: tiene una correspondencia directa con una clase en la implementación.
Se utilizan características del lenguaje de programación para describirlas.
4. Subsistema de diseño: representa una parte del sistema. Debe tener alta cohesión y bajo
acoplamiento. Consta de clases del diseño, realizaciones de casos de uso, interfaces y
posiblemente otros subsistemas. Un subsistema de servicio se corresponde con un paquete
de servicio del análisis que ofrece sus servicios en términos de interfaces y tiene en cuenta
requisitos no funcionales.
7. Modelo de despliegue: Describe cómo se reparte la funcionalidad entre los nodos físicos.
Tiene nodos, que son procesadores o recursos hardware y relaciones entre ellos que son
los modos de comunicación (intranet, bus, etc). Describe la conguración de la red. La
funcionalidad de un nodo depende de los componentes que estén en él.
8. Vista de la arquitectura del modelo de despliegue: Muestra los artefactos relevantes para
la arquitectura, como la correspondencia entre los componentes y los nodos.
Trabajadores
3. Ingeniero de componentes: Garantiza que las clases del diseño estén correctamente de-
nidas, así como los subsistemas y sus interrelaciones.
7.2 Proceso unicado de Rational 119
Flujo de trabajo
Arquitecto Diseño
de la arquitectura
Ingeniero Diseñar un
de casos de uso caso de uso
Subsistemas e interfaces.
Identicar las clases del diseño y subsistemas necesarios para el ujo de sucesos.
Denir los requisitos sobre las operaciones de las clases del diseño, subsistemas e
interfaces.
Esbozar la clase del diseño. Una clase puede ser de interfaz, de entidad o de control.
Identicar operaciones.
Identicar atributos.
Describir estados.
7.2.8. Implementación
Artefactos
Componentes clave.
7.2 Proceso unicado de Rational 121
Trabajadores
Flujo de trabajo
La gura 7.5 es una representación dinámica de las actividades con sus respectivos trabaja-
dores. Veámoslas una a una.
Arquitecto Implementacion
de la arquitectura
Integrador Integrar
de sistema sistemas
Implementar
una clase
Ingeniero
de componentes
Implementar Realizar prueba
un subsistema de unidad
5. Realizar prueba de unidad. Hay dos tipos de pruebas: prueba de especicación (caja ne-
gra) y prueba de estructura (caja blanca)
7.2.9. Prueba
La nalidad de esta fase es planicar, diseñar e implementar las pruebas de cada iteración.
Artefactos
1. Modelo de pruebas: especica cómo son las pruebas de integración y de sistema para los
ejecutables. Pueden probarse también componentes como manuales de usuario o interfa-
ces.
2. Caso de prueba: especica la prueba que se hace sobre un requisito o conjunto de requi-
sitos de un caso de uso o de una realización de un caso de uso-diseño.
5. Plan de prueba.
6. Defecto.
7. Evaluación de prueba.
Trabajadores
3. Ingeniero de pruebas de integración: las pruebas de integración verican que los compo-
nentes integrados funcionan bien juntos.
4. Ingeniero de pruebas de sistema: realiza las pruebas sobre el resultado de una iteración y
documenta los defectos encontrados.
7.2 Proceso unicado de Rational 123
Flujos de trabajo
Ingeniero Implementar
de componentes pruebas
1. Planicar prueba: para esta planicación se describe primero una estrategia de prueba, se
estiman los recursos necesarios y entonces se planica el esfuerzo de la prueba.
Identicar y denir los casos de prueba para cada construcción, que consiste en el
diseño de los casos de prueba de integración, los casos de prueba del sistema y los
casos de prueba de regresión.
4. Realizar pruebas de integración: se realizan las pruebas contrastando los resultados con
lo esperado e informando a los responsables y diseñadores de los resultados.
5. Realizar prueba de sistema: es una prueba posterior a las de integración que se realiza de
un modo similar.
6. Evaluar prueba: Se comparan los resultados obtenidos con los objetivos del plan de prue-
ba. Se tienen en cuenta dos factores:
124 Metodologías de desarrollo
Este método reciente de desarrollo orientado a objetos fue descrito originalmente por Kent
Beck en su libro [Bec99]. En la actualidad está ganando muchos adeptos a través de Internet
y tiene cada vez una mayor presencia como un método alternativo de desarrollo frente a los
métodos más clásicos. Se basa principalmente en la simplicidad, la comunicación e interacción
permanente con el cliente (comprobación de requisitos constante) y en el pair-programming,
que es la técnica de programación por parejas donde uno de los programadores escribe código
y el otro lo prueba y después se cambian los papeles. De esta forma ya desde el principio se
van probando los programas en cuanto a cumplimiento de requisitos como a funcionalidad. La
simplicación de los protocolos de comunicación entre las diferentes fases (ver gura 7.7) y
la inmediatez del desarrollo la convierten en una metodología muy rápida de desarrollo. Sus
características son:
Escenarios de test
Historias de usuario
Requisitos Nueva historia de usuario
Velocidad del proyecto Errores
Ptototipo
Su ciclo de vida es iterativo e incremental. Cada iteración dura entre una y tres semanas.
Un defecto de extreme programming es que necesita una continua interacción con el clien-
te. Esta es la limitación principal y hay que tenerla muy en cuenta.
Otra crítica que se ha hecho a esta metodología es que no produce demasiada documenta-
ción acerca del diseño o la planicación.
7.3 Método extreme programming 125
Son parecidas a los casos de uso de UML, pero las escriben los usuarios.
Cada una especica un requisito del sistema. Pueden usarse para: estimar el tiempo de
desarrollo y hacer un test de aceptación partiendo de una historia de usuario.
Los desarrolladores estiman cuanto tiempo es necesario para implementar cada una. Si ese
tiempo supera en alguna las tres semanas se debe desglosar en otras más pequeñas. Si es
inferior a una semana, la historia de usuario ha descendido a un nivel de detalle excesivo
y habrá que combinarla con otra.
Una historia de usuario debe durar idealmente entre una y tres semanas. Idealmente
signica no tener distracciones, saber exactamente lo que hay que implementar y sin otras
asignaciones.
Nivel de detalle: en principio, el usuario sólo cuenta lo necesario para poder hacer una
estimación del tiempo que va a tomar la implementación. Cuando llega el momento de
implementar se vuelve a preguntar.
Lo primero que se hace al abordar un proyecto es una reunión para decidir un esquema
del proyecto global, entonces se usa este esquema para decidir cómo va a ser cada una de las
iteraciones. Cada iteración se planica en detalle justo antes de empezar. Una de las cosas que se
hacen en esta reunión preliminar es estimar el tiempo de desarrollo para cada una de las historias
de usuario. En este plan se descubren las funcionalidades que se pueden ir implementando en
las sucesivas versiones. Esto es útil para que el cliente vaya probando el producto e intercambie
impresiones con el equipo. El cliente es el que va a decidir en qué orden quiere que se vayan
implementando.
Es importante que las decisiones técnicas las tome el equipo de desarrollo y las decisiones
de negocio el cliente. Las historias de usuario se imprimen en tarjetas, entonces el equipo de
desarrollo las pone en una mesa para crear un conjunto de historias que serán implementadas
para la primera versión. Es deseable empezar a publicar versiones cuanto antes. La planicación
se puede hacer por tiempo o por alcance.
o
Tiempo: N de historias que se pueden implementar antes de una fecha dada.
La cuarta está condicionada por las tres primeras y es inversamente proporcional al coste del
proyecto.
Suponen una forma de pensar propia de la orientación a objetos que rompe con el diseño
tradicional. Cada tarjeta representa un objeto. En la cabecera se pone el nombre de la clase a
la que pertenece. Las responsabilidades se ponen en la parte izquierda y las clases con las que
colabora a la parte derecha de cada responsabilidad. Lo que se hace en una sesión es simular el
funcionamiento del sistema a mano. Por ejemplo: Una persona coge una tarjeta que es un objeto,
manda un mensaje a otro objeto, entonces alguien se levanta y coge la tarjeta correspondiente
a ese objeto, hace lo que sea, etc. Utilizando este sistema se pueden explorar con rapidez las
diferentes alternativas de diseño.
Problema: No queda constancia escrita del diseño, aunque se puede escribir el resultado de la
sesión de simulación con una copia de cada tarjeta.
El criterio que se debe seguir con el diseño es que sea tan simple como sea posible. Una forma
de explorar alternativas de diseño es crear miniprototipos. Un miniprototipo es una programa
pequeño hecho para explorar soluciones potenciales y luego tirarlo. También pueden servir para
reducir riesgos o para mejorar la estimación del tiempo que tarda en ser implementada una
historia de usuario.
Cada iteración (ver gura 7.8) sólo se planica en detalle al comienzo de la misma y se hace
en una reunión que se convoca al efecto. Lo que se hace es:
En primer lugar se deciden cuales son las historias de usuario que hay que implementar
en esta iteración. Esta decisión le corresponde en su mayor parte al usuario. En total la
iteración dura entre una y tres semanas.
Luego se escriben los tests de aceptación que tendrán que ser satisfechos por cada historia
de usuario.
Las historias de usuario y los tests se traducen en tareas, que se escriben en tarjetas. Cada
una debería durar entre uno y tres días. El plan detallado para cada iteración consiste en
ese conjunto de tareas.
7.3 Método extreme programming 127
Al igual que ocurre con las historias de usuario, las tareas que tarden menos de un día se
agrupan con otras, y las más largas que tres días se dividen en otras más pequeñas.
Las tareas se asignan a programadores concretos y son éstos los que estiman el tiempo
que puede tardar la implementación de la tarea que se compromete a hacer.
La velocidad a la que va el proyecto se estima en función del tiempo que han tardado en
implementarse las historias de usuario que ya están hechas. Con intervalos de tres a cinco
iteraciones habrá que reestimar el tiempo de las historias que quedan.
7.3.5. Integración
En la integración se juntan los pequeños módulos de software que tenemos y que parece que
funcionan, pero resulta que esos pequeños trozos sólo han superado pruebas de unidad donde no
han tenido que interactuar con otros módulos. El problema es que existen errores que sólo surgen
en esa interacción, y ese es precisamente el problema de la integración. Formas de afrontarlo:
Además lo típico es hacer la integración una sola vez al nal. En extreme programming se hace
una integración secuencial. En un mismo momento sólo puede existir una pareja de programa-
dores integrando su código. Para que otra pareja pueda hacer lo mismo le tienen que pasar el
128 Metodologías de desarrollo
testigo. El código está todo él en el almacén (repository) y la pareja que está integrando es la
que puede hacer test y publicar los cambios en el almacén. También es posible que una pareja
pueda integrar su trabajo en la última versión en el momento que quiera con tal de que exista un
mecanismo de bloqueo (p.ej. un token que se pasen de unos a otros).
La integración debe hacerse cada poco tiempo, idealmente, cada pocas horas hay que dejar có-
digo nuevo en el almacén. Todo el mundo debe hacer integraciones con la última versión dispo-
nible, de esta forma se evita trabajar con código obsoleto. Haciendo muchas mini-integraciones
los problemas que surgían al nal cuando se hacía la única integración se van resolviendo sobre
la marcha.
En esta sección también veremos algunas diferencias chocantes con la forma de trabajar
tradicional (ver gura 7.9).
Rehacer
sin piedad
Lo primero que se hace antes de programar un módulo es preparar la prueba de unidad. Esto
indica al programador qué es lo que tiene que hacer cuándo codica. Los requisitos aparecen en
forma de pruebas de unidad. Se sabe cuando se ha terminado porque se superan todos los tests
de unidad. El benecio que tiene de ello el diseño, es que en los tests de unidad se pone aquello
que es importante para el cliente. Una forma de hacer esto es a base de pequeños incrementos:
1. Se crea una prueba de unidad pequeña que reeja parte de los requisitos.
5. ...
7.3 Método extreme programming 129
Prueba de unidad
Veamos ahora cómo se hace una prueba de unidad. Hay tres pasos que se deben seguir:
1. Se crea un armazón o patrón para poder hacer partiendo de él las pruebas de unidad de un
modo automatizado.
La idea de hacer el test antes del código es importante, porque si se deja para el nal, es posible
que se encuentren problemas inesperados y se necesite más tiempo del inicialmente previsto.
Además, en realidad el test no se hace antes sino durante porque se construye de forma incre-
mental, pero siempre el test antes del código.
Cuando se publica un módulo al almacén debe ir obligatoriamente acompañado del test
correspondiente, y no se puede publicar código que no haya pasado todos los tests. Como el
código no tiene un propietario jo y todo el mundo puede hacer modicaciones, esta norma
es bastante razonable, cualquiera puede modicar una línea de código que haya escrito otra
persona, ahora bien, la modicación tiene que pasar todos los tests asociados a la unidad.
Los tests de unidad permiten también rehacer el código porque pueden comprobar si un
cambio en la estructura supone un cambio en la funcionalidad. Un pequeño problema es que los
tests en sí mismos pueden tener errores. Por otra parte, una de las cosas deseables es poder hacer
frecuentemente integraciones de todo el código. Si se construye un conjunto de tests globales
para comprobar el producto nal, será posible comprobar rápidamente si los cambios hechos en
una unidad se integran bien y de esta forma no dejarlo todo para el nal.
Test de aceptación
El test de aceptación también se conoce como test funcional en otros sitios. Los tests de
aceptación son cajas negras que comprueban el funcionamiento del sistema. Son escritos por el
cliente, y es el cliente el responsable de que sea correcto. También es el cliente el que decide
la prioridad de cada test fallido. También se usan como test de regresión. Para que se pueda
comprobar con rapidez y muchas veces si las historias de usuario cumplen con los tests de
aceptación, estos deberían estar automatizados. Los resultados se comunican al grupo, que debe
gestionar el tiempo para corregir errores.
A partir de las historias de usuario se hacen los tests de aceptación y a cada una le puede
corresponder uno o varios. No se considera que una historia ha sido completada hasta que no
pase todos sus tests de aceptación. Al igual que con los tests de unidad, los tests de aceptación
deben hacerse antes de empezar a depurar. La diferencia entre un test de aceptación y un test de
unidad está clara: un test de aceptación comprueba los requisitos expresados en las historias de
usuario y un test de unidad comprueba que el código de una unidad es correcto.
Errores
Si se encuentra un error lo que se hace es crear un test de aceptación para ese error. De esta
forma es fácil para el equipo saber cuando se ha corregido. Un error en un test de aceptación
130 Metodologías de desarrollo
puede verse en varios módulos diferentes en sus tests de unidad. Cuando todos los tests de unidad
funcionan perfectamente se puede correr otra vez el test de aceptación para comprobar si el error
ha sido realmente corregido.
2. Asignan prioridades a las mismas y se negocia con ellos cuáles incluir en cada iteración.
3. Una vez dentro de una iteración se les preguntan más detalles acerca de las historias de
usuario.
6. Prueban las versiones que se van publicando y pueden de esta forma proporcionar reali-
mentación al equipo de desarrollo.
7. Ayudan a determinar cuáles son las pruebas que el sistema tiene que superar para consi-
derarse apto (test funcional).
No podemos tener a cualquiera en el equipo, debe ser alguien con capacidad de tomar decisio-
nes en la empresa, o al menos que pueda aconsejar, y que la conozca bien. Si hay varios clientes
pueden no estar de acuerdo con una solución, la forma de solucionarlo es hacer una reunión
donde se llegue a un acuerdo.
1. Rehacer lo viejo: a veces mantener código antiguo no sólo no supone un ahorro de tiem-
po, sino un serio inconveniente. Si es necesario se deben eliminar la redundancia y las
funcionalidades que no se usan ya o cambiar diseños antiguos.
2. Optimizaciones: no se debe optimizar el código hasta que está funcionando todo. Esto se
deja para el nal.
4. Estándares de codicación: hay publicadas algunas normas sobre como se debe codicar
en un lenguaje. Es conveniente seguir alguno de esos estándares por todos los miembros
del equipo para que el código sea luego fácil de comprender y de mantener por todos.
7.3 Método extreme programming 131
Personal
Este es posiblemente el factor más importante. Los proyectos informáticos funcionan a base
de mano de obra, todo lo que se ha dicho hasta ahora consiste en realidad en buscar formas
de trabajar que sean adecuadas para que el componente humano funcione bien. Ahora veremos
cuatro características propias de la metodología extreme programming a este respecto.
1. Reuniones diarias: Todos los días por la mañana se hace una reunión de 15 minutos en
la que se da cita a todo el personal desarrollador. Lo que se busca es promover la comu-
nicación entre todos los miembros del grupo. La gente cuenta los problemas que se han
encontrado y cualquiera puede proponer soluciones. Este tipo de reuniones tiene algunas
ventajas:
2. Propiedad compartida del código: Cualquiera puede corregir errores, añadir funcionali-
dades, etc de cualquier parte del proyecto (no sólo de su código, sino también del de los
demás). Lo que se pretende es que cualquiera pueda aportar algo. Esto signica que la
arquitectura del sistema en cierto modo la decide el equipo en su conjunto, lo cual resulta
chocante para la mentalidad de la programación estructurada. Ventajas:
3. Programación por parejas (pair programming): está basado en el principio de que dos
personas trabajando juntas pueden hacer más que por separado. El resultado de esto es
una mejora en la calidad del código, además no supone tardar más tiempo. La forma de
ponerla en práctica es: Dos personas se sientan juntas ante el mismo ordenador. Una teclea
y piensa en el problema desde el punto de vista táctico. La otra piensa desde el punto de
vista estratégico.
4. Mover a la gente: no se puede permitir que todo el equipo dependa de que la única persona
que conoce algo esté disponible o no. Puede ocurrir que esa persona deje la empresa o que
esté sobrecargada en un momento dado. Consiste en que la gente trabaje en una parte
del sistema distinta en cada iteración (o en parte de ella). Esto en combinación con la
programación en parejas permite que no se pierda productividad en la parte que se deja.
Las ventajas de esto son:
c) Si una parte del proyecto tiene problemas es posible reasignar gente a esa parte.
132 Metodologías de desarrollo
7.4. Métrica 3
7.4.1. Introducción
Lo que se va a ver es un resumen de lo más relevante que puede ser útil a modo de introduc-
ción. Para un estudio a fondo se recomienda la documentación generada por el propio ministerio
en http://www.csi.map.es/csi/metrica3/. Las guras también han sido tomadas de esa página.
2. Cubre los dos tipos de desarrollo, tanto el estructurado como el orientado a objetos, luego
es una metodología mixta.
4. Incluye los procesos que no forman parte de lo que se entiende como ciclo de vida a los
que llama interfaces.
7.4.2. Objetivos
Como toda metodología lo que se hace es sistematizar todas las actividades del ciclo de vida
y las que no son parte del ciclo de vida pero inuyen de algún modo en éste (como puede ser la
planicación) para de esa forma conseguir los siguientes objetivos:
1. Dar un marco estratégico para el desarrollo de los sistemas de información dentro de las
organizaciones.
2. Enfatizar el análisis de requisitos para que de esta forma los productos satisfagan las ne-
cesidades de los usuarios.
4. Que los procesos permitan una comunicación más uida entre todos los miembros invo-
lucrados en la producción de software.
7.4.3. Estructura
Métrica 3 se divide por una parte en procesos principales, que son los relativos a la plani-
cación, desarrollo y mantenimiento y por otra parte en interfaces, que son procesos asociados
al desarrollo (gestión de la conguración, de proyectos y aseguramiento de la calidad). Cada
proceso se divide en actividades y cada actividad tiene una descripción y una tabla de tareas
propias de la actividad. Cada tarea tiene la correspondiente descripción y dene los productos
7.4 Métrica 3 133
que necesita de entrada, los que produce de salida, las prácticas necesarias para llevar a cabo la
tarea y los participantes.
Métrica 3 es exible en su estructura (ver gura 7.10) porque no es obligatorio seguir todos
los procesos o actividades, se adapta en función de las necesidades de cada proyecto. Tampoco
es necesario seguir las actividades secuencialmente, en ocasiones será factible su ejecución en
paralelo. Los procesos correspondientes al desarrollo son los contemplados por el ciclo de vida
ISO 12.207.
Planicación (PSI)
Estudio de viabilidad (EVS)
Análisis del S.I. (ASI)
Procesos Desarrollo Diseño del S.I. (DSI)
Construcción del S.I. (CSI)
Métrica V3
Implant. y acept. del sistema (IAS)
Mantenimiento (MSI)
Gestion de la conguración (GC)
Gestion de proyectos (GP)
Interfaces
Aseguramiento de la calidad (CAL)
Seguridad (SEG)
Procesos
Para elaborar el plan se estudian las necesidades de información de los procesos de negocio
afectados. Se deben denir los requisitos generales y obtener modelos conceptuales de informa-
ción. Se evalúan las opciones tecnológicas y se propone un entorno. Debe denirse también un
calendario y un plan de mantenimiento.
Se divide en las siguientes actividades:
PSI 2: Denición y organización del PSI. Se detalla el alcance del plan, se organiza el
equipo de personas y se elabora una calendarización de tareas.
134 Metodologías de desarrollo
PSI 6: Diseño del modelo de sistemas de información. El objetivo es dar una descripción
del sistema de información que se va a construir. La primera tarea es analizar en qué
medida los sistemas actuales satisfacen las necesidades e identicar posibles mejoras.
Con la información anterior se dene el modelo del nuevo sistema de información.
EVS 2: Estudio de la situación actual. Consiste en una valoración de los sistemas infor-
máticos utilizados en el momento. En función de la profundidad del análisis se designará
un equipo especíco para ello. Si se documenta dicha situación es conveniente dividir el
sistema en subsistemas. El resultado es un documento que describe el sistema actual.
solución.
EVS 5: Valoración de las alternativas. Para cada posible solución se tienen en cuen-
ta varios factores: impacto en la organización, benecios esperados, análisis de riesgos,
recursos y tiempo.
Se dice que el análisis es la parte importante del desarrollo. Para que esta fase tenga éxito
es importante conseguir la implicación de los usuarios, para lo que se pueden utilizar técnicas
interactivas como diseño de diálogos y prototipos que le permitan sentirse parte del desarrollo y
aportar ideas.
Se divide en las siguientes actividades:
ASI 1: Denición del sistema. Da una descripción inicial del sistema usando modelos
de alto nivel; delimita el alcance y las interfaces con otros sistemas. Se selecciona un
conjunto de usuarios representativos.
ASI 4: Análisis de los casos de uso. Para cada caso de uso identicado se describen las
clases necesarias y cómo interaccionan los objetos que lo realizan.
ASI 6: Elaboración del modelo de datos. Esta actividad sólo se realiza en el análisis
estructurado. Un modelo de datos satisface las necesidades de información identicando
entidades, relaciones, atributos y reglas de negocio. Se elabora siguiendo un enfoque des-
cendente (top-down). La actividad se realiza en paralelo y con continuas realimentaciones
con ASI 2, ASI 3, ASI 7 y ASI 8.
7.4 Métrica 3 137
ASI 10: Especicación del plan de pruebas. El plan de pruebas es un documento formal
que dene objetivo y coordina la estrategia de trabajo. El plan se inicia en el análisis
pero se va completando en los sucesivos procesos (diseño (DSI), construcción (CSI) e
implantación (IAS)).
ASI 11: Aprobación del Análisis del sistema de información. Se presenta el análisis del
sistema de información al comité de dirección para su aprobación.
Métrica 3 cubre desarrollos orientados a objetos y estructurados en una única estructura. Al-
gunas actividades son comunes a ambos tipos de desarrollo y otras son sólo propias de uno de
ellos (ver gura 7.14). En esta sección nos extenderemos algo más por ser más interesante desde
el punto de vista técnico.
2. En las actividades DSI 8 a DSI 12 se generan las especicaciones necesarias para la cons-
trucción del sistema de información.
Lista de actividades:
El particionamiento físico se especica con los nodos y sus comunicaciones. Para cada
subsistema se debe identicar claramente sus interfaces. Hay dos tipos de subsistemas:
Especícos, que provienen de las especicaciones de análisis y de soporte, que se encar-
gan de comunicar el sistema con la infraestructura que le da soporte de modo que los
subsistemas especícos puedan ser independientes de dicha infraestructura.
Una vez identicados los subsistemas se decide su ubicación en los nodos que compo-
nen el sistema. Esto es importante en sistemas cliente/servidor.
7.4 Métrica 3 139
DSI 3: Diseño de casos de uso reales. Se trata de determinar para cada uno de los casos
de uso identicados las características concretas que deben tener las clases y subsistemas
140 Metodologías de desarrollo
DSI 6: Diseño Físico de Datos. Partiendo del modelo lógico normalizado o el modelo de
clases se diseña la estructura física teniendo presentes las características del SGBD y las
restricciones impuestas por el entorno tecnológico y los requisitos; se pretende conseguir
eciencia. Se realiza en paralelo con DSI 2. . . DSI 5. Se realiza tanto en diseño estructu-
rado como orientado a objetos y se tienen en cuenta los mecanismos básicos de diseño
identicados en DSI 2.2.
DSI 9: Diseño de la Migración y Carga Inicial de Datos. Esta actividad opcional toma
como referencia el plan de migración de los sistemas de origen. A partir de dicho plan se
procede a denir y diseñar en detalle los procedimientos y procesos necesarios para reali-
zar la migración y se completa detallando pruebas y personas responsables. Se determinan
las necesidades adicionales de infraestructura.
DSI 10: Especicación Técnica del Plan de Pruebas. El plan de pruebas incluye pruebas
7.4 Métrica 3 141
DSI 12: Aprobación del Diseño del Sistema de Información. Esta actividad es un mero
trámite administrativo.
CSI 3: Ejecución de las Pruebas Unitarias. Las pruebas unitarias se redactan una vez
codicados los componentes según el plan de pruebas.
CSI 5: Ejecución de las Pruebas del Sistema. Las pruebas del sistema comprueban la
integración global del sistema, vericando el funcionamiento correcto de las interfaces
entre subsistemas y con otros sistemas de información. En estas pruebas se comprueba la
cobertura de los requisitos.
142 Metodologías de desarrollo
CSI 9: Aprobación del Sistema de Información. Esta actividad es un mero trámite ad-
7.4 Métrica 3 143
ministrativo.
El objetivo del proceso es que el cliente acepte el sistema y pasarlo a producción. Se debe
revisar el plan de implantación denido en el estudio de viabilidad del sistema (EVS). Los
usuarios adecuados deberán colaborar en el proceso.
Se debe hacer una preparación previa del entorno de operación. Se realizan pruebas de dos
tipos: 1) de implantación para asegurar que el sistema funciona incluso en condiciones extremas
y 2) de aceptación, que las realizan los usuarios para validar que el sistema satisface sus nece-
sidades. Posteriormente se prepara el sistema para su mantenimiento. Finalmente se determinan
los servicios que requiere el sistema que se va a implantar.
Lista de actividades:
IAS 3: Incorporación del Sistema al Entorno de Operación. Se garantiza que todos los
recursos necesarios están disponibles y se realizan las pruebas de implantación y acepta-
ción en el entorno real de operación. Se establecen los procedimientos de explotación y
uso de las bases de datos.
IAS 6: Pruebas de Aceptación del Sistema. Los usuarios nales realizan un conjunto de
pruebas al sistema que validan el cumplimiento de los requisitos y redactan un informe.
Los directores de los usuarios revisan los criterios de aceptación y dirigen las pruebas.
IAS 7: Preparación del Mantenimiento del Sistema. Se intenta conseguir que el res-
ponsable de mantenimiento esté familiarizado con el sistema. Por este motivo esta persona
formará parte del equipo de implantación. Es recomendable que exista una gestión de la
conguración.
IAS 9: Presentación y Aprobación del Sistema. Tiene lugar una presentación al comité
de dirección para aceptar formalmente el sistema.
3. Adaptativo: Cambios para que el sistema siga funcionando en entornos distintos al origi-
7.4 Métrica 3 145
nal.
Cuando se registra una petición se designa a la persona que atenderá la petición. Se estudia el
alcance del problema, las alternativas de solución y el impacto de las posibles soluciones en la
organización.
El cambio seguirá el mismo ciclo de vida que el desarrollo de un sistema, es decir, los mismos
procesos.
Lista de actividades:
Interfaces
146 Metodologías de desarrollo
Actividades de inicio del proyecto Tienen dos objetivos: Estimar el esfuerzo identicando
los elementos que se deben desarrollar y planicar las actividades (recursos, planicación de
tareas y calendario). Lista de tareas:
2. Planicación. Tareas:
Asignación de tarea.
3. Seguimiento de tareas.
7.4 Métrica 3 147
Seguimiento de tareas.
Analizar impacto.
Registro de la la incidencia.
Gestión de cambios en los requisitos: Es mejor que estos cambios no ocurran, pero si
así es, se plantean al comité de seguimiento. El impacto del cambio del requisito en
términos de plazos y presupuestos se debe pactar con el cliente. Deberá existir un
registro de cambios que reeje para cada cambio:
Catálogo de necesidades.
Estimación de esfuerzo.
Aprobación de la solución.
Comprobación de la tarea.
Actualización de tareas.
Obtención de la extrapolación.
El objetivo es garantizar que el sistema resultante cumpla con unos requisitos mínimos de
calidad. Se llega a este objetivo haciendo revisiones exhaustivas de todos los documentos produ-
cidos. El equipo que participa en el aseguramiento de la calidad es independiente al de desarrollo.
Sus funciones son:
2. Comprobar que se han llevado a cabo las medidas preventivas o correctoras necesarias.
El aseguramiento de la calidad está dividido en seis áreas, cada una de ellas cuenta con sus activi-
dades y cada actividad con sus tareas. Estas áreas se corresponden con las etapas del desarrollo,
es decir, el aseguramiento de la calidad se lleva a cabo durante todos los procesos del ciclo de
vida. Veamos cada una de estas áreas una a una.
Estudio de viabilidad del sistema Se analizan las condiciones de desarrollo de cada una de
las alternativas propuestas y las características que deben cumplir. Los riesgos especícos de los
sistemas que se van a desarrollar pueden inuir en la forma concreta en la que se aplique el plan
de calidad, que puede estar denido en alguna norma de la propia empresa o seguir un estándar
publicado. Actividades:
7.4 Métrica 3 149
Análisis del sistema de información Se detallan el plan de calidad y los estándares o normas
a seguir. El grupo encargado de esta tarea revisa: catálogo de requisitos, modelos resultantes del
análisis y plan de pruebas. Actividades:
Diseño del sistema de información Se revisan los siguientes conjuntos de requisitos: los
especicados en el análisis, los de las pruebas y los no funcionales. Actividades:
Implantación y aceptación del sistema Hay que comprobar que efectivamente existe un plan
de implantación y que se han realizado las pruebas de implantación y de aceptación del estudio
de viabilidad y la normalización del plan de aseguramiento de la calidad. Se debe vericar que
se entrega el sistema a los responsables del mantenimiento en condiciones para que éste se pueda
realizar. Lista de actividades y tareas:
7.4 Métrica 3 151
Las incidencias.
La palabra seguridad hace referencia a la gestión de riesgos. Esta interfaz pretende dotar a
Métrica 3 de mecanismos de seguridad adicionales a los que tiene de por si la metodología. Hay
dos tipos de actividades diferenciadas:
Análisis del sistema de información Las funciones de seguridad son un servicio que garantiza
la seguridad del sistema de información. Un mecanismo de seguridad es la lógica o algoritmo
que lo implementa. Actividades:
Diseño del sistema de información Se minimizan los riesgos intrínsecos al sistema de infor-
mación. Determinar el entorno tecnológico es importante porque sobre él se implementan las
medidas de seguridad.
Construcción del sistema de información Se debe evitar que se ltren datos relativos al
sistema de información. Se verica el resultado de las pruebas de las funciones y mecanismos
adicionales de seguridad. También se completa la denición de formación a usuarios nales.
Actividades:
Implantación y aceptación del sistema Se especican las actividades que tienen que ver
con la seguridad del sistema construido, tanto intrínseca como las que tienen que ver con la
seguridad del proceso. Asegura que se cubran los requisitos de seguridad a través de las pruebas
de implantación. Lista de actividades:
Internet ha supuesto una revolución, no sólo en el mundo de la informática, sino en todos los
campos del conocimiento. Nunca antes la información había estado disponible como lo está aho-
ra para todos. Internet es algo así como el sistema nervioso del mundo. Una de las consecuencias
es que hay formas nuevas de trabajar, por ejemplo, ahora una persona puede colaborar con otras
que no conoce en un proyecto. La información compartida se puede dejar en un almacén común
y se denen políticas poco o nada restrictivas acerca de quién puede leer esa información o a
quién se acepta como colaborador.
El inicio del movimiento del desarrollo de Software Libre a través de Internet ha supuesto
también la aparición de nuevos métodos y la adaptación de otros a esta nueva forma de desa-
rrollo. Las metodologías tradicionales presuponen una organización del reparto de tareas gestio-
nado mediante responsables que distribuyen y supervisan el trabajo. Cuando se trata de trabajo
cooperativo voluntario a través de la Red ese esquema ya no es válido y se plantean nuevas for-
mas de coordinación distribuida del trabajo. Los términos catedral y bazar hacen referencia
a una metáfora de ambos enfoques que propuso Eric S. Raymond en su famoso libro titulado
precisamente así, The Cathedral & the Bazaar [Ray99]. Donde comparaba las metodologías
tradicionales de desarrollo con la construcción y desarrollo de una catedral, en contraposición
de la forma de crecimiento y expansión aparentemente caótica de un bazar.
Los métodos de desarrollo de software libre, realizados por programadores muy variados
y con distintas formas de codicar, funcionan en la práctica porque todo el producto está dis-
ponible desde el primer momento públicamente para su revisión y comprobación. Se logran
resultados extensos a base de pequeñas contribuciones individuales pero muy numerosas. Para
poder aportar alguna contribución es necesario haber visto y comprendido el trabajo que ya está
realizado y por tanto se produce una sinergia con los programadores predecesores que resulta en
un desarrollo armonioso. Evidentemente en estos proyectos es necesario algún tipo de coordina-
ción mínima que es llevada a cabo por el desarrollador más reconocido que habitualmente es el
que más ha contribuido. Nos extenderemos más en el método bazar por ser la parte novedosa.
7.5.1. La catedral
Es el método tradicional y seguido por la mayor parte de los fabricantes de software hoy en
día. Características:
2. Hay poco personal y bien escogido. Aumentar mucho el número de personas es caro y
pasado cierto punto no acelera el desarrollo, sino que lo ralentiza.
4. El motivo de que las versiones se publiquen tarde en este modelo es que de lo contrario
estarían plagadas de errores.
5. Los errores son difíciles de encontrar, requieren una fase de pruebas que se hace al nal.
7.5.2. El bazar
1. En un principio hay una idea, pero no se tiene una imagen clara de en que se convertirá al
nal.
3. En el momento en el que se puede publicar una versión se hace, aunque esté muy incom-
pleta.
4. Los errores se encuentran con facilidad porque hay muchas personas trabajando simultá-
neamente en ello. Su descubrimiento se pone en marcha desde el principio.
6. La estructura organizativa es difusa, hay una serie de normas para participar pero no una
jerarquía claramente denida. Una persona puede contribuir durante toda la vida del pro-
yecto o de un modo fugaz.
7. El coordinador del proyecto más que tener talento tiene que tener olfato para ver cuando
una idea de otro es buena e incorporarla.
El kernel de Linux es el paradigma número uno que sigue la losofía del bazar. Es un software de
gran tamaño y complejidad, iniciado en principio como un pequeño proyecto por Linus Torvalds
tomando como base el sistema operativo Minix (un antiguo UNIX para clónicos de IBM-PC).
El proyecto sigue en la actualidad mas vivo que nunca y cada día va ganando cuota de mercado
a sus competidores (a algunos los ha dejado atrás ya, p. ej: SCO-Unix. Según Eric S. Raymond
en su libro [Ray99]: La Catedral y el Bazar, las conclusiones que se sacan del método bazar
son:
1. Todo trabajo de software comienza a partir de las necesidades personales del programador.
No es lo mismo trabajar para un proyecto a cambio de un salario que trabajar gratis en algo
en lo que se encuentra una satisfacción personal o se cubre una necesidad. Lo segundo
motiva más.
2. Los buenos programadores saben qué escribir. Los mejores qué reescribir (y reutilizar). Es
más fácil partir de una solución aunque sea incompleta y mala que de cero. Linus lo que
hizo no fue construir un sistema operativo desde la primera línea de código hasta el nal
(probablemente aún estaría en ello), en lugar de eso, tomó como punto de partida Minix.
Por tanto, una forma de iniciar un proyecto puede ser buscar un proyecto similar ya hecho
y tomarlo como guía.
3. Contemple desecharlo, de todas formas tendrá que hacerlo. Al nal todo el código de
Minix fue reemplazado, pero mientras existió fue un armazón a partir del cual se pudo ir
cambiando partes. El código de partida no es importante, de hecho seguro que tiene un
156 Metodologías de desarrollo
6. Tratar a los usuarios como colaboradores es la forma más apropiada de mejorar el código,
y la más efectiva de depurarlo.
8. Dada una base suciente de desarrolladores asistentes y beta-testers, casi cualquier pro-
blema puede ser caracterizado rápidamente, y su solución ser obvia al menos para alguien.
9. Las estructuras de datos inteligentes y el código burdo funcionan mucho mejor que en el
caso inverso.
10. Si usted trata a sus analistas (beta-testers) como si fueran su recurso más valioso, ellos le
responderán convirtiéndose en su recurso más valioso.
11. Lo más grande después de tener buenas ideas es reconocer las buenas ideas de sus usua-
rios. Esto último es a veces lo mejor.
13. La perfección (en diseño) se alcanza no cuando ya no hay nada que agregar, sino cuando
ya no hay algo que quitar.
14. Toda herramienta es útil empleándose de la forma prevista, pero una gran herramienta
es la que se presta a ser utilizada de la manera menos esperada.
15. Cuando se escribe software para una puerta de enlace de cualquier tipo, hay que tomar la
precaución de alterar el ujo de datos lo menos posible, y nunca eliminar información a
menos que los receptores obliguen a hacerlo.
16. Cuando su lenguaje esté lejos de uno Turing-completo, entonces las ayudas sintácticas
pueden ser su mejor amigo.
17. Un sistema de seguridad es tan seguro como secreto. Cuídese de los secretos a medias.
18. Para resolver un problema interesante, comience por encontrar un problema que le resulte
interesante.
Tutorial posterior
Resumen de contenidos
Una metodología es una forma de concretar todo lo que se ha visto hasta ahora, que es
más que nada una enumeración ordenada de técnicas. Las metodologías tienen un ciclo de vida
concreto, son o bien orientadas a objetos o estructuradas, realizan las pruebas de un modo, etc.
7.5 Métodos de software libre: cathedral vs. bazaar 157
Es una metodología desarrollada por las personas que han creado el UML, por lo tanto este
se usa a lo largo de todas las etapas. La documentación recomendada es el libro [JBR00].
Extreme Programming
Métrica 3
Este apartado es más que nada una comparación entre las metodologías de desarrollo se-
guidas por empresas que ocultan el código fuente (cathedral) y el fenómeno del software libre
(bazaar) donde el código está a la vista de todos (open source) y puede contribuir mucha gente.
Como actividad general y dado que en este capítulo se han presentado metodologías de desa-
rrollo de software, sería conveniente que el alumno realizara pruebas con los ejemplos desarro-
llados en a lo largo de los temas anteriores para entender cómo se aplicarían estas técnicas sobre
ellos, imaginando diferentes escenarios de desarrollo donde se aplicarían las metodologías aquí
explicadas u otras similares.
3. ¿Cuáles son los pasos a seguir para crear una prueba de unidad en Extreme Program-
ming?
Documentación existente.
Soporte al usuario.
Número de errores.
Herramientas de desarrollo y
validación
CASE (Computer Aided Software Engineering ≡ Ingeniería del Software Asistida por Orde-
nador) es un conjunto de programas creados para automatizar las tareas mecánicas del desarrollo
de programas. Existen herramientas para cada fase del desarrollo: análisis, diseño, codicación
y pruebas pasando también por la generación de interfaces grácas de usuario y de la documen-
tación. En términos generales se entiende por herramienta CASE como un programa orientado al
diseño que es capaz de generar el código de forma automática. Las herramientas CASE pueden
estar especializadas en un solo aspecto o pueden cubrir todo el desarrollo. En este último caso
estaríamos hablando de herramientas CASE integradas o I-CASE.
Depuración de programas.
Generación de documentación.
159
160 Herramientas de desarrollo y validación
Una clasicación se debe hacer en base a un criterio. Los posibles criterios son [Som01]:
Perspectiva de integración: modo en el que están organizados los módulos que ayudan a
realizar las actividades del proceso.
Herramientas de modelado.
3. Herramientas de programación.
6. Herramientas de mantenimiento.
Herramientas de reingeniería.
8. Herramientas de soporte
Herramientas de documentación.
8.1 Herramientas CASE 161
1. Herramientas de reingeniería.
2. Herramientas de pruebas.
3. Herramientas de depuración.
4. Herramientas de análisis.
2. Herramientas no integradas.
Las I - CASE pueden estar integradas en cinco aspectos (según Wasserman, 1990):
Repositorio compartido.
3. Integración de la presentación: Todas las herramientas usan una misma interfaz de usuario.
5. Integración de procesos:
El título de este capítulo es engañoso, debería llamarse Gestión de Archivos del Proyecto,
pero es el nombre con el que se le conoce en la literatura que existe del tema. Este capítulo es
un resumen del interfaz de Gestión de la Conguración denido en Métrica 3 ampliado con el
documento de Gestión de conguración de Angélica de Antonio, que se encuentra en http:
//www.ls.fi.upm.es/udis/docencia/plani/G_Configuracion.pdf y otras fuentes.
La gestión de la conguración se realiza durante todo el ciclo de vida del sistema y facilita su
mantenimiento porque permite valorar el impacto de los cambios. Esta actividad tiene sentido
sobre todo cuando se trabaja en equipo.
Cadena de Revisión: Son las sucesivas versiones que se van produciendo. Cada nueva
versión parte de la anterior y sólo existe una versión nueva.
Variante: Son diferentes versiones de un mismo ECS que coexisten en el tiempo. La razón
de que existan es que a veces un mismo ECS debe satisfacer distintos requisitos en un
momento dado. Puede ocurrir que una variante pase por varias revisiones.
Se trata de ver un método general para seleccionar qué elementos vamos a considerar como
1
ECSs y asignarles nombres. Los pasos a seguir en este método son los siguientes :
1
Este método es lo que teóricamente debe hacerse pero para la mayoría de los proyectos puede ser un poco
farragoso. Lo más práctico es quedarse con un subconjunto de todo esto en función de lo que permita la herramienta
de Gestión de Conguración de la que se disponga
164 Herramientas de desarrollo y validación
2. Selección de los elementos de conguración: Para esta selección se tiene que llegar a un
compromiso entre dos necesidades contrapuestas: 1) No tener una cantidad inmanejable
de información y 2) Tener todos los ECS necesarios para no perder visibilidad sobre el
producto.
3. Establecer relaciones entre ECSs: Los ECSs son objetos relacionados entre ellos. Estas
relaciones permiten ver que ECSs se pueden ver afectados cuando hay un cambio sobre
uno de ellos. Los tipos de relaciones son:
Equivalencia: Por ejemplo hay varios archivos en distintos sitios que son el mismo.
Composición: Es un ECS que en realidad está formado por varios, por ejemplo, el
diseño detallado está formado por diagramas de clases, diagramas de estados, etc.
Variante: Un ECS modicado que coexiste con otras versiones del mismo.
5. Denición y establecimiento de líneas base: Se trata de establecer unos hitos a los largo
del desarrollo. Lo normal es que esos hitos se establezcan al nal de una fase del ciclo de
vida. Al principio del proyecto se deben haber establecido cuales van a ser los ECSs que
contenga cada línea base. Los tipos de líneas base más importantes son:
Línea base funcional: Indica las funciones que realizará el sistema. Se establece
cuando termina la fase de análisis y especicación. Incluye documentos de requisi-
tos, de planicación, de costes y de interrelación con otros sistemas.
Biblioteca maestra: Almacena releases del sistema y los ECS asignados a líneas
base. Esta biblioteca está sujeta a un control de cambios formal.
Esta sección es importante. El objetivo es que exista un cierto orden cada vez que alguien
solicite un cambio sobre algún ECS. Los cambios consisten en la corrección de defectos o en
ampliaciones del sistema. La lista de acciones que se siguen para hacer un cambio son las si-
guientes:
Certicación del cambio: Se realiza una auditoría para certicar que el cambio se ha
producido correctamente. Se liberan los ECS modicados.
Registros
Son documentos o bases de datos con información relacionada con la gestión de la congu-
ración de un determinado producto. Los registros importantes son:
Registro de incidencias: Existe para registrar las necesidades de cambio y cómo se reac-
ciono ante ellas. Recoge: Descripción, resultado de la incidencia y fechas de la incidencia
y de su cierre.
Informes
Son documentos con un formato especíco. Puede producirse bajo demanda o como resul-
tado de una planicación. Informes más importantes:
Informe de estado de los cambios: Es un resumen del estado de las solicitudes de cambio
producidas en un periodo.
Informe de incidencia: Resumen del estado en el que se encuentran las incidencias produ-
cidas en un periodo.
Una auditoría es un examen o prueba que se realiza a un sistema para comprobar y certicar
si cumple determinados requisitos, es decir, es una actividad de control de la calidad. En la
gestión de la conguración existen tres tipos de auditoría:
Auditoría funcional: Comprueba que se han realizado las pruebas relativas a los ECS
auditados y que satisfacen los requisitos exigidos.
Es un documento que se debe producir al principio del proyecto. Dene la política a seguir.
Según el estándar IEEE tiene que tener los siguientes apartados:
1. Introducción
b) Alcance.
c) Deniciones y acrónimos.
d) Referencias.
2. Especicaciones de gestión
8.2 Gestión de la conguración 167
a) Organización.
b) Responsabilidades.
a) Identicación de la conguración.
b) Control de la conguración.
d) Auditoría de la conguración.
4. Control de suministradores
No sería práctico intentar llevar a la práctica el contenido de la sección anterior sin una
herramienta que automatice los aspectos mecánicos. Dentro del mundo del software libre la
herramienta más popular para gestión de la conguración ha sido CVS (Concurrent Versioning
System). El sucesor de esta herramienta es SubVersion aunque CVS se sigue utilizando.
Uno de los problemas que debe resolver cualquier herramienta de gestión de la conguración
es la modicación simultanea de un mismo archivo por dos usuarios distintos. Subversion y
CVS implementan un algoritmo copiar-modicar-mezclar en lugar de bloqueo-modicación-
desbloqueo. En este algoritmo, el cliente de cada usuario se conecta al repositorio del proyecto
y descarga una copia local de los archivos y directorios del repositorio. Los usuarios pueden
entonces trabajar en paralelo, modicando sus copias privadas. Por último, todas las copias
privadas se mezclan en una nueva versión nal. El sistema de control de versiones tiene un
algoritmo de mezcla de archivos, pero no siempre funciona y los usuarios tendrán que resolver
manualmente el problema.
Términos básicos
Repositorio: Almacén central donde están las copias maestras. El repositorio central es un árbol
de directorios.
Repositorio CVS
Red
Funciona como un almacén de archivos. Cada archivo puede tener varias versiones identi-
cadas por un número. Además para cada versión se guarda la fecha y el autor de la modicación
entre otras cosas. En resumen las características más importantes son las siguientes:
Licencia GPL.
Se puede sacar una instantánea (el conjunto de todos los archivos) del estado en el que
estaba el proyecto en cualquier momento temporal.
Se maneja con una interfaz basada en linea de comandos aunque los entornos de desarrollo
tienen una interfaz que facilita el uso.
Limitaciones de CVS:
SubVersion
Es una herramienta similar pero es más moderna que CVS. Tiene todas las características
anteriores pero corrige algunos problemas. Diferencias con CVS:
En vez de tener un número de versión para cada archivo hay un único número de versión
para todo el contenido del repositorio que se incrementa cada vez que alguien actualiza
una copia.
Gestiona mejor los archivos binarios porque se utiliza el mismo algoritmo que para los de
texto.
El software libre es aquel que puede ser obtenido, modicado y distribuido libremente. No
se debe confundir con el software gratuito (freeware), que es el que puede usarse sin pagar
pero que no se puede modicar. El software de dominio público es aquel que no tiene ningún
tipo de licencia y la única obligación que se tiene es consignar el nombre del autor en aquellas
aplicaciones que se deriven de él.
Richard Stallman introdujo una denición de software libre, según la cual el software se
considera libre si se puede hacer lo siguiente:
Licencias
Una licencia por denición es un contrato que establece un derecho de uso sobre algún
producto. Este derecho de uso puede tener ciertas restricciones. En las licencias libres el pro-
gramador inicial retiene los derechos de autor, pero permite a los usuarios normalmente más
cosas que las licencias cerradas. Otorga a los posibles receptores de la distribución por parte de
terceras personas los mismos derechos de quienes distribuyen.
Existen muchas licencias libres de las cuales vamos a ver las principales:
170 Herramientas de desarrollo y validación
GPL: Es una de las licencias más importantes. GPL (GNU General Public License, Licen-
cia Pública General de GNU). Es la licencia bajo la que se distribuye el proyecto GNU,
que surgió en 1984 para desarrollar un sistema operativo de tipo Unix gratuito. La licencia
GPL está pensada para que no se pueda hacer uso de partes de software libre en programas
no libres, también obliga a distribuir el código fuente junto con los binarios.
LGPL: LGPL (Lesser Gnu Public Licence, Licencia GPL reducida). La licencia anterior
tiene algunas restricciones como por ejemplo que un componente que sea GPL no puede
ser utilizado en ningún software comercial. La licencia LGPL permite ser utilizada junto
a software no libre.
BSD y BSD modicada: Es menos restrictiva que las anteriores. Sólo exige que se cite la
frase: All advertising materials mentioning features or use of this software must display the
following acknowledgement: This product includes software developed by the University
of California, Berkeley and its contributors. y debe incluirse una vez por cada componente
BSD. La licencia BSD modicada no tiene la clausula de publicidad.
Concepto de copyleft
Dentro de la comunidad de software libre se desea que el trabajo realizado por una persona
no pueda ser utilizado por otros dentro de software propietario al que luego el autor no tiene
derechos de acceso software hoarding (acaparamiento de software). Según Stallman Copyleft
dice que cualquiera que redistribuye el software, con o sin cambios, debe dar la libertad de
copiarlo y modicarlo más. Copyleft garantiza que cada usuario tiene libertad.
2. Código fuente: Debe estar disponible el código fuente y deberá ser gratis. No se pueden
utilizar ofuscadores de código (programas que reescriben el código fuente dejando la mis-
ma funcionalidad pero haciéndolos ilegibles para humanos). Motivo: No se puede hacer
evolucionar una aplicación si no se dispone de código fuente.
8.3 Entornos de desarrollo de interfaces 171
3. Modicación del código: La licencia permite la modicación del código fuente y el resul-
tado deberá ser distribuido en los mismos términos que el original. Motivo: Es necesario
hacer modicaciones y distribuirlas para que exista un desarrollo evolutivo rápido.
4. Integridad del código fuente del autor: Se puede restringir que se modique el código
fuente sólo si se permite la distribución de parches que modiquen el programa. Las modi-
caciones deben llevar un nombre o un número de versión diferente del software original.
Motivo: Los autores tienen derecho a que se sepa lo que ha hecho cada uno y los usuarios
quien ha hecho el software que usan.
9. La licencia no establece restricciones para otro software: El resto del software que se
distribuya no será afectado por las restricciones del GPL.
8.3.1. Introducción
las líneas de código de muchos proyectos y al ser un tipo de actividad susceptible de reutilizar
código y al ser bastante mecánica existen herramientas pensadas para acelerar su desarrollo. La
idea en la que se basan estos entornos es muy parecida:
1. Se tiene una librería extensa de componentes grácos (etiquetas, editores, botones, etc)
que se muestran en una ventana. En cualquier caso, si se necesita un componente que no
está es casi seguro que se puede encontrar en algún lugar de internet.
2. Se tiene otra ventana que representa la interfaz gráca que se está construyendo donde se
depositan los componentes del punto anterior. El modo de hacerlo puede ser arrastrar y
soltar.
4. El entorno genera el código que produce la interfaz con un aspecto como el que se está
diseñando, encargándose de manipular los componentes de forma adecuada pero sin que
el programador tenga que escribir el código.
8.3.2. Componentes
Un componente es un objeto, que como todo objeto consta de código y datos. De ellos nos
importan tres cosas:
1. Propiedades: Son los valores de las variables públicas. Son un conjunto de variables que
se pueden manipular en tiempo de diseño y de ejecución y que controlan el aspecto externo
de dicho componente.
2. Eventos: Son sucesos como puede ser la pulsación de una tecla o el movimiento del ra-
tón. Existe un gestor de eventos que captura estos sucesos y manda una señal al objeto
adecuado, por ejemplo, si se pulsa el ratón sobre un botón el gestor de eventos invoca el
método OnClick de ese botón.
3. Métodos: Son las funciones del objeto. Se pueden escribir en el diseño, es decir, el desa-
rrollador escribe lo que quiere que ocurra cuando se invoca el método, por ejemplo, que
cuando se pulsa un botón (se invoca OnClick) el título del botón cambie.
Los componentes están estructurados en jerarquías, de modo tal que cuando hay que crear un
nuevo componente lo mejor es derivarlo de uno antiguo reutilizando tanta funcionalidad como
sea posible. Tipos de componentes. La forma de escribir componentes, la forma en la que se
comunican con el resto del software e incluso el sitio donde pueden ejecutarse denen una
taxonomía muy interesante al respecto.
1. ActiveX: Es un tipo de componente que se distribuye como binario, así que puede estar
escrito en cualquier lenguaje de programación. El objeto tiene una interfaz estándar para
que otros objetos se comuniquen con él. Los programas que usan controles ActiveX se
8.3 Entornos de desarrollo de interfaces 173
2. VCL (Visual Component Library): Son componentes grácos para la interfaz de usuario.
Constan de propiedades, métodos y eventos. El código que maneja cada evento es escrito
en un método. Las propiedades se pueden editar en modo de diseño, de modo que no es
necesario escribir líneas de código para inicializar cada componente. Las propiedades y
métodos pueden tener los siguientes tipos de acceso:
Protegido: Sólo pueden acceder a esta parte los componentes que hereden de este.
Esto podría denirse como el apartado artístico. No debe ser despreciado por ello, es
quizás lo más importante. Una interfaz es la parte externa del programa, lo que el usuario ve. Si
está mal diseñada sacará una pobre impresión de ella aunque funcione perfectamente. El usuario
ha de comprender la mecánica y la operativa que le ofrece la interfaz (sintaxis, órdenes, códigos,
abreviaciones e iconos ... ), todo esto supone un trabajo de memorización. Una buena interfaz
minimiza el esfuerzo mental que se demanda al usuario.
Con el n de que esa dicultad se minimice es importante establecer un sistema de ayudas
adecuado. Estas ayudas se centrarán en la operativa y la aclaración de funciones de los elementos
visuales o acústicos. Por otra parte, el diseño de la interfaz supone que el usuario hace un modelo
mental. Es importante la coherencia entre las distintas partes para que ese modelo se mantenga.
Por tanto, el objetivo de una interfaz es que tenga las siguientes propiedades:
5. Las operaciones serán rápidas, incrementales y reversibles con efectos inmediatos (de ser
posible).
6. Los mensajes de error será adecuado a los conocimientos que tiene el usuario, deberán ser
útiles y descriptivos.
174 Herramientas de desarrollo y validación
8. El tratamiento del color debe contar con una serie de normas tales como luminosidad,
saturación, tono, etc. Es mejor tener una profundidad de color lo mayor posible (8 bits
dan 256 colores, 16 bits 65536 colores, etc). Los iconos deben ser descriptivos.
10. Multimedia: Los grácos móviles o las grabaciones pueden aportar dinamismo a la inter-
faz, pero no es bueno abusar de ellos.
8.3.4. Metodología
Se puede entender una interfaz como una aplicación en sí misma, y por tanto, es razonable
que sigamos los mismos pasos que en la construcción de cualquier sistema, esto es, denir una
serie de etapas para su construcción. Esas etapas son las de siempre: Especicación, diseño,
codicación y en lugar de pruebas lo llamaremos test de usabilidad, porque es eso lo que se
pretende comprobar.
El test de usabilidad valida el diseño de la interfaz de usuario. La forma de realizarlo es sentar
a un usuario delante de la máquina con una lista de tareas y pedirle que exprese verbalmente lo
que va pensando mientras tanto. De esta forma se puede ver cuales son los problemas que se
encuentra la gente
La forma de denir una interfaz del sistema para un sistema basado en casos de uso tiene
una serie de pasos y subpasos:
1. Dibujar las pantallas de interacción para los distintos actores-usuarios. Para ello:
Revisar los elementos del modelo del mundo interesantes para el actor-usuario.
2. Especicar el diálogo que da solución a cada caso de uso que se soluciona con la inter-
acción con esta interfaz. Puede especicarse este diálogo de varias maneras, dependiendo
de la complejidad de la interfaz denida (en esta etapa se sugiere escoger el mínimo nivel
de detalle posible, para dar más libertad de diseño en las etapas posteriores):
Son el decálogo a seguir para conseguir un buen resultado en este parámetro. Estas normas
fueron compiladas por R. Molich y J. Nielsen en 1990.
1. Visibilidad del estado del sistema: El sistema debe mantener informado al usuario de lo
que está pasando para obtener de él una realimentación adecuada.
3. Control del usuario y libertad: Los usuarios de vez en cuando cometen errores y deben
tener alguna forma sencilla de salir del estado provocado. Se debe soportar deshacer y
rehacer (undo y redo).
5. Prevención de errores: Es mejor tener un diseño cuidadoso para prevenir los errores que
mensajes de error.
6. Instrucciones accesibles: La información acerca de cómo usar el sistema debe estar visible
para el usuario cuando lo necesite.
7. Flexibilidad y eciencia de uso: Debe existir alguna forma de que las acciones más comu-
nes se puedan realizar rápidamente, por ejemplo con combinaciones de teclas.
8. Diseño minimalista: No deben existir más elementos grácos de los necesarios pues el
exceso de información enturbia la comprensión.
9. Ayudar a los usuarios con los errores: Los mensajes de error deben estar expresados en
lenguaje sencillo (sin códigos de error), indicando el problema y vías de solución.
10. Ayuda y documentación: Debe ser fácil buscar información en la documentación, debe
estar centrada en las tareas de usuario (por ejemplo con una lista de pasos a seguir) y no
debe ser demasiado larga.
8.3.6. Glade
1. Ventana principal: Barra de menú, la barra de herramientas y una lista de ventanas de alto
nivel.
2. El editor de propiedades.
176 Herramientas de desarrollo y validación
3. La paleta: En ella están desplegados los elementos que se pueden poner en la interfaz de
usuario. Están divididos en tres categorías: GTK+ Básico, GTK+ Avanzado y Gnome.
8.3.7. GTK+
GTK+ (GIMP ToolKit) es una librería en lenguaje C para crear interfaces grácas de usuario.
Tiene licencia GPL, lo cual signica que es open source y de libre distribución. Fue diseñado
originalmente como una herramienta de desarrollo del GIMP (General Image Manipulation Pro-
gram) y está construido sobre GDK (GIMP Drawing Kit) que es un añadido de las librerías Xlib.
GTK+ es un interfaz de programación de aplicaciones orientadas a objetos (API). Aunque
está escrito en lenguaje C, fue pensado con la idea de las clases y los punteros a funciones.
Al igual que el anterior permite usar gran variedad de componentes (botones, cajas, etc),
pero tiene una exibilidad mayor en el sentido de que los componentes están formados a su
vez partiendo de otros componentes, que lógicamente pueden ser reemplazados. Por ejemplo,
un botón puede tener como hijo un componente etiqueta para representar el texto, pero se puede
sustituir por un bitmap. Por último, GTK+ dene un conjunto de tipos dinámico propio con
reglas nuevas acerca de como gestionarlos.
8.3.8. Anjuta
Editor: Muestra el texto coloreado. Tiene las funciones estándar de Crear, Salvar, Buscar,
etc.
8.3 Entornos de desarrollo de interfaces 177
Proyecto.
Mensajes.
Las funcionalidades ofrecidas son accedidas a través de un sistema de menús que se pueden des-
montar de su lugar original. Las funciones más comunes pueden encontrarse en las cuatro barras
de herramientas. Desde el entorno se puede compilar y ejecutar el programa. Puede asimismo
congurarse para especicar rutas de cheros include, rutas de librerías, librerías para enlazar,
macros, tipos de alertas del compilador, optimizaciones del código, etc. El entorno consta asi-
mismo de algunas utilidades para gestionar proyectos. Existe también la posibilidad de depurar
el programa, o lo que es lo mismo, de ejecutarlo paso a paso, poner puntos de ruptura, evaluar
expresiones, ver los registros de la CPU, etc.
Tutorial posterior
Resumen de contenidos
En capítulo se han colocado todos aquellos temas que no tienen entidad suciente como para
ser un capítulo por sí mismos, es decir, el capítulo es una recopilación de conceptos interesantes
y prácticos acerca de la ingeniería del software.
Herramientas CASE
Una herramienta CASE es una aplicación diseñada para facilitar tareas mecánicas que se
realizan en las diferentes etapas del ciclo de vida. Hay varios tipos y las mejores son las que
cubren todas las etapas del ciclo de vida y pensadas además para una metodología concreta. Se
incluye una clasicación de herramientas CASE.
Gestión de la conguración
Es el conjunto de prácticas y técnicas que ayudan a gestionar todos los documentos (código,
manuales, etc.) que se generan a lo largo del ciclo de vida del proyecto. Existen herramientas
que lo soportan, como CVS del que se hace una pequeña descripción. Los temas que importan
en la gestión de la conguración son: cuáles son los documentos que hay que guardar, cómo se
almacenan, cómo se relacionan entre sí y cómo se gestionan los cambios. El plan de gestión de
la conguración es un documento que dene la política a seguir. Se da una plantilla de dicho
documento. CVS es una herramienta de libre distribución para la gestión de la conguración que
se puede encontrar en cualquier sistema de tipo UNIX ó GNU/Linux. Se describe brevemente
por estar muy extendida. Sourceforge http://sourceforge.net/ es un ejemplo de almacén
centralizado en Internet para el desarrollo de software de libre distribución. Se hace un listado
de sus características más relevantes y se dene lo que se entiende por software libre.
178 Herramientas de desarrollo y validación
5. ¿Qué criterios se emplean para decir que una interfaz de usuario es usable?
Modicaciones en la guía
Los cambios más importantes de la guía son todo lo referente al UML, contenido en el capítulo
1.
Se han eliminado las siguientes referencias a páginas web que ya no están disponibles:
Capítulo 1
• liinwww.ira.uka.de/bibliography/SE
• usuarios.lycos..es/oopere/uml.htm
Capítulo 2: La referencia: www.cibertienda.org parece estar temporalmente no dispo-
nible en la red. No se ha eliminado porque hay numerosas páginas que hacen referen-
cia a esta aplicación. Se puede encontrar información relativa en www.onirica.com/es/
productos/cibertienda
Capítulo 4
• www.oprenresources.com/es/magazine/tutoriales/corba
Capítulo 5
• www.bagley.org/doug/shootout/
• internet.ls-la.net/mirrors/99bottles/
Capítulo 1
• www.eclipse.org
179
180 Herramientas de desarrollo y validación
• eclipse-plugins.2y.net/eclipse/index.jsp
Capítulo 4
• java.sun.com/developer/onlineTraining/corba/corba.html
Bibliografía
[FW94] Neville J. Ford and Mark Woodroffe. Introducing Software Engineering. Prentice-
Hall, 1994.
[JBR00] Ivar Jacobson, Grady Booch, and James Rumbaugh. El proceso unicado de desarro-
llo de software. Addison Wesley, 2000.
[Ray99] Eric S. Raymond. The Cathedral & the Bazaar. O'Reilly & Associates, Inc., October
1999. http://tuxedo.org/esr/writings/cathedral-bazaar/.
[Sch01] Stephen R. Schach. Object oriented and classical software engineering. Mc GrawHill,
2001.
181
Índice alfabético
182
Índice alfabético 183
Espiral, 10 Composite, 69
Cierre, 90 Corrección, 3
Clase, 20
Decorator, 70
Abreviada, 22
Defecto, 122
Abstracta, 20
Delegation, 68
Análisis, 117
DFD, 3
Asociación, 23
Diagrama de actividades, 34
Agregación, 23
Actividades, 35
Calicación, 23
Actividades concurrentes, 35
Composición, 23
Bifurcaciones, 35
Dependencia, 26
Indicaciones, 35
Herencia y generalización, 25
Punto nal, 35
Interfaces, 22
Punto inicial, 34
Multiplicidad, 23
Transiciones, 35
Navegabilidad, 23
Diagrama de clases, 27
Reexiva, 24
Diagrama de colaboración, 32
Rol, 23
Diagrama de componentes, 36
Atributos, 20
Diagrama de despliegue, 37
Diseño, 119
Nodo, 36
Estereotipo, 28 Diagrama de estados, 32
Implementación, 122 Diagrama de objetos, 28
Método, 21 Diagrama de secuencias, 31
Nombre, 20 Activación, 31
Notas, 29 Condicional, 31
Operaciones, 21 Creación, 32
Paquete, 29 Destrucción, 32
Responsabilidades, 21 Invocación recursiva, 32
Subsistema, 29 Iteración, 32
Clase abstracta, 20 Línea de vida, 31
Clase del diseño, 118 Tiempos de transición, 31
Cliente, 130 Diccionario de datos, 4
Cliente/Servidor, 132 Directorio, 80
code-and-x, 2 Diseñador de pruebas, 122
Codicación Diseñar prueba, 123
Estándares, 130 Diseño, 153
Prueba de unidad, 128 Revisión, 75
184 Índice alfabético
Fases, 44
Heurísticas de usabilidad, 175
Entrevistas genéricas, 43
Historias de usuario, 125
Errores, 129, 175
Especicación, 41
I-CASE, 161
Especicación de procesos, 3
IGU, 132
Especicaciones de la base de datos, 94
Implantación y aceptación, 150
Especicaciones de sistema, 94
Implantación y aceptación del sistema, 153
Especicaciones de subsistema, 94
Implementación, 120
Especicaciones del programa, 94
Implementar prueba, 123
Estudio de viabilidad, 94, 148, 152
Indicadores, 90
Evaluación de prueba, 122
Ingeniería de sistemas, 1
Evaluar prueba, 123
Ingeniería del software, 1
Eventos, 172 Ingeniero de componentes, 121, 122
Explicativo, 80 Ingeniero de pruebas de integración, 122
Extreme programming, 124 Ingeniero de pruebas de sistema, 122
Inicio de proyecto, 146
Facade, 70 Inmutable, 69
Factory method, 69 Instrucciones de soporte, 101
Fases ciclo de vida, 5 Integración, 121, 127
Análisis, 6 Secuencial, 127
Codicación, 6 Integrador de sistemas, 121
Diseño, 6 Interface, 69
Mantenimiento, 6 Interfaces, 132, 145
Pruebas, 6 Interfaz, 118, 120
Fiabilidad, 3 Interfaz de usuario
Filter, 69 Diseñador, 113
Finalización, 89, 148 Prototipo, 112, 114
Flujo de sucesos, 112 Islas de conocimiento, 131
Flujo de trabajo, 113, 116, 119, 121 Iteración
Flujos de trabajo, 123 Planicación, 111, 126
Flyweight, 70 Iteraciones, 110
Framework, 65 Iterator, 69
Índice alfabético 185
Prototype, 69 Simula67, 5
Two-phase termination, 71
U-CASE, 161
UML, 15, 104
Unix, 155
Usabilidad, 3
VCL, 173
versión delta, 106
Virtual proxy, 70
Visibilidad, 175
Visitor, 71
Vistas, 108