Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1
Definición 2. Tiempo de Resolución (Binding time)
Dentro de una línea de productos de software, el tiempo de resolución es el
momento en el ciclo del desarrollo de un producto en donde las decisiones son
resueltas. Dependiendo de la técnica de implementación, es posible que la
decisión deba resolverse siempre en un momento determinado del desarrollo
(p.ej. durante la compilación) o que existan diferentes momentos en donde se
pueda resolver (p.ej. que la misma técnica permita resolver la decisión en
tiempo de compilación y en tiempo de ejecución).
Cada uno de los tiempos de resolución puede tener ventajas diferentes [1].
Típicamente, la variabilidad en tiempo de compilación permite un número mayor
de optimizaciones. El compilador puede remover todo el código innecesario y
realizar optimizaciones en tamaño y tiempo de ejecución del programa. Sin
embargo, por otro lado, una vez generado el programa ejecutable, ya no es
posible cambiar las decisiones.
2
tiempo de ejecución normalmente se relaciona también con técnicas de
Programación orientada a Contexto y Sistemas Autoadministrados (self-* systems).
3
usar archivos “*.composite” y “pom.xml”, respectivamente, para especificar los
componentes que deben incluirse en un producto específico.
4
Uno de los principales retos de las aproximaciones basadas en composición es
mantener las correspondencias (el mapping) entre las características, el espacio
del problema, y las unidades de composición, el espacio de soluciones. Aunque
idealmente se puede tener una correspondencia uno-a-uno, en muchas ocasiones
no es tan simple y una misma característica puede requerir más una unidad de
composición. Además, es posible que ciertas combinaciones de características
requieran combinaciones diferentes de esas unidades.
Otra forma de ver las diferencias entre anotación y composición es que las
aproximaciones basadas en anotaciones soportan variabilidad negativa, donde el
código es removida por demanda, mientras las técnicas basadas en composición
soportan variabilidad positiva, donde las unidades de composición son agregadas
y/o combinadas por demanda. Igualmente, se dice que las técnicas basadas en
anotaciones hacen una separación virtual de las preocupaciones, mientras las
técnicas basadas en composición hacen una separación física de las
preocupaciones. La Tabla 1 describe algunas de estas diferencias.
5
1.2. Técnicas de Implementación de Variabilidad
Existen una gran variedad de técnicas que se pueden emplear para implementar
la variabilidad de una línea de productos [1][2]. A continuación, se describen
algunas de las técnicas más representativas.
Las empresas que aplican este tipo de técnicas buscan aprovechar herramientas
de control de versiones (como SVN o Git) para reducir el esfuerzo de desarrollo.
Por ejemplo, si en uno de los productos una funcionalidad es desarrollada o un
error es corregido, estas empresas podrían usar estas herramientas para aislar las
modificaciones (generando una diferencia, diff) e intentar hacer los cambios en
otro producto (aplicando un parche, patch). Lamentablemente, es posible que esto
no sea posible y se requiera escribir el código de nuevo en cada producto.
6
1.2.2. Parámetros y Condiciones en el Código Fuente
La forma más simple de implementar toda una LPS en el mismo código fuente
puede ser mediante la codificación explícita de la variabilidad usando estructuras
condicionales (p. ej., usando estructuras “if-then-else”). Para activar o desactivar
este código condicional, los programas pueden revisar parámetros de tiempo de
ejecución (es decir, argumentos que se pasan por la línea de comandos) o archivos
de texto que contienen la configuración del producto. También es posible usar
constantes globales en los programas. Cuando se usa esta estrategia, el código
está habilitado o modificado en función de los parámetros dados, y la variabilidad
se resuelve en tiempo de ejecución.
7
Definición 7. Uso de Patrones de Diseño
La técnica de uso de patrones de diseño consiste en crear un diseño orientado a
objetos para toda la línea de productos, usando patrones como Decorador y
Estrategia para implementar las características que son opcionales o que hacen
parte de grupos alternativos. Normalmente, el uso de patrones requiere
también del uso de parámetros ya que las clases a utilizar se determinan a
partir de parámetros obtenidos a través de argumentos de la línea de
comandos o archivos de configuración.
Clasificación:
Normalmente, resolución de decisiones en tiempo de carga. Existen
algunas herramientas que soportan la implementación de algunos
patrones (p.ej. agregando decoradores) en tiempo de compilación. Sin
embargo, no es tan frecuente.
Tecnología: basada en el lenguaje, usa clases en lenguajes orientados a
objetos
Representación por composición, todas las características se construyen
usando clases aparte que se combinan o reemplazan de acuerdo con la
configuración de la aplicación.
1.2.4. Frameworks
En lenguajes orientados a objetos como Java, otra técnica muy popular es el uso
de Frameworks o Marcos de Trabajo. Un Framework es un conjunto de clases
incompleto, que puede ser extendido y personalizado para un propósito
específico [6]. En lugar de construir toda la aplicación desde cero, los
desarrolladores solo construyen “lo que hace falta”. El Framework constituye una
base reutilizable para la implementación de todos los productos.
Los Frameworks proveen puntos explícitos de extensión, llamados hot spots, donde
los desarrolladores pueden agregar su código. A menudo, estas extensiones se
conocen como plug-ins, cuando se pueden seleccionar cuáles extensiones se
deben incluir en un producto. En el desarrollo de LPS, el ideal podría ser construir
un plug-in para cada una de las características. Sin embargo, esto no siempre es
posible.
8
Definición 8. Uso de Frameworks
La técnica de uso de frameworks consiste en desarrollar los activos y líneas de
producto creando extensiones y plug-ins para un framework existente. Un
framework es un conjunto de clases que (1) representa un diseño abstracto para
soluciones a problemas similares y (2) soporta el reuso a un mayor nivel de
granularidad que las clases. Los framework están abiertos a extensiones en
puntos específicos conocidos como hot spots.
Clasificación:
Normalmente, resolución de decisiones en tiempo de carga. Existen
algunos framework que soportan la resolución de variabilidad en tiempo
de compilación.
Tecnología: basada en el lenguaje, usa clases en lenguajes orientados a
objetos
Representación por composición, todas las características se construyen
usando extensiones o plug-ins aparte que se combinan o reemplazan
de acuerdo con la configuración de la aplicación.
Los servicios pueden verse como una forma especial de componentes que pueden
funcionar remotamente [1]. En los servicios, normalmente la funcionalidad se
ofrece a través de interfaces de programación (APIs) sobre protocolos de
comunicación específicos. De esta forma, por ejemplo, es posible usar servicios
que proveen empresas externas como Google o Twitter, sin importar que
lenguajes de programación o que plataformas ellos usan. Normalmente, cuando
se integran servicios que funcionan en locaciones o que son proveídos por varias
empresas, se dice que se están orquestando servicios. Aunque existen varias
diferencias que pueden ser significativas entre componentes y servicios, para
efectos de la discusión inicial, no haremos una mayor distinción entre ellos.
9
la aplicación funciona siguiendo un diseño preestablecido, el desarrollo basado en
componentes reutiliza los componentes, pero no tiene un esquema de
funcionamiento pre-definido. Se requiere de código pegamento (glue code) que
conecte y haga interactuar los componentes.
10
11
1.2.7. Preprocesamiento y Compilación condicional
Una de las técnicas más utilizadas para implementar la variabilidad es la
compilación condicional usando preprocesadores. Herramientas de
preprocesamiento como el conocido C preprocessor (cpp), usan anotaciones en
forma de “directivas” para señalar fragmentos de código que se deben incluir o
excluir durante la compilación. CPP se utiliza en la mayoría de los proyectos C y C+
+, y se aplica para la variabilidad de productos ampliamente conocidos como
sistemas operativos (p.ej. Linux) y sistemas de bases de datos (p.ej., PostgreSQL y
MySQL).
12
programación basadas en características es capaz de refinar el código existente,
por ejemplo, reemplazando un método o introduciendo nuevas clases.
13
14
1.2.10. Clasificación de las Técnicas de Implementación de
Variabilidad
La Tabla 2 presenta la clasificación de las técnicas de implementación de
variabilidad mencionadas arriba.
Parámetros ✓ ✓ ✓
Patrones de (✓)* ✓ ✓ ✓
Diseño
Frameworks (✓)* ✓ ✓ ✓
Componentes ✓ ✓ ✓ ✓ ✓
Construcción ✓ ✓ (✓)* ✓
(Build)
Preprocesador ✓ ✓ ✓
Feature- ✓ (✓)* ✓ (✓)* ✓
oriented
Programming
15
1.3. Para saber más
En el libro de Apel et al. “Feature Oriented Programming”, el capítulo 3 ofrece una
descripción de las diferentes técnicas de implementación de variabilidad en LPS.
Luego, los capítulos el 4 al 7 describen en detalle cada una de ellas.
S. Apel, D. Batory, C. Kästner, and G. Saake, Feature-Oriented Software
Product Lines. Berlin, Heidelberg: Springer Berlin Heidelberg, 2013.
1.4. Referencias
[1] S. Apel, D. Batory, C. Kästner, and G. Saake, Feature-Oriented Software Product
Lines. Berlin, Heidelberg: Springer Berlin Heidelberg, 2013.
[2] J. Meinicke, T. Thüm, R. Schröter, F. Benduhn, T. Leich, and G. Saake, Mastering
Software Variability with FeatureIDE. Cham: Springer International Publishing, 2017.
[3] Y. Dubinsky, J. Rubin, T. Berger, S. Duszynski, M. Becker, and K. Czarnecki, “An
Exploratory Study of Cloning in Industrial Software Product Lines,” in 2013 17th
European Conference on Software Maintenance and Reengineering, 2013, pp. 25–34.
[4] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design patterns : elements of
reusable object-oriented software. Addison-Wesley, 1995.
[5] K. Czarnecki and U. Eisenecker, Generative programming : methods, tools, and
applications. Addison Wesley, 2000.
[6] R. E. Johnson, R. E. Johnson, and B. Foote, “Designing reuseable classes,” J. OBJECT-
ORIENTED Program., 1988.
[7] J. Meinicke, T. Thüm, R. Schröter, F. Benduhn, T. Leich, and G. Saake, Mastering
Software Variability with FeatureIDE. Cham: Springer International Publishing, 2017.
[8] D. Batory and S. O’Malley, “The design and implementation of hierarchical
software systems with reusable components,” ACM Trans. Softw. Eng. Methodol.,
vol. 1, no. 4, pp. 355–398, Oct. 1992.
[9] G. Kiczales et al., “Aspect-oriented programming,” Springer, Berlin, Heidelberg,
1997, pp. 220–242.
16