líneas de producto de software resolución de variabilidadmiso4204/dokuwiki/lib/ex… ·...
TRANSCRIPT
Líneas de Producto de
Software – Resolución de
variabilidad Material preparado por Rubby Casallas
Departamento de Sistemas y Computación
Universidad de los Andes, Bogotá
Referencias
Systems and Software Variability Management:
Concepts, Tools and Experiences. Editores: Rafael
Capilla, Jan Bosch, Kyo-Chul Kang. Springer. 2013
Disponible en línea a traves de los servicios electrónicos
de biblioteca.uniandes.edu.co
Mikael Svahnberg, Jilles van Gurp, and Jan Bosch.
2005. A taxonomy of variability realization
techniques: Research Articles. Softw. Pract. Exper. 35,
8 (July 2005), 705-754.
Vocabulario
Variabilidad
Feature
Obligatorio, Opcional, Variable, Externo
Variante
Colección de variantes
Punto de variación
“Binding Time”
Técnica de implementación de la variabilidad
Pasos para introducir variabilidad en una
SPL
1. Identificación de la variabilidad
2. Restricción de la variabilidad
3. Implementación de la variabilidad
4. Administración de la variabilidad
Identificación de la variabilidad
Por ejemplo utilizando el
modelo de variabilidad
ortogonal en cada paso
del ciclo de vida
Identificación de la
variabilidad de manera
incremental
Clasificandola
externa/interna
Restricción de la variabilidad
Restringir una variante:
Decidir cuándo la variante será introducida en
el diseño y la implementación en la línea o en
el producto específico
Decir cuándo y cómo las variantes serán
agregadas al sistema
Escoger un “binding time” para cada punto de
variación
Implementación de la variabilidad
Seleccionar una técnica de implementación
de los puntos de variación relacionados con
una determinada característica variante.
Administración de la variabilidad
Implica el mantenimiento (Extensiones,
correcciones, adaptaciones):
Las características variantes pueden cambiar a
medida que cambian los requerimientos
También implica la distribución de las nuevas
variantes de la base de clientes ya instalada
Restricción e Implementación de la
variabilidad Binding Time o Momento de la selección
Punto de variación
V1 V2 Vn …
Sistema
Variantes
Binding Time o Momento de la
selección
Se define un punto de variación y se
pospone la decisión de cuál variante va a ser
seleccionada.
La elección de una variante particular es el
“binding” o la selección de la variante
Se puede hacer en las distintas etapas del
ciclo de vida de un sistema
Binding Time o Momento de la
selección
Figura tomada de [1] Capítulo 4 “Binding Time and Evolution”
Rafael Capilla and Jan Bosch
En Diseño
Todas las variantes y puntos variaciones se
definen en la arquitectura de software o en
un árbol de características complementario
Antes de la compilación
Desarrollo basado en modelos:
Antes de tiempo de compilación, variantes y
puntos de variación pueden describirse en un
perfil UML o en un lenguaje de dominio específico
Proceso de
generación de
código Modelos
Modelos Código
/ artefactos Código
/ artefactos
Antes de la compilación
Desarrollo basado en aspectos:
Antes de tiempo de compilación, variantes y
puntos de variación pueden describirse en
aspectos
Proceso de
entretejido de
código
Código
principal
Aspecto 1 Código
/ artefactos Código
Final
Aspecto 2
Aspecto n
En Compilación
La finalización del código fuente se hace
durante la compilación.
Esto incluye:
Quitar código de acuerdo con directivas al
compilador en el código fuente, #IFDEF
Extender el código al superponer comportamiento
adicional (por ejemplo, anotaciones, macros).
En Construcción
Cargar, encadenar, ensamblar
Identificación de dependencias entre los
módulos que implementan puntos de
variación y/o variantes
Herramientas:
Make (makefile)
Maven
En configuración y despliegue
Configurar las variantes después de la
compilación y del empaquetamiento puede ser
realizado en el lado desarrollador (antes o
durante el despliegue) o en el lado del cliente.
Las variables, opciones del sistema, se
configuran antes de la ejecución, durante la
primera puesta en marcha o en cada arranque.
Un programa puede leer un archivo de texto
de configuración con los valores
En ejecución
Es la forma más flexible para configurar las
variantes y puntos de variación.
Archivos dinámicos o librerías donde una o varias
variantes implementan una interface.
Ejemplos:
Apache que carga módulos dinámicamente
Eclipse que carga plugins
Reconfiguración dinámica
autonomic computing, self-adaptive, self-healing
systems, etc.).
Niveles de abstracción para
implementar la variabilidad Arquitectura.
el principal mecanismo para la variabilidad es la
sustitución de componentes de primer nivel con
otras implementaciones de estos componentes o
la unión de componentes opcionales,
dependiendo del contexto en el que se despliega
el sistema.
Niveles de abstracción para
implementar la variabilidad Componente.
A nivel de componentes, la variabilidad es a
menudo más compleja porque un concepto
variable puede ser transversal a varios
componentes
Niveles de abstracción para
implementar la variabilidad Código.
A nivel de código, hay un gran conjunto de
mecanismos de variabilidad disponibles.
La principal preocupación, sin embargo, es que
los mecanismos a nivel de código se pueden
aplicar para la implementación algorítmica
normal, así como para la gestión de puntos de
variación.
Mikael Svahnberg, Jilles van Gurp, and Jan Bosch. 2005. A taxonomy of
variability realization techniques: Research Articles. Softw. Pract. Exper. 35, 8
(July 2005), 705-754
Técnicas de implementación
(1) Architecture Reorganization
(2) Variant Architecture Component
(3) Optional Architecture Component
(4) Binary Replacement - Linker Directives
(5) Binary Replacement – Physical
(6) Infrastructure-Centered Architecture
(7) Variant Component Specializations
(8) Optional Component Specializations
(9) Runtime Variant Component Specializations
(10) Variant Component Implementations
(11) Condition on Constant
(12) Condition on variable
(13) Code Fragment Superimposition
Condition on constant
Intención.
Dar soporte a varias formas de realizar una
operación.
Sólo una forma será usada
Motivación.
La variante no es lo suficientemente grande para
ser una clase en su propio derecho.
Se usa por razones de rendimiento, y para ayudar
a eliminar, antes de compilar, código no utilizado.
Condition on constant
#include <stdio.h>
int main(void) {
#ifdef MACRO1
printf("\nMACRO1 Defined\n");
#endif
#ifdef MACRO2
printf("\nMACRO2 Defined\n");
#endif
return 0;
}
$ gcc -Wall -DMACRO2 macro.c -o macro
Preprocesador
#include <stdio.h>
int main(void) {
printf("\nMACRO2 Defined\n");
return 0;
}
Condition on constant
Representación de la
variabilidad
Implícita
Binding Externo
Momento de introducción Implementación
Se resuelve Pre-compilación
Agregar más variantes Implementación
Consecuencias
Usar IFDEFs o similares es riesgoso, ya que
el número de rutas de ejecución posibles
tiende a explotar haciendo el mantenimiento
y corrección de errores difíciles.
Los puntos de variación sueles estar
dispersos por todo el sistema, por lo cual se
hace difícil hacer un seguimiento de cuáles
partes de un sistema pertenecen realmente a
una variante.
#ifdef Considered Harmful, or
Portability Experience With C News. Henry Spencer. 1992
https://www.usenix.org/legacy/publications/library/proceedings/sa92/spencer.pdf
Linux
Ofrece más de 10.000 funciones, un número
que tiene duplicado en los últimos cinco años.
Configuración a través de #ifdef
Incluye 80.000 bloques de código condicionales
Leviathan: Taming the #ifdef Beast in Linux et al.* Wanja Hofer, Christoph Elsner, Frank
Blendinger, Wolfgang Schröder-Preikschat, Daniel Lohmann. Friedrich–Alexander
University Erlangen–Nuremberg. 2010
Condition on variable
if (a == 1) {
…
}
else if (a == 2) {
…
}
…
else if (a == n) {
…
} else {
…
}
PV
V1 V2 … Vn
a == 1
Condition on variable
Representación de la
variabilidad
Implícita o Explícita
Momento de introducción Implementación
Se resuelve Ejecución
Agregar más variantes Implementación
Condition on variable
Consecuencias
Es parte de los lenguajes d eprogramación para
manejar el flujo de control
Cuando se utiliza para resolver variantes se corre
el mismo riesgo que en el caso de los #IFDEFS
Variant Component Implementations
Varias implementaciones simultaneas y
coexistentes de un componente
arquitectónico.
Variant Component Implementations
Tener varias implementaciones de la misma
interfaz
Patrones de diseño [Gamma et al. 1995]:
Strategy
Broker
Abstract Factory
Builder
Variant Component Implementations
Esta técnica se introduce durante el diseño
arquitectónico
El binding se hace en tiempo de ejecución:
Inyección de dependencias
Parámetro de arranque
Colección de las variantes Explícita
Momento de introducción Architecture Design
Se resuelve Ejecución
Agregar más variantes Detailed Design
Variant Component Implementations
Code Fragment Superimposition
Ver material Aspectos