Tarea: Realizar diseño orientado a variaciones
Esta tarea se aplica a un número de elementos de análisis y diseño en los que la factorización de la viabilidad en dichos elementos y la factorización de factores comunes produce un resultado más robusto y flexible.
Objetivo

Analizar los elementos del modelo suministrado, identificar cuáles de dichos elementos son comunes a las distintas aplicaciones y separarlos de aquellos elementos que varíen en las distintas aplicaciones. Al identificar estos elementos que varían según la aplicación podemos modelar de forma explícita los tipos de variabilidad y documentarlos para clientes de los elementos de modelo.

Relaciones
RolesPrincipal: Adicional: Asistencia:
EntradasObligatoria:
  • Ninguno
Opcional: Externa:
  • Ninguno
Salidas
Descripción principal

Esta tarea se puede aplicar a cualquier modelo de análisis y diseño en el que los elementos del modelo saquen provecho de las técnicas descritas aquí. Las técnicas se derivan de la experiencia en ingeniería de línea de productos, en que los elementos comunes son los que unen los productos de la línea de productos y la variabilidad es la que distingue un producto de otro, y el desarrollo de patrones, en el que los elementos comunes son la estructura del patrón y la variabilidad se utiliza para definir los parámetros del patrón.

El enfoque consiste en identificar primero los elementos del diseño que serán comunes a todas las aplicaciones del elemento, identificar después los elementos que variarán en cada aplicación y, por último, documentar la variabilidad (aquí distintos dominios utilizan diferentes enfoques).

Ejemplo

En el siguiente diagrama de clase vemos los elementos de un contrato legal, identificando que el contrato es entre dos o más partes. Al identificar los elementos comunes vemos que los elementos centrales son la estructura del propio contrato y las distintas relaciones con las partes.

No obstante, un contrato legal puede ser entre distintas personas, organizaciones o agencias gubernamentales y, por tanto, tenemos en cuenta que dicha parte es un elemento variable según tipo. En la documentación definimos una jerarquía de tipos para la parte y también señalamos a la parte como una clase abstracta, de modo que los tipos concretos deberán utilizarse en un diseño real.

Pasos
Identificar elementos comunes y variables

La identificación de los elementos de un diseño que no cambian al utilizarse en distintas situaciones se realiza a menudo mejor de forma iterativa. Con un conjunto de casos de ejemplo, cree diagramas de instancias y observe al compararlos en los distintos casos de ejemplo qué elementos son comunes en todos los casos. Cuanto mayor sea el número de casos de ejemplo de que disponga, mayor será obviamente el número de puntos de datos y, por tanto, podrá validar pronto los resultados y las suposiciones.

En la descripción de elementos comunes de un modelo, a menudo resulta valioso ofrecer alguna forma de elemento de encapsulación para separar estos elementos del resto del diseño. La selección de una técnica de encapsulación depende del contexto, pero puede ser:

  • La introducción de un paquete para poseer los elementos. Esto sólo cambia la propiedad de los elementos pero no la relación entre los elementos o los elementos de fuera del paquete (se aplica más habitualmente a los modelos de análisis).
  • La introducción de un componente para poseer los elementos. Esto no sólo cambia la propiedad sino que también introduce una encapsulación formal para que pueda elegir definir una interfaz que exponga los elementos relevantes en el exterior.
  • La introducción de una colaboración de UML 2.0 permite que los elementos comunes se definan como parte de la estructura compuesta de la colaboración, así como los elementos variables como roles; posteriormente se puede realizar un enlace desde los roles de elemento variables a los elementos concretos. Se trata de un enfoque común para definir los patrones de diseño en UML. Tenga en cuenta que una colaboración no posee los elementos en sí, sólo roles correspondientes a dichos elementos.
  • La introducción de una clase en plantilla en la que la plantilla se corresponda con el tipo de elementos variables; se trata de un enfoque común en lenguajes como Ada, C++, Eiffel y ahora Java, que da soporte a programación genérica.
  • Simplemente puede elegir utilizar una clave visual. Es común, por ejemplo, utilizar un único diagrama (tal como se muestra en la descripción principal) y colorear los elementos comunes y variables de forma distinta.

Ejemplo

En el caso de nuestro contrato legal, hemos elegido introducir un componente que poseerá los elementos, tal como se muestra en la siguiente figura.

Formas de variabilidad de documento

La propia variabilidad adopta una gran variedad de formatos, cualquiera de los cuales puede ser adecuado. En algunos casos hay más de un formato en una determinada situación. Los tipos comunes de variabilidad son los siguientes:

  • Variabilidad por tipo: por ejemplo, en el caso de nuestro contrato legal, la variabilidad se basa en la jerarquía de tipos utilizada para representar al concepto "Parte"; se trata de una forma común y se describe fácilmente con UML como diagrama de clase (tal como se muestra en la descripción principal).
  • Variabilidad por rol: en este caso el tipo del elemento es normalmente inmaterial (o de segunda importancia); es el rol que desempeña el que tiene valor. Este tipo de variabilidad se encuentra a menudo en el desarrollo de patrones en el que el patrón debería aplicarse al mayor conjunto de posibilidades y, por tanto, los parámetros del patrón se definen desde el punto de vista único de los roles que desempeñan los elementos proporcionados.
  • Variabilidad de implementación: en este caso, el elemento suministrado es necesario para realizar algún comportamiento y, por tanto, necesita implementar una interfaz determinada (o, dicho más formalmente, un protocolo) para ser aplicable. En tal caso es normal que el contenedor de los elementos comunes describa la interfaz y tenga un parámetro de plantilla del tipo de interfaz o requiera la interfaz.

Ejemplos

El siguiente diagrama muestra la noción de variabilidad por rol. En él tenemos una nueva colaboración "Venta" que indica la relación entre el vendedor y el comprador como partes de un contrato. En UML, resulta posible crear una incidencia de colaboración que enlace los roles "comprador" y "vendedor" con elementos reales del modelo.

De forma alternativa, observemos el proceso de venta con un servicio de fideicomiso. Capturamos las funciones necesarias de cualquier servicio de fideicomiso como interfaz, con un conjunto de operaciones correspondientes a las responsabilidades que esperamos que realice el servicio de fideicomiso. Con esto creamos una colaboración de plantilla en la que utilicemos la interfaz de fideicomiso como tipo del parámetro de plantilla. Ahora es posible instanciar la plantilla suministrando cualquier clase o componente que ejecute la interfaz IEscrowService.

Por último, podríamos simplemente utilizar un componente (o clase) para contener nuestros elementos comunes y hacer que requiera la interfaz IEscrowService con la relación de <<uso>> de UML 2.0 tal como aparece en el siguiente diagrama. Este enfoque es totalmente válido en un nivel de diseño ya que también es un enfoque de programación común en el desarrollo basado en componentes o incluso sólo en lenguajes como Java.

La elección de la técnica, como siempre, dependerá de la situación, lo que incluye consideraciones como las siguientes:

  • El tipo de variabilidad que se vaya a expresar, tal como hemos visto anteriormente.
  • Si el elemento es parte de un modelo de análisis, diseño o implementación.
  • Las capacidades y expectativas de los interesados en el modelo.

Propiedades
Varias apariciones
Condicionado por sucesos
Continuo
Opcional
Planeado
Se puede repetir
Más información