Buscar en Gazafatonario IT

Mostrando las entradas con la etiqueta Analista del Software. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Analista del Software. Mostrar todas las entradas

lunes, septiembre 17, 2012

Casos de Abuso, Parte 6: Un escenario y un caso de uso es lo mismo

Simplemente no. Muchas veces los términos se usan indistintamente, yo mismo me he visto diciendo “caso de uso” cuando realmente quiero decir “escenario”. Pero ese es otro problema.
 Figura 1: Representación Visual de un escenario de un caso de uso

Un escenario es el flujo que sigue un caso de uso durante su ejecución de acuerdo a un estímulo recibido desde el exterior, vía el Actor del caso de uso, es decir, el usuario. Las cosas así, un caso de uso puede derivar en muchos escenarios, docenas, cientos o miles, dependiendo de la complejidad y el tamaño del caso de uso. Esta es la razón principal por la cual no existe el concepto de Pruebas Exhaustivas, porque es inviable probar con anticipación todos y cada uno de los escenarios de un caso de uso. Un escenario es una instancia de un caso de uso, casi de la misma forma como un objeto es una instancia de una clase. Me refiero a que una instancia de un caso de uso es un camino concreto a través del cual la pareja actor-caso de uso es reemplazada por una persona específica (una instancia de un actor), donde valores y respuestas específicos son dados, y solamente un camino simple es tomado a través de uno o más posibles flujos del caso de uso. Los escenarios están descritos de una manera narrativa, incorporan características concretas de los usuarios y de la materia prima que estos entregan al sistema.

Un caso de uso, por su parte, está constituido por secuencias paso a paso de acciones que conforman el comportamiento de un sistema, asociados a un actor específico. Un caso de uso es muy detallado y típicamente incluye actores, una breve descripción, precondiciones, la secuencia principal y las alternativas, y hasta flujos de excepción; también describe el estado del sistema una vez que ha terminado cada secuencia, es decir, las poscondiciones.

A propósito de este mal uso, otra situación que nos está pasando es que nuestros diseños de software carecen de los escenarios de usuario como entrada principal, lo que constituye una falta importante puesto que los escenarios incluyen todos los detalles que los diseñadores requieren entender sobre lo que los usuarios están tratando de hacer y lo que ellos necesitan. Muchos desarrolladores que nunca ha escuchado acerca de un escenario de uso son capaces de adaptar los casos de uso para incluir esta información de usuario, rica y contextual.

Impacto en la calidad: Alto.
Figura 2: Representación Visual de otro escenario de un caso de uso

Obsérvese de las dos figuras que las posibilidades son virtualmente infinitas.

miércoles, septiembre 12, 2012

Casos de Abuso, Parte 5: El caso de uso contiene detalles de formularios (pantallas) y otros aspectos técnicos (bases de datos, componentes, etc.)


Este error es reiterativo y cuando digo eso me refiero a que siempre hago énfasis en que no es así, pero algunos analistas funcionales insisten en hacer exactamente lo contrario.
Un caso de uso especifica lo que debe hacer un sistema de software. No es correcto incluir detalles de la interfaz gráfica resultante, como botones, cuadros de texto, listas de opciones, entre otros, lo mismo que otros mecanismos relativos a los elementos de software con los que se implementará el caso de uso, como referencias a componentes de software, a librerías de acceso a datos, o a tablas u otros objetos de bases de datos. Todo esto hace parte del “como” se implantará el caso de uso en el sistema una vez que esté terminado, son detalles poco entendibles para el usuario final, interesado principal en la especificación del caso de uso y de los requisitos en general.
Recordemos además que un caso de uso detalla la interacción entre el actor y el software, desde el punto de vista del usuario; es decir, al usuario solo le interesa conocer sobre los insumos que tiene que proporcionarle al sistema a través de ese caso de uso y también de los resultados que el sistema le sirve de vuelta, no cómo ese resultado es calculado, encontrado, o procesado al interior del sistema.
Ahora bien, suele ocurrir que algunos usuarios, a fuerza de lidiar durante tantos años con los sistemas, conocen de nombres de tablas y hasta de procedimientos almacenados y son capaces de establecer explícitamente de qué tabla quieren que se tome un dato o cual procedimiento requieren ejecutar en cierto momento. Estos detalles se documentan, pero se formalizan durante la etapa de Análisis y Diseño del caso de uso, cuando este se suplementa.
Los requisitos del software, y con ellos los casos de uso cuando se utilicen como mecanismo de especificación, son independientes de diseño y de implementación.
Impacto en la calidad: Medio.

martes, septiembre 11, 2012

Casos de Abuso, Parte 4: Resumen ejecutivo


Recapitulemos. Tenemos una lista corta de escenarios en donde estamos usando mal los casos de uso como instrumentos para identificar, organizar, documentar y administrar requisitos de software, tanto funcionales como no funcionales.
Estos son los casos enumerados hasta el momento:
Impacto en la calidad: Alto.
Impacto en la calidad: Bajo.
Impacto en la calidad: Medio.
Impacto en la calidad: Medio.
Entonces, ya sabemos que la especificación de requisitos de software (ERS) viene, o puede aparecer, en recipientes de distintos tamaños y diferentes formas y colores: algunos son cacharros escuetos pero con significado y suficiencia para quien los elabora y para los interesados en los mismos, otros son cristalerías sofisticadas que se aproximan a lo mundano, en el sentido de cosmopolita. Pero contienen requisitos de software, al fin y al cabo.
En términos de artefactos de especificación y modelado de sistemas de información, estoy hablando de folios de especificación funcional, con sus requisitos en prosa y todo el detalle aledaño que siempre los acompaña; pero también me refiero a la descripción de procesos del negocio, desde macro-procesos, hasta tareas simples y atómicas, pasando por procesos y subprocesos; representaciones de herramientas visuales como prototipos estáticos y simuladores.
También hago alusión a diagramas de UML, como  diagramas de actividad y de estado, diagramas de procesos, diagramas de contexto y mapas mentales, entre algunos otros; descripción de reglas y políticas del negocio; acuerdos de entendimiento entre los usuarios y el área de tecnología; listas de deseos escritas a mano; y, las más usadas, historias de usuario y casos de uso. Incluso, con las nuevas tecnologías, los requisitos de software bien pueden aparecerse en formato de videos o audios digitales, fotografías de alta definición capturadas por teléfonos inteligentes, mensajes electrónicos y trinos de 140 caracteres o menos.
Usualmente, la ERS se exhibe en una combinación de dos o más de estos instrumentos y lo único que importa es que provenga de las personas apropiadas e interesadas en el producto de software y que cada requisito cumpla o pueda cumplir con algunos atributos o rasgos de calidad:
·         Claridad
·         Atómicidad
·         Precisión
·         Verificabilidad
·         Necesidad u oportunidad
·         Priorización
La ERS, por su parte, debe ser:
·         Independiente de diseño
·         Completa
·         Consistente
·         Rastreable
·         Modificable / Extensible
Ahora ya sabemos cómo corregir algunos de esos defectos. ¿Ustedes qué creen?
Salud@s.

domingo, septiembre 09, 2012

Casos de Abuso, Parte 3: El caso de uso se identifica, elabora, diseña, implementa y prueba en la misma iteración


El modelo iterativo de desarrollo de software dicta que podemos construir el sistema mediante incrementos en períodos de tiempo relativamente cortos y con un objetivo fijo. A estas fases de tiempo se les conoce como Iteraciones y al producto (resultado) de la fase se le conoce como Incremento.
En otras palabras, una iteración es un mini-proyecto con una salida bien definida: una versión incrementada, estable, probada e integrada del producto de software, con su documentación asociada. Pues bien, una de las faltas típicas que cometemos durante el ciclo de vida del software tiene que ver con esto.
Veamos de qué se trata:
Caso de Abuso 4: El caso de uso se identifica, elabora, diseña, implementa y prueba en la misma iteración.
Este es un error muy común al iniciarse en un proceso iterativo. Un caso de uso pasa por varias etapas o períodos durante su ciclo de vida: desde la identificación o descubrimiento del caso de uso, hasta la puesta en ejecución del mismo, pasando por la Ingeniería del Caso de Uso (conocida entre nosotros como la Ingeniería de Requisitos), el Análisis y Diseño, la Implementación, las Pruebas y el Despliegue final.
Y cada una de estas etapas ocurre a través distintas fases del proyecto y de diferentes iteraciones. Durante la fase de inicio o visionamiento del proyecto, descubrimos un número significativo de casos de uso y algunos de ellos pasan a la etapa de Ingeniería de Requisitos; muy pocos de estos casos de uso llegan a la etapa de Análisis y Diseño y ninguno llega a la Implementación.
Más adelante, durante la fase de Planeación o Elaboración del proyecto, los llamados casos de uso arquitectónicos, de los identificados en la fase previa, llegan a las etapas de implementación y pruebas, mientras que otros casos de uso son descubiertos y otros llegan al período de Ingeniería de requisitos.
Durante las siguientes fases del proyecto, algunos pocos casos de uso son identificados, los últimos, y los demás pasan, iteración tras iteración, por las etapas expuestas; pero nunca, un caso de uso se identifica y llega a implementarse en la misma iteración, por muy simple que sea. Eso sería apenas una simple coincidencia y, casi siempre, un error.
Muy relacionado con este abuso está el abuso No. 12, aunque hay diferencias fundamentales entre aquel y este. (Lo veremos en su momento)
Impacto en la calidad: Medio.

miércoles, septiembre 05, 2012

Casos de Abuso, Parte 2: El caso de uso es la única documentación necesaria para construir el software


Abusar.
(De abuso).
1. intr. Usar mal, excesiva, injusta, impropia o indebidamente de algo o de alguien. Abusaba DE su autoridad.
Real Academia Española © Todos los derechos reservados
Caso de Abuso 3: El caso de uso es la única documentación necesaria para construir el software.
Quizás esta idea surge de la premisa de que el proceso de desarrollo de software es dirigido por casos de uso [1], que es algo mucho más amplio y totalmente distinto. Además, está el factor tiempo que siempre hace falta en los proyectos de desarrollo de software.
Un caso de uso es el primer repositorio de documentación en un proyecto, puesto que es el artefacto que legitima los requisitos funcionales del software. Sin embargo, después del caso de uso y antes del código fuente hay un abismo sobre el que debemos construir un puente para ir desde la solicitud del usuario, su problema y sus necesidades, hasta un sistema de software que soporte su proceso, que resuelva su problema y cubra sus necesidades.
Ahora bien, hay casos de casos: están los llamados casos de uso arquitectónicos o más complejos, que bien podrían representar alrededor del 20% del total de casos de uso de un proyecto. A estos casos de uso debemos aplicarles rigurosamente el proceso: Análisis, Diseño, Implementación, Pruebas, Despliegue y vuelta a empezar. Y durante el Análisis y el Diseño se construyen una serie de artefactos que van desde documentos anexos hasta diagramas (de UML) de casos de uso, de secuencia, de comunicación, de clases, de estados, de actividad y de entidad-relación, entre otros. También están los requisitos no funcionales o especiales que aplican a cada uno de esos casos de uso, el pseudocódigo y los prototipos; asimismo, están los casos y procedimientos de prueba.
Es principalmente durante el período de Análisis y Diseño del caso de uso cuando ocurre la suplementación del mismo, es decir, la adición de detalles técnicos y no funcionales al caso de uso. Y en todas estas actividades intervienen todos los miembros del equipo del proyecto: unos elaboran y presentan, otros retroalimentan, complementan, realizan el siguiente paso y también lo presentan, y así, en una espiral en la que el producto se va gestando hasta quedar terminado.
Luego están los demás casos de uso del proyecto, el otro 80%. Unos son más complejos que otros desde el punto de vista de diseño, mientras que algunos son más críticos que otros desde la perspectiva del usuario. Muchos de estos casos de uso, sino todos, también deben someterse al mismo proceso que los anteriores. Lo que varía es la severidad o formalidad con que se elaboren todos esos artefactos.
Dependiendo del tipo de proyecto, de los aspectos legales del mismo y de otras variables del entorno, será necesario realizar cada documento siguiendo plantillas formales del proceso de desarrollo, casi con rigurosidad científica: diagramas de UML bien construidos y detallados, tantos como sean necesarios para entender el producto, documentos sujetos al escrutinio de revisiones técnicas y de estilo, con listas de chequeo formales y con todas las excepciones consideradas. Algunos casos de uso requerirán de tres, cinco o más diagramas de interacción, por ejemplo; otros necesitarán sólo uno de estos diagramas.
En otros proyectos, menos formales desde el punto de vista legal (aunque es difícil imaginar tal cosa), será suficiente con que estos artefactos se elaboren en reuniones de análisis y diseño en un tablero donde todo el equipo de desarrollo pueda verlos, opinar, tomar nota y entenderlos, que es el objetivo último del modelado.
La categoría de las herramientas a usar también depende de la complejidad técnica y de la formalidad legal: para unos proyectos basta lápiz y papel, o tiza y tablero, mientras que para otros serán necesarias herramientas sofisticadas de Ingeniería de Software.
En cualquier caso, nunca hay que perder de vista que el software, por naturaleza, es complejo; y que construir software, por naturaleza, es una actividad compleja. También, que las herramientas con las que se construye software (que casualmente están hechas de software) también son complejas. Y con este nivel de complejidad, no es posible que algo simple, como el caso de uso, sea capaz de resolver nuestro problema sin más colaboración.
Impacto en la calidad: Alto.
Referencias
[1]   Luis Antonio Salazar Caraballo, “RUP: Fase de Concepción”, Gazafatonario IT,  http://gazafatonarioit.blogspot.com/2007/03/lecturas-fundamentales-8.html, 08 mar. 2007.
La Parte 1 de este análisis lo encuentras en: http://gazafatonarioit.blogspot.com/2012/09/casos-de-abuso-parte-1.html
Sobre abecés, anatomía y prácticas de casos de uso y requisitos en general, puedes visitar mi Sección Lecturas Fundamentales en este mismo Gazafatonario IT.

martes, septiembre 04, 2012

Casos de Abuso, Parte 1: El caso de uso se usa en todos los casos


La segunda ley de la Ingeniería del Software o el modelo Información-Materia-Energía (IME) establece que el mundo natural que forma el contexto de la inteligencia humana y la ciencia del software es una dualidad: un aspecto de ésta es el mundo físico y el otro es el mundo abstracto, donde la materia y la energía son usadas para modelar el primero, y la información, para modelar el segundo. Los modelos del mundo físico han sido bien estudiados por la Física y otras ciencias naturales. Sin embargo, el modelado del mundo abstracto todavía es un problema fundamental a ser explorado por la ingeniería del software.
Ahora bien, aunque el mundo físico es el mismo para todas las personas, el mundo natural es percibido de forma diferente por distintos individuos debido a que el mundo abstracto, como parte de éste, es subjetivo dependiendo de la información que los individuos obtienen y perciben. Y es debido a esta diversidad en la percepción del mundo abstracto que se presentan los errores en la ingeniería del software y por ello es que son más comunes de lo que a veces queremos. En el ciclo de vida de la ingeniería del software, esos errores empiezan durante la identificación, especificación y modelado de casos de uso.
Algunas de estas falencias, son las que empezaré a presentar a partir de hoy en varias entregas. Se trata de un estudio de los malos usos de los casos de uso.
Este es realmente un estudio patológico y forense: es patológico porque hago un estudio de los desórdenes más comunes encontrados durante mis continuas revisiones de casos de uso a todo lo largo de su ciclo de vida: identificación, especificación, análisis, diseño, implementación y pruebas. Quise hacer este estudio en un sentido amplio, es decir, observé estas alteraciones como procesos o estados anómalos de raíces conocidas o ignoradas. También es patológico porque extraje las pruebas que señalan la presencia de tales afecciones del examen minucioso de cada error en todos sus niveles estructurales, desde el nombre del caso de uso, hasta las secuencias básica y las alternativas del mismo, pasando por la breve descripción, las pre y poscondiciones, el actor y los requisitos especiales, entre otros aspectos. Desde este punto de vista me convertí en un anatomopatólogo o, simplemente, en un patólogo clínico de los casos de uso, si es posible trasladar ese término médico a nuestro entorno.
Es forense porque estudié los aspectos técnicos derivados de la práctica diaria de los equipos de desarrollo de software, en los que he participado centenares de veces, como sujeto activo y como perito. Bajo este último título he tratado de contribuir con mi actuación a dar valor y significación genuinos a los aciertos hechos en materia de especificación y evolución de casos de uso y también a la promoción de ciertas prácticas que creo exitosas en la industria. En particular, he tenido la oportunidad de examinar y recoger indicadores de casos de uso propios y de extraños (colegas, clientes, socios de negocio); de los modelos y especificaciones de casos de uso he determinado los elementos donde se presentan los errores, las posibles causas de los mismos y he presentado posibles soluciones.
Caso de Abuso 1: El caso de uso se usa en todos los casos.
Es un juego de palabras pero es falso. Los casos de uso son un repositorio, un mecanismo de comunicación durante el ciclo de vida de desarrollo del software. Contienen y transmiten requisitos y otros aspectos relacionados con la funcionalidad del software en construcción.
Pero hay muchas maneras de documentar todo esto: documentos de requisitos funcionales y no funcionales donde, en prosa, se especifican los detalles del producto. En otros casos se pueden usar prototipos, como en los reportes ad-hoc o estándares, donde preparar un documento en el que se muestre como lucirá un reporte es más práctico que escribir en palabras los detalles del mismo. En otros casos, serán necesarios uno o más diagramas de UML (de estados o de actividad, por ejemplo), como cuando la descripción en prosa del proceso funcional es engorrosa debido a la complejidad del proceso y, además, un prototipo no es suficiente o no aplica.
Impacto en la calidad: Bajo.
Caso de Abuso 2: Lo que no está documentado en los casos de uso no hace parte del proyecto.
Esta es una consecuencia del abuso anterior. En muchas ocasiones usamos sólo los requisitos que están consignados en casos de uso para realizar la estimación del proyecto, para considerar tiempos y recursos, para definir la arquitectura del software y para diseñar el sistema. Sólo cuando ya es muy tarde alguien recuerda que hay otras funcionalidades a diseñar e implementar y que posiblemente afecten no sólo la arquitectura del sistema, sino también los tiempos y los recursos necesarios para terminar el producto. Un caso típico ocurre cuando el producto tiene muchos procesos batch, de esos que se ejecutan por la noche o al cierre de un período específico y que hacen uso intensivo de datos sin ninguna interfaz gráfica. Otro caso se presenta con las consultas y reportes, muchas veces menoscabados, en el sentido de reducidos, por todos los involucrados en el proyecto.
Impacto en la calidad: Medio.

viernes, julio 20, 2012

Ventajas y Desventajas del Uso de Prototipos


Algunas Ventajas del uso de prototipos

1.       Permiten el desarrollo de un sistema a partir de requisitos poco claros o cambiantes. Esto ocurre con cierta frecuencia en muchos proyectos de software.
2.       Como información complementaria a los requisitos constituyen un gran apoyo a las estimaciones de esfuerzo de todas las áreas, incluyendo proveedores.
3.       Son más fáciles de abordar con los usuarios finales.
4.       El usuario participa más activamente en la construcción del producto de software (La Solución), ya que “lo puede ver” y, dependiendo del tipo de prototipo,  “utilizar” desde el primer momento.
5.       Se reduce el riesgo o la incertidumbre sobre la implementación del software.
6.       Su uso redunda en una mayor satisfacción del usuario con el producto final, ya que él o ella han participado activamente de su diseño.
7.       Proporciona al usuario un mayor conocimiento del sistema con una curva menor de aprendizaje.
8.       Permite a todos los involucrados entender bien y mejor el problema antes de la implementación final.

Algunas Desventajas del uso de prototipos

1.       El usuario quiere empezar a trabajar desde el primer momento con el prototipo para solucionar su problema particular, cuando el prototipo es solo un modelo de lo que será el producto.
2.       Los prototipos generan o pueden generar otro tipo de problemas si su presentación y discusión con los usuarios no es controlada: puesto que son modelos inconclusos, los usuarios suelen enfocarse en aspectos “superficiales” del prototipo que los pueden dejar inconformes luego de verlos por primera vez. También es posible que se pierda mucho tiempo, innecesariamente, tratando de hacer entender al usuario la finalidad real de los prototipos.
3.       Requiere participación activa del usuario, al menos, para evaluar el prototipo. Y mucho más involucramiento si queremos que participe en su creación.
4.       Una desventaja importante a tener en cuenta es la falta de experiencia que tienen muchos Analistas Funcionales en programación y en actividades de diseño de interfaces de usuario.

Revisar/Aprobar Prototipos en Vez de Requisitos/Casos de Uso

Los prototipos son una herramienta suplementaria a la especificación de requisitos (funcionales). Con esto en mente, es posible que los usuarios revisen y aprueben estos prototipos durante la fase inicial del proyecto. Más adelante, el usuario puede confirmar su grado de satisfacción por los prototipos, más cercanos al producto final.
La otra parte de la tarea, aunque igualmente importante, es que entonces será el Analista Funcional el encargado de verificar que la descripción de los prototipos corresponda a la especificación de los requisitos en su totalidad. Las cosas así, es evidente que se incrementa el esfuerzo de los Analistas, sobre todo en la etapa de Visión y Alcance del proyecto. No obstante, el proceso de construcción de software puede mejorarse con la inclusión de guías para la elaboración de prototipos en las distintas plataformas.

Recomendación para implantar el uso de prototipos en un proceso de software

Como siempre, la recomendación es realizar algunos pilotos controlados donde pongamos en práctica el uso de prototipos en distintos proyectos, donde podamos medir y analizar los resultados con el fin de tener mejores herramientas para tomar la decisión, no solo de incluir los prototipos como una práctica común y hasta obligatoria durante el ciclo de vida, sino para que estos sean revisados/aprobados por los usuarios, en vez de los requisitos y casos de uso.

miércoles, julio 18, 2012

El uso de prototipos en el ciclo de vida de construcción del software

 Los prototipos son una técnica ampliamente usada para descubrir y documentar requisitos y casos de uso. En este caso hablamos de los prototipos de la interfaz de usuario, es decir, de todo lo que tiene que ver con la interacción usuario-máquina.

Los prototipos son muy útiles para refinar la especificación de requisitos funcionales del software, específicamente en todo lo que tiene que ver con la descripción de pantallas o formularios de entrada de datos, formulario de salida de datos (consultas), reportes, las opciones de navegación y, en general, toda la carta de navegación del usuario a través del software.

Existen prototipos rápidos y prototipos evolutivos. Los primeros son aquellos que se realizan en las primeras etapas del ciclo de vida y son usados para solucionar inquietudes iniciales relacionadas con la interfaz de usuario que no están claras o precisas en la documentación textual de los requisitos. Estos prototipos pueden ser elaborados en papel o en herramientas básicas como MS-Office (Word, Power Point, Excel, Visio).

Los prototipos evolutivos son artefactos más elaborados que se construyen durante la fase de diseño del software como complemento a la especificación de requisitos (y casos de uso) y que están muy cercanos al diseño final de la solución. Normalmente son hechos con las mismas herramientas con las que será construido el software o con alguna herramienta de automatización que permita generación de código fuente o algo parecido.

Hay distintos aspectos a tener en cuenta durante el uso de prototipos:

  •  Tipo de problema a resolver: si el problema es no-estructurado, novedoso, complejo o de manejo de información con un alto grado de personalización para un usuario o un grupo de usuario, entonces la técnica es muy útil.
  •  Conocimiento de los requisitos: si se desconocen los detalles de los requisitos del software, si existe poca información al respecto, los prototipos son útiles.
  •  Necesidad de revisar, evaluar y aprobar los requisitos: si los procedimientos o controles exigen que los requisitos del software sean revisados, evaluados y aprobados por usuarios y otro tipo de personas, los prototipos serán de gran ayuda a la hora de tomar decisiones.
  •  Este aspecto es crucial en muchas compañías ya que el alto grado de formalidad que exigimos para la especificación de requisitos, que tiene carácter contractual, exige que no solo los usuarios revisen y aprueben los requisitos y casos de uso, sino que estos deben ser revisados y valorados en distinto grado por personas de distintas áreas.
En estos casos es cuando los prototipos juegan un papel muy importante ya que aclaran situaciones que no están precisas en los documentos de texto. Sobre todo, con el bajo grado de madurez que tienen los documentos de requisitos y de casos de uso en el medio.

Otros aspectos a tener en cuenta en el uso de prototipos son: la cantidad y calidad de los riesgos del proyecto/requerimiento, no disponibilidad de los usuarios para revisiones y aprobaciones, uso de nuevas tecnologías o la falta de experiencia en el uso de esas tecnologías, entre otros.


Algunas Ventajas del uso de prototipos

  1.  Permiten el desarrollo de un sistema a partir de requisitos poco claros o cambiantes. Esto ocurre con cierta frecuencia en muchos proyectos de software.
  2.  Como información complementaria a los requisitos (y casos de uso) constituyen un gran apoyo a las estimaciones de esfuerzo de todas las áreas, incluyendo proveedores.
  3.  Son más fáciles de abordar con los usuarios finales.
  4.  Precisamente, el usuario participa más activamente en la construcción del producto de software (La Solución), ya que “lo puede ver” y, dependiendo del tipo de prototipo,  “utilizar” desde el primer momento.
  5. Se reduce el riesgo o la incertidumbre sobre la implementación del software.
  6. En general, el uso de prototipos redunda en una mayor satisfacción del usuario con el producto final, ya que él o ella han participado activamente de su diseño.
  7. Proporciona al usuario un mayor conocimiento del sistema con una curva menor de aprendizaje.
  8. Permite a todos los involucrados (usuarios y equipo de trabajo, incluyendo proveedores) entender bien y mejor el problema antes de la implementación final.
Algunas Desventajas del uso de prototipos

  1.  En general, encontramos que el usuario quiere empezar a trabajar desde el primer momento con el prototipo para solucionar su problema particular, cuando el prototipo es solo un modelo de lo que será el producto.
  2.  Los prototipos generan o pueden generar otro tipo de problemas si su presentación y discusión con los usuarios no es controlada: puesto que son modelos inconclusos, los usuarios suelen enfocarse en aspectos “superficiales” del prototipo que los pueden dejar inconformes luego de verlos por primera vez. También es posible que se pierda mucho tiempo, innecesariamente, tratando de hacer entender al usuario la finalidad real de los prototipos.
  3.  Requiere participación activa del usuario, al menos, para evaluar el prototipo. Y mucho más involucramiento si queremos que participe en su creación.
  4. Una desventaja importante a tener en cuenta es la falta de experiencia que tienen muchos Analistas Funcionales en programación y en actividades de diseño de interfaces de usuario.

Revisar/Aprobar Prototipos en Vez de Requisitos/Casos de Uso

Los prototipos son una herramienta complementaria, una técnica más, para la especificación de requisitos (funcionales), incluyendo casos de uso. Con esto en mente, es posible que los usuarios revisen (previa presentación “en vivo”) y aprueben estos prototipos durante la fase de Visión del proyecto/requerimiento. Más adelante, al final de la fase de Diseño (Planeación), el usuario puede confirmar su grado de satisfacción por los prototipos, estos ya más cercanos al producto final.

Tanto los primeros como estos últimos prototipos deben incluir el diseño de formularios de captura o ingreso de datos, formularios de consulta, reportes, opciones de navegación (menú), mensajes de usuario, ayudas en línea, entre otros aspectos. La única diferencia entre unos y otros prototipos debería ser la herramienta usada en la construcción de los prototipos y la precisión (menor en Visión, mayor en Planeación) de tales prototipos.

La otra parte de la tarea, aunque igualmente importante, es que entonces será el Analista Funcional el encargado de verificar que la descripción de los prototipos corresponda a la especificación de los requisitos en su totalidad. Las cosas así, es evidente que se incrementa el esfuerzo de los Analistas, sobre todo en la etapa de Visión y Alcance del proyecto. No obstante, el proceso de construcción de software puede mejorarse con la inclusión de guías para la elaboración de prototipos en las distintas plataformas.

Recomendación para implantar el uso de prototipos en un proceso de software

Como siempre, la recomendación es realizar algunos pilotos controlados donde pongamos en práctica el uso de prototipos en distintos proyectos, donde podamos medir y analizar los resultados con el fin de tener mejores herramientas para tomar la decisión, no solo de incluir los prototipos como una práctica común y hasta obligatoria durante el ciclo de vida, sino para que estos sean revisados/aprobados por los usuarios, en vez de los requisitos y casos de uso.

viernes, abril 13, 2012

Sobre el Papel del Analista Funcional y la Reunión de Presentación de Casos de Uso

Sobre el Analista Funcional
Uno de los errores más comunes que se comenten a la hora de hacer análisis funcional es pensar solo en el presente, en resolver la situación actual, cuando se debería pensar en el futuro, hacía donde quiere ir la organización, cuál es su misión, cuál es su visión y con qué cuenta para llegar hasta allá.
De nada sirve resolver el problema presente si al día siguiente se nos van a presentar otros. En este caso, la anticipación es la clave y más que ello, la visión que tengan los analistas funcionales de hacia donde se va a mover el mercado, el conocimiento de las tendencias, los movimientos de la competencia, las expectativas de los clientes, las corrientes tecnológicas, los rumbos de la economía, entre otros aspectos significativos.
Es allí donde precisamente los indicadores de gestión juegan un papel de apoyo a la hora de tomar las mejores decisiones, aquellas que permitan ir en la dirección correcta. Esa es la trascendencia del Analista Funcional, muchas veces poco vislumbrada en nuestro ámbito, pero real y necesaria. No se trata solo de un asunto de modelamiento de requisitos, se trata de modelar toda una organización y de su perspectiva de supervivencia en el tiempo y en el medio ambiente que la rodea.
Sobre la Reunión de Presentación de Requisitos
Es altamente recomendable que los participantes de la reunión también sirvan como “revisores pares”. Es decir, todos debemos contribuir a que el producto resulte de la mejor calidad posible y esta es una muy buena oportunidad para hacer una gran intervención.
Cada participante bien podría “correr” una lista de chequeo similar, para que la revisión sea lo menos subjetiva posible y para que haya cierta homogeneidad. Esta revisión debería buscar errores de forma, apuntar en principio a aquellos atributos que mencioné en la presentación inicial de este debate, como la claridad, la atomicidad y la precisión de los requisitos y casos de uso, entre otros atributos. 
Pero también, si es posible, buscar errores de contenido, del “negocio”, aspectos que bien pudieron omitirse por parte del Analista Funcional, quizás por considerarlos sobrentendidos o quizás porque nadie se percató de ello con anterioridad. Por ejemplo, revisar si faltaron aspectos contables o regulaciones legales por especificar, o si no se consideraron a ciertos interesados (léase “stakeholders”) externos, como agencias auditoras o supervisoras del gobierno. 
Para todo esto sirve esta primera presentación al resto del equipo y por ello es que la lectura por parte de todos es ineludible.

miércoles, abril 11, 2012

Sobre “interpretación” vs. “realización” de casos de uso

Algo que ocurre muchas veces es que todos los miembros en un equipo de proyecto de software esperan que en la documentación de requisitos, en general, y de casos de uso, en particular, esté incluido no solo la especificación de requisitos (funcionales y no funcionales), la definición del problema y sus detalles, sino también la solución de ese problema en términos de software.

Es decir, esperamos que la especificación de un caso de uso, por ejemplo, contenga los elementos básicos de un caso de uso, como el Actor, la secuencia básica y las alternativas (si existen), las pre y pos-condiciones y los requisitos especiales, entre otras. Pero también esperamos que tenga la así llamada “realización del caso de uso”. 

Esta no es más que el análisis y diseño del caso de uso, o sea, la manera como se va a implementar ese caso de uso en términos de diseño. Normalmente para esto usamos diagramas de UML, los que sean necesarios, empezando por diagramas de interacción (ya sean de Secuencia o de Comunicación), y también diagramas de Estado o de Actividad, entre otros.

El asunto es que la especificación del caso de uso debe ser lo suficientemente clara (no ambigua) y completa para que cualquier “interpretación” que se haga de la misma arroje los mismos resultados. Y esto debe ser así no solo para el equipo de diseño y de programación, sino para el equipo de pruebas. Es decir, la documentación debe ser tal que el diseñador y el verificador se hagan el mismo modelo o esquema mental del diseño y de las pruebas (casos de prueba) respectivamente.

Algunas técnicas para mejorar la especificación de requisitos (y de casos de uso) incluyen la revisión par, que debe comprender revisión de forma y de contenido. Esta revisión debe validar que cada requisito (y cada caso de uso) cumpla con algunas características bien conocidas:
  • Claro
  • Atómico
  • No ambiguo
  • Verificable
  • Necesario
  • Priorizado
Entre tanto, la especificación de requisitos (incluyendo todos los casos de uso) debe ser:
  • Correcta
  • Independiente de diseño
  • Completa
  • Consistente
  • Rastreable
  • Modificable / Extensible
Para finalizar, los Analistas Funcionales deben presentar esta especificación al equipo de diseño, construcción y pruebas. Este es un paso muy importante que muchas veces se omite o se cumple con simplemente enviar un mensaje electrónico que incluye los documentos relacionados. El objetivo de la presentación no debe ser únicamente exhibir la especificación, sino lograr que todos los involucrados en el equipo salgan con las mismas ideas, con el mismo mapa mental del que hablaba antes.

*+*+*+ /*+*+*+ /*+*+*+ /*+*+*+ /*+*+*+ /*+*+*+ /*+*+*+ /*+*+*+ /
PD. Los invito a leer mi artículo sobre Realización de Casos de Uso. Lo encuentran en el enlace adjunto: http://gazafatonarioit.blogspot.com/2007/10/lecturas-fundamentales-10-lectura_3046.html

martes, mayo 20, 2008

Lectura Fundamental 12
Lectura # 12
Casos de Uso: de Extensiones y de Inclusiones
“El hombre vive fascinado por la inmensidad de la eternidad y nos preguntamos: ¿Nuestras acciones perdurarán a través de los siglos? ¿Gente que no conocemos oirá nuestros nombres mucho después de nuestra muerte? ¿Y se preguntarán quiénes éramos, cuán valientemente peleábamos, cuán ferozmente amábamos?”
Wolfgang Petersen (Troya, 2004)
Introducción
De vuelta en el tiempo, hace unas siete Lecturas Fundamentales, prometí hablar de las relaciones entre los casos de uso. Pues bien, he querido extender el tema hacía el no menos complejo asunto de modelar sistemas de información mediante casos de uso. Trataré de mantener una posición minimalista: abordaré sólo la cuestión relacionada con el diagrama de casos de uso.
Básicamente, un diagrama de casos de casos de uso está compuesto de Actores y Casos de Uso, y las relaciones entre los unos, entre los otros y entre los unos y los otros.
Para recordar qué es un Actor podemos leer la Definición 5 en [3]. Para recapitular sobre Casos de Uso, podemos leer esencialmente [4] y luego repasar [5], [6], [7] y [3]. Ya sabemos además que podemos usar UML [8] para especificar, visualizar, construir y documentar los artefactos de sistemas de software.
Generalización de Actores
Dos o más Actores se relacionan entre ellos mediante la Generalización (de actores). Esta relación significa que uno o más actores pueden heredar las características, pero mejor aún, las responsabilidades de otro actor del sistema. Un Vendedor de Licencias de Software y un Vendedor de Servicios de Ingeniería tienen al menos una responsabilidad en común, una actividad: Registrar Cliente. Si los roles se interceptan en dos o más actividades en el sistema, es posible entonces, por razones de organización del modelo, de abstracción y de simplicidad, crear un nuevo actor: Vendedor de Productos y Servicios. Este parentesco se diagrama como muestro en la figura 1.
Además, muchas veces enfrentamos el dilema en el que un caso de uso (del sistema) es ejecutado por dos o más actores. Como en un sistema de Administración de Proyectos, donde el Gerente de Proyectos puede Matricular un Proyecto, pero también lo puede hacer el Gerente de la Oficina de Proyectos. Una mala idea es expresar esta situación como lo hago aparecer en la figura 2.
Figura 1: Diagrama parcial de Actores de un Sistema CRM
En cambio, usamos la generalización, creando un actor que desde el punto de vista del negocio y del usuario es Abstracto: el Administrador de Proyectos. Entonces, el diagrama se convierte en algo como lo que sugiero en la figura 3.


Figura 2: Diagrama Incorrecto de Casos de Uso de un Sistema de Administración de Proyectos


Figura 3: Diagrama Correcto de Casos de Uso de un Sistema de Administración de Proyectos
Quizás lo que sucede en estos casos es que confundimos Actores del Negocio [3] con Actores del Sistema o, simplemente, cargos o roles de la organización para la cual se construye la aplicación con roles o responsabilidades en el sistema de las personas que ejercen esas funciones. Ese no es el camino.
Por último, tengamos en cuenta el sentido de la generalización de actores: los casos de uso ejecutados por el actor padre son en la práctica ejecutados por los hijos.
Relaciones Entre Actores y Casos de Uso
Un Actor se comunica con casos de uso, componentes y clases [9]. Esta comunicación se representa mediante la relación de Asociación (binaria). En Particular, nos interesa la relación entre el actor y el caso de uso. Esta relación muestra el actor que inicia o ejecuta el caso de uso, normalmente una persona o un grupo de personas, pero también cualquier entidad externa al sistema, como otra aplicación o maquinaria especial.
Las figuras 3, 4, 5 y 6 son muestras de relaciones de asociación típicas entre actores y casos de uso.
En estos diagramas, la constante es que la relación es en ambos sentidos, es decir, es una relación de toma y dame, el actor hace-el sistema hace. Pero también se presentan casos donde la asociación es en un solo sentido, o hacia el caso de uso o hacia el actor. Estas situaciones son comunes cuando el actor no es una persona, sino un software externo o una máquina. Como en la figura 4, donde al ejecutarse la funcionalidad de registrar un cliente que es persona natural, el sistema CRM le comunica al sistema contable que matricule un tercero.
En este diagrama, la funcionalidad que va al sistema externo se representa como un caso de uso “incluido”, una relación de la que hablaré en breve. Pero en la práctica, la comunicación puede ir directamente del caso de uso principal al sistema externo.


Figura 4: Diagrama Parcial de Casos de Uso donde interviene un sistema externo
Casos en los que un actor se relaciona con una clase o un componente se presentan cuando el actor es un sistema externo que envía o recibe datos del sistema principal o, cuando siendo persona, el actor se comunica con el sistema vía una página Web, por ejemplo, que se representa como una clase en la aplicación. Este último caso se presenta en los diagramas de Interacción, como los de Secuencia [10] o de Comunicación.
Relaciones Entre Casos de Uso
Este es la materia que genera más polémica y la que es menos entendida en la comunidad de la IT, así es que trataré de ir más despacio.
Dos o más casos de uso se pueden relacionar entre ellos para distintos propósitos: distribuir mejor el modelo, establecer condiciones de reusabilidad (de funcionalidad), de incrementos del software, y para planear las iteraciones, entre otros. Las relaciones son de tres tipos: Inclusión, Extensión y Generalización. Enfatizaré en las dos primeras.
Relación de Inclusión
Una relación de inclusión define que un caso de uso contiene el comportamiento definido en otro caso de uso [11].
Una relación de inclusión es una relación de un caso de uso base a un caso de uso incluido en la que se especifica como el comportamiento definido en el caso de uso incluido es explícitamente insertado en el comportamiento del caso de uso base [1]. Decimos entonces que el caso de uso incluido es abstracto, es decir, no es ejecutado directamente por un actor.
Esta relación se usa cuando queremos:
  • Factorizar o descomponer (en sentido matemático) el comportamiento del caso de uso base que no es necesario para entender el objetivo principal del mismo y donde solamente el resultado del caso de uso incluido es importante.
  • Distribuir en uno o más casos de uso, funcionalidad del caso de uso base que es común para dos o más casos de uso (reusabilidad).
La primera opción se usa especialmente en casos de uso largos o complejos donde algunas partes del mismo no son relevantes para el sentido primordial del caso de uso y no son necesarias, en primera instancia, para entenderlo y aprobarlo. Por ejemplo, un caso de uso para Ingresar un Cliente de Naturaleza Jurídica puede solicitar docenas o cientos de datos que se pueden agrupar de acuerdo a algunos criterios como Datos Generales, Datos del Tipo de Entidad y Naturaleza Jurídica, Datos del Gerente o Representante Legal, Datos de los Contactos, Referencias Comerciales, entre otros. Algunos de estos grupos de datos pueden incluirse en casos de uso complementarios que son ejecutados desde el caso de uso principal que podría lucir así:
Caso de Uso: Registrar Cliente Jurídico
Actor: Vendedor de Productos y Servicios
Descripción: este caso de uso permite registrar los datos de una persona de naturaleza jurídica…
Secuencia Básica:
1. El caso de uso inicia cuando el Actor decide registrar los datos de una persona jurídica
2. El sistema pide seleccionar la ciudad y oficina de vinculación
3. El actor selecciona la ciudad y oficina de vinculación
4.
12. Se ejecuta el caso de uso Registrar Datos del Tipo de Entidad y Naturaleza Jurídica
13. Se ejecuta el caso de uso Registrar Datos del Gerente o Representante Legal
14. Se ejecuta el caso de uso Registrar Datos de las Referencias Comerciales
15….
25. El caso de uso termina
Poscondiciones: N/A
Requisitos Especiales: N/A
En este ejemplo, en los pasos 12 a 14 se ejecutan distintos casos de uso de los que, en principio, interesa el resultado. La palabra clave es “en principio”. En este diagrama también muestro la segunda posibilidad de inclusión, el reuso, con el caso de uso Verificar Centrales de Riesgo, que se ejecuta desde varios casos de uso del modelo.
Algunos aspectos de los casos de uso incluidos que debemos tener en cuenta:
  • Un caso de uso incluido no contiene una funcionalidad significante para la arquitectura del sistema, especialmente para la vista funcional o de casos de uso.
  • Un caso de uso incluido se puede “prototipar” en las primeras de cambio, es decir, durante el análisis y el diseño del mismo, el diseñador se puede concentrar en el caso de uso base y omitir los detalles particulares del caso de uso incluido.


Figura 5: Diagrama parcial del caso de uso Registrar Cliente Jurídico
  • Un caso de uso incluido no debe usarse como excusa para hacer descomposición funcional [4], es decir, tener uno o más casos de uso incluidos que especifiquen aspectos CLAB (creación, lectura, actualización o borrado –CRUD en inglés) o que estén vinculados a usuarios concretos específicos, o completamente ligados a un componente del sistema o a un componente arquitectónico específico, o vinculados a una pantalla o función de usuario determinada, o en algún paso de su secuencia ejecutan otros casos de uso incluidos (asunto este que debería evitarse tanto como se pueda). Para saber más de casos de uso funcionalmente descompuestos ver Definición 3 en [4].
  • Un caso de uso incluido está incompleto por naturaleza, es decir, por sí solo no arroja un resultado observable para el actor, o es un resultado parcial, o sus escenarios dependen de lo que ha pasado antes en el caso de uso principal.
  • Un caso de uso incluido no es ejecutado por un actor distinto al actor del caso de uso base. Sin embargo, un caso de uso incluido puede tener asociado un actor pasivo o secundario, normalmente cuando este actor recibe o entrega información al caso de uso incluido, como anotaba en la figura 4.
  • Un caso de uso incluido no se usa para especificar procesos automáticos o semi-automáticos que el sistema realiza en su totalidad sin interacción con el usuario.
  • Un caso de uso incluido siempre se implementa con el caso de uso base o antes, si se trata de un caso de uso que expone funcionalidad común. En otras palabras, el caso de uso incluido se implementa durante la misma iteración en que se implementa el primero caso de uso principal que lo incluya.
  • Un caso de uso incluido no es condicional, es decir, si el ejecutar el caso de uso base se alcanza el paso donde se ejecuta el caso de uso incluido, éste se ejecuta. Por supuesto, la ejecución de la funcionalidad incluida puede depender de si se cumple una condición o no en el caso de uso base, pero esta condición debe especificarse explícitamente en el caso de uso principal, como apunto en el paso 12 del ejemplo siguiente:
Caso de Uso: Registrar Cliente Natural
Actor: Vendedor de Productos y Servicios
Descripción: este caso de uso permite registrar los datos de una persona natural.
Secuencia Básica:
5. El caso de uso inicia cuando el Actor decide registrar los datos de una persona natural
6. El sistema pide seleccionar la ciudad y oficina de vinculación
7. El actor selecciona la ciudad y oficina de vinculación
8. El sistema solicita el nombre de la persona
9. El actor ingresa el nombre de la persona
10. El sistema pide seleccionar la profesión de la persona
11. El actor selecciona la profesión de la persona
12. Si la profesión es “Congresista” se ejecuta el caso de uso Verificar Lista Clinton.
13. …
14. Se ejecuta el caso de uso Registrar Datos de las Referencias Comerciales
15….
25. El caso de uso termina
Poscondiciones: N/A
Requisitos Especiales: N/A
  • Un caso de uso incluido debería incluir, en su documentación, una sección que describa explícitamente los casos de uso base desde los cuales es incluido. Este simple ejercicio hace al documento tan auto-suficiente o auto-contenido como sea posible, es decir, los interesados en el artefacto no tendrán que navegar por ningún otro lado para conocer todo el detalle del caso de uso.
  • En un caso de uso incluido, las precondiciones siempre se han cumplido en el caso de uso base que lo incluye. Entre tanto, las poscondiciones del caso de uso incluido afectan el comportamiento del resto del caso de uso base.
  • Finalmente, un caso de uso incluido no debería tener relaciones de extensión con otros casos de uso. Simplemente no tiene sentido.
Pasemos precisamente a la trama de las extensiones.
Relación de Extensión
La Extensión es una relación de un caso de uso de extensión a un caso de uso extendido que especifica como y cuando el comportamiento definido en el caso de uso de extensión puede ser insertado en el comportamiento definido en el caso de uso extendido [12].
Esta relación se usa:
  • Para establecer que un fragmento de la funcionalidad del caso de uso es opcional, o potencialmente opcional. A diferencia de lo que ocurre con la inclusión que es una relación que implica obligatoriedad en la ejecución, por decirlo de cierta manera.
  • Para señalar una parte del comportamiento que es ejecutado sólo bajo ciertas circunstancias, a veces excepcionales, tales como el envío de un mensaje a un usuario cuando se produce un hecho determinado. Por ejemplo, cuando un cliente VIP solicita el aumento de un cupo de crédito y la cantidad solicitada sobrepasa la política de crédito que puede soportar al Analista de Crédito, entonces el proceso pasa a una instancia mayor, como un Gerente de Oficina o algo así. Decimos entonces que ha ocurrido una interrupción en el caso de uso. A este dilema nos enfrentamos continuamente y la primera intención de un Ingeniero de Requisitos inexperto es crear un único caso de uso con dos actores. Ahora ya sabemos que realmente son dos parejas actor-caso de uso.
  • Para mostrar que puede haber un conjunto de segmentos de comportamiento de los cuales uno o varios de estos pueden ser insertados en un punto de extensión en un caso de uso base o extendido. Estas secciones insertadas (y el orden en el cual son insertadas) dependerán de la interacción con los actores durante la ejecución del caso de uso base.
La extensión es condicional, lo que significa que su ejecución depende de lo que ha pasado mientras se ejecuta el caso de uso base. Éste no controla las condiciones para la ejecución de la extensión –las condiciones son descritas dentro la relación de extensión. El caso de uso de extensión puede acceder y modificar los atributos del caso de uso base. Éste, sin embargo, no puede ver las extensiones y no puede acceder a sus atributos.
Una diferencia fundamental con la inclusión es que, en la extensión, el caso de uso base está completo por sí mismo, es decir, que debería entenderse y tener significado completo sin ninguna referencia a sus extensiones. Sin embargo, el caso de uso base no es independiente de las extensiones, puesto que no puede ser ejecutado sin la posibilidad de seguir las extensiones [2]. También pasa que el caso de uso de extensión puede acceder y modificar los atributos del caso de uso base, pero éste no puede ver las extensiones y no puede acceder a sus atributos. Y más, el caso de uso base se modifica implícitamente por las extensiones. En otras palabras, el caso de uso extendido (base) es ciego a sus extensiones específicas, pero no al contrario.
Un poco truculento, pero así es. La figura 6 es una muestra típica de extensión de casos de uso.
Otra gran diferencia entre la inclusión y la extensión es que el caso de uso de extensión puede ser ejecutado por un actor distinto al caso de uso base, como observamos en el diagrama. Observamos también la condición que activa la extensión en cada caso: en una de ellas se trata de un crédito de mayor cuantía, donde la mayor cuantía es un atributo que puede y debería ser configurable; mientras que en el segundo caso se trata de un cliente del sector gubernamental o bien podría ser algún otro tipo de cliente con tratamiento especial.


Figura 6: Diagrama parcial del caso de uso Aprobar Solicitud de Crédito
Y más de la cuestión semántica, las extensiones de un caso de uso son suplementarias, lo que quiere decir, que el caso de uso extendido está completo, es un todo. En el ejemplo de la figura 6, Aprobar Solicitud de Crédito es un caso de uso terminado por sí mismo y bien podría ser implementado en una iteración distinta (previa) y hasta en un proyecto diferente a la iteración o proyecto donde se implementan los otros casos de uso. Esta es otra de las razones por las que se usa la extensión.
Y estos son algunos aspectos de los casos de uso extendidos y de extensión que debemos tener en cuenta a la hora de modelar sistemas de información:
  • Un caso de uso extendido y sus casos de uso de extensión sí entregan un resultado de valor observable para el actor que los ejecuta, ya sea a través de ellos mismos o transfiriéndolo de la extensión al extendido y de allí al actor.
  • Un caso de uso de extensión no es una especialización del caso de uso extendido, es decir, la extensión no es una relación de herencia o de generalización, dependiendo desde el ángulo del cual miremos. Hago énfasis en este aspecto porque tengo la ligera impresión de que, no sólo los analistas noveles, sino también los diseñadores y los programadores estamos entrenamos para ver la extensión como una especialización, cuando en realidad no es así.
  • Quizás es por eso que la OMG tomó la decisión de cambiar la definición formal de la extensión para que sea una relación de dependencia. Aunque quiero aprovechar este punto para decir también que esta situación se desprende de la estructura formal de UML, la así llamada Especificación de Infraestructura de UML [13], algo que nos ha complicado la vida de muchas formas, sin embargo, esta definición formal muchas veces es irrelevante en la vida real, quiero decir, no es práctica en la mayoría de los modelos que construimos.
  • Un caso de uso se puede usar para documentar nuevas versiones del caso de uso original. Este es un gran beneficio de la extensión, porque deja intacto el caso de uso original que posiblemente ya está implementado y hasta en producción y permite que el analista de requisitos se concentre con los usuarios en las nuevas características del caso de uso extendido.
Aquí nos enfrentamos a la disyuntiva de extender o no extender un caso de uso. Me refiero a que si el cambio es pequeño, posiblemente sea más útil y práctico especificar una secuencia alterna en el caso de uso base; si la modificación es substancial, a juicio del analista, éste tomará la sabia decisión de crear un nuevo caso de uso.
Ahora bien, un caso de uso extendido luce más o menos así:
Caso de Uso: Aprobar Solicitud de Crédito
Actor: Analista de Crédito
Descripción: este caso de uso permite aprobar una solicitud de crédito realizada por un cliente…
Secuencia Básica:
1. El caso de uso inicia cuando el Actor decide aprobar una solicitud de crédito
2. El sistema solicita el radicado y la fecha de de la solicitud
3. El actor ingresa el radicado y la fecha de de la solicitud
4. El sistema valida que el radicado exista para la fecha establecida y muestra los datos de la solicitud: nombre o razón social del cliente, número de identificación y tipo de la misma, dirección, ciudad, …, sector del cliente, cantidad solicitada, …
5. El sistema pide seleccionar el tipo de desembolso (Cheque, Consignación, Efectivo)
6. El actor selecciona el tipo de desembolso
7. El sistema solicita el número de aprobación de la solicitud
8.
25. El caso de uso termina
Poscondiciones: N/A
Puntos de Extensión
5A. La cantidad solicitada es de Mayor Cuantía
7A. El cliente es del sector Gobierno
Requisitos Especiales: N/A
Lo único distinto son los puntos de extensión. Observen que la secuencia básica del caso de uso, ni ninguna otra secuencia, hace alusión a uno o más casos de uso de extensión. Es lo que había dicho: el caso de uso base no conoce los atributos ni las características del caso de uso de extensión.
Por su parte un caso de uso de extensión, se diferencia de un caso de uso normal en que debe tener especificado el evento que lo activa (llamado comúnmente trigger). Por ejemplo, en la figura 7, Asignar Revisión de Arquitectura es considerada una actividad especial por el sistema de Administración de Proyectos:


Figura 7: Diagrama parcial de casos de usos de un Sistema de Administración de Proyectos
Este caso de uso, que extiende a Asignar Actividad, podría lucir más o menos así:
Caso de Uso: Asignar Revisión de Arquitectura
Actor: Gerente de Oficina de Proyectos
Descripción: este caso de uso permite al PMO asignar la revisión de una arquitectura de software…
Evento de Activación: la actividad es una actividad especial: Revisión de Arquitectura
Secuencia Básica:
1. El caso de uso inicia cuando el Actor decide asignar una revisión de arquitectura
2. El sistema pide seleccionar el revisor técnico
3. El actor selecciona el revisor técnico
4. El sistema verifica que el revisor técnico tenga el perfil requerido para la actividad
5. El actor …
6.
12. El caso de uso termina
Poscondiciones: N/A
Requisitos Especiales: N/A
La figura 7 también dilucida sobre otro aspecto de las relaciones entre casos de uso: un caso de uso base puede estar asociado con uno o más casos de uso incluidos y con uno o más casos de uso extendidos.
Otro aspecto importante de las relaciones de extensión es que el diagrama es bastante explicativo. En la figura 8, por ejemplo, está claro que un vuelo cualquiera puede ser reservado por un pasajero cualquiera, pero que si el pasajero está registrado como frecuente, la reserva tiene algunas características especiales (estas particularidades no se pueden observar en un diagrama de casos de uso como este).
El diagrama 8 también muestra otro aspecto de las relaciones de extensión y es que un caso de uso de extensión puede ser a su vez extendido por uno o más casos de uso de extensión. Y este hecho profundiza más en el proceso del negocio que resuelve este modelo: si el vuelo es internacional, y el pasajero frecuente además está registrado como pasajero VIP, tiene la opción de establecer o seleccionar el menú que consumirá durante el vuelo.


Figura 8: Diagrama parcial de casos de usos de un Sistema de Reservación de Vuelos
Del diagrama no se pude extraer información sobre las distintas clases de vuelo que proporciona la aerolínea. Sin embargo, este es precisamente el objeto del siguiente apartado: la clasificación de casos de uso, en el sentido de generalización, llamada también herencia de casos de uso.
Generalización Entre Casos de Uso
Una generalización es una relación taxonómica entre un clasificador más general y un clasificador más específico. Cada instancia del clasificador específico también es una instancia indirecta del clasificador general. Así, el clasificador específico hereda las características del clasificador más general [14].
Esta relación es ampliamente usada en el modelado orientado a objetos, sin embargo, no solo se da entre clases y objetos, sino entre cualquier elemento de UML que actúe como clasificador, como los casos de uso.
La generalización de casos de uso se usa cuando dos o más casos de uso comparten comportamiento, estructura y propósito. Es decir, si dos casos de uso ejecutan un conjunto amplio de actividades similares y sólo algunas diferentes, es posible tomar todas las tareas comunes y especificarlas en un nuevo caso de uso que generaliza a los dos anteriores y en estos dos sólo se especifican las tareas disímiles. Esa es la primera premisa para usar la relación de generalización entre casos de uso, como en la figura 9, donde es posible que Reservar Vuelo Doméstico y Reservar Vuelo Internacional sólo difieran en que para este último caso el actor pueda seleccionar la ruta y especificar algunas condiciones especiales de vuelo.


Figura 9: Diagrama parcial de casos de usos de un Sistema de Reservación de Vuelos
El caso de uso Reservar Vuelo Doméstico puede especificarse de la siguiente manera:
Caso de Uso: Reservar Vuelo Doméstico
Actor: Pasajero
Descripción: este caso de uso permite a un pasajero reservar un vuelo entre dos ciudades nacionales…
Secuencia Básica:
1. El caso de uso inicia cuando el Actor decide reservar un vuelo doméstico
2. El sistema pide seleccionar las ciudades origen y destino del vuelo
3. El actor selecciona las ciudades origen y destino del vuelo
4. El sistema solicita las fechas de ida y de regreso del vuelo
5. El sistema valida la existencia de vuelos con las condiciones establecidas y pide seleccionar la tarifa
6. El actor selecciona la tarifa
7. El sistema genera y muestra un código de reserva y el caso de uso termina
Poscondiciones: N/A
Entre tanto, el caso de uso Reservar Vuelo Internacional puede ir así:
Caso de Uso: Reservar Vuelo Internacional
Actor: Pasajero
Descripción: este caso de uso permite a un pasajero reservar un vuelo cuya ciudad destino es de otro país…
Secuencia Básica:
1. El caso de uso inicia cuando el Actor decide reservar un vuelo internacional
2. El sistema pide seleccionar las ciudades origen y destino del vuelo
3. El actor selecciona las ciudades origen y destino del vuelo
4. El sistema solicita las fechas de ida y de regreso del vuelo
5. El sistema valida la existencia de vuelos con las condiciones establecidas, muestra las rutas disponibles (escalas intermedias) y pide seleccionar la ruta y tarifa de preferencia
6. El actor selecciona la ruta y la tarifa de su preferencia
7. El sistema pide seleccionar las condiciones especiales del vuelo
8. El sistema genera y muestra un código de reserva y el caso de uso termina
Poscondiciones: N/A
Requisitos Especiales: N/A
La diferencia entre uno y otro se nota en los pasos 5, 6 y 7. En este caso, el caso de uso padre, Reservar Vuelo puede contener exactamente la misma funcionalidad que Reservar Vuelo Doméstico y dejar sólo los pasos distintos en Reservar Vuelo Internacional. De esta manera se simplifica la especificación y el modelado del sistema.
También puede ocurrir que sea necesario agrupar dos o más casos de uso cuya funcionalidad, estructura y objetivo sean compartidos en un caso de uso puramente abstracto, también para efectos de simplificación del modelo. Como en la figura 10.


Figura 10: Diagrama parcial de casos de usos de un Sistema de Administración de Proyectos
Aquí, el caso de uso abstracto no contiene ninguna especificación funcional y se usa como “comodín”, quizás para relacionar los casos de uso hijos con uno o más casos de uso incluidos o de extensión. También para hacer el análisis y diseño de todos ellos al mismo tiempo (hacer una única realización de casos de uso, por ejemplo).
Aunque no está especificado, los casos de uso hijos pueden ser ejecutados por actores diferentes. También, si el caso de uso padre es abstracto, podría no tener actor relacionado. En esta última instancia, los hijos deberían tener asociado el actor que los ejecuta, necesariamente.
Mi recomendación final es que usemos la generalización de casos de uso como detallo en esta última alternativa. Para la primera forma, siempre podemos usar inclusión y hasta extensión.
Conclusiones
Un modelo es una abstracción de la realidad, una representación simplificada de algunos fenómenos del mundo real. En materia de sistemas de software, esos fenómenos se refieren a requisitos del software y la representación de los mismos se hace mediante actores, casos de uso y las relaciones entre aquellos y estos y entre cada uno de ellos.
La asociación, la generalización, la inclusión y la extensión son los cuatro tipos de relaciones entre estos elementos de los sistemas de información. Algunas de ellas se quedan en un plano estrictamente teórico o conceptual, en el sentido de que no tienen aplicación práctica, al menos, no una de valor para el modelador. Me refiero a la generalización que en lo que a casos de uso se refiere no tiene el sentido de provecho que tiene, por ejemplo, en un diagrama de clases o uno de objetos.
La asociación, por su parte, es la relación natural entre actores y casos de uso, su significado es directo y simple: este actor ejecuta o inicia este caso de uso. También, este actor entrega o recibe información de (interactúa con) este caso de uso. Más allá, la inclusión y la extensión constituyen un par de relaciones que despiertan emociones encontradas en la comunidad de analistas, ya sea porque tendemos a confundir su uso o porque nuestros paradigmas mentales (específicamente los de la orientación a objetos) no nos permiten verlas y usarlas con claridad expedita.
Estos son los temas que he tratado de dilucidar en este artículo. Son aspectos en los que todos debemos mejorar en aras de incrementar la calidad de los productos que desarrollamos.
¿Quiere Saber Más?
Para conocer más sobre especificación de casos de uso, podemos consultar [15] que sigue siendo, sino el mejor, uno de los muy buenos libros sobre el espinoso asunto de escribir casos de uso.
Para conocer más de modelado de casos de uso, relaciones de inclusión, extensión y generalización, podemos consultar [16], [17] y [18] cuyos autores concentran sus esfuerzos en explicar los distintos patrones que podemos encontrar al momento de modelar requisitos de software con casos de uso.
Como siempre, está el que considero el mejor libro sobre UML, patrones, análisis y diseño orientado a objetos y el proceso de desarrollo de software, todo en uno. Se trata del libro de Larman [19].
También está el libro origen de todo, el de los three amigos [20].
Fin.
Referencias
[1] IBM. The Rational Unified Process V7.1.
[2] IBM. The Rational Unified Process version V7.1.
[3] Luis Antonio Salazar Caraballo, “Casos de Uso: Origen, Especificación y Evolución”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/11/lecturas-fundamentales-2.html, 17 nov. 2006.
[4] Luis Antonio Salazar Caraballo, “Casos de Uso: De Vuelta a lo Fundamental”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/11/lecturas-fundamentales.html, 09 nov. 2006.
[5] Luis Antonio Salazar Caraballo, “Casos de Uso: Del Todo y de Sus Partes”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/11/lecturas-fundamentales-3.html, 23 nov. 2006.
[6] Luis Antonio Salazar Caraballo, “Casos de Uso: ¿Cuándo Están Terminados?... ¿Y qué hacer con ellos a continuación?”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/12/lecturas-fundamentales-4-1-de-2.html, 07 dic. 2006.
[7] Luis Antonio Salazar Caraballo, “Casos de Uso: ¿Cuándo Están Terminados?... ¿Y qué hacer con ellos a continuación? Parte 2 de 2”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/12/lecturas-fundamentales-5-2-de-2.html, 22 dic. 2006.
[8] Luis Antonio Salazar Caraballo, “Prolegómenos Sobre el Lenguaje de Modelado Unificado”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2005/06/prolegmenos-sobre-el-lenguaje-de.html, 01 jun. 2006.
[9] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 587.
[10] Luis Antonio Salazar Caraballo, “Realización de Casos de Uso: de los Objetos y sus Interacciones”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2007/10/lecturas-fundamentales-10-lectura_3046.html, 23 oct. 2006.
[11] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 592.
[12] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 589.
[13] Object Management Group, “OMG Unified Modeling Language (OMG UML), Infrastructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 4 nov. 2007.
[14] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 71.
[15] Alistair Cockburn, “Writing Effective Use Cases”, Addison-Wesley, 21 feb. 2000.
[16] Mike O’Docherty, Object-Oriented Analysis & design, Understanding System Development With UML.” John Wiley & Sons. 2005.
[17] Steve Adolph, Paul Bramble, Alistair Cockburn, Andy Pols. Patterns for Effective Use Cases. Addison Wesley. August 23, 2002.
[18] Kim Hamilton, Russell Miles. Learning UML 2.0. O'Reilly. April 2006.
[19] Graig Larman. applying-uml-and-patterns-an-introduction-to-object-oriented-analysis-and-design-and-the-unified-process-2nd-edition. 13 jul. 2001.
[20] Grady Booch, James Rumbaugh, Ivar Jacobson. The Unified Modeling Language User Guide. 2nd-edition. May 29, 2005.
Lectura Fundamental Siguiente: Casos de Abuso