En el desarrollo de software orientado a características , los cubos de programa de desarrollo de software orientado a características ( cubos de programa FOSD ) son matrices n-dimensionales de funciones (transformaciones de programa) que representan líneas de producto n-dimensionales. Un programa es una composición de características: un programa base se aumenta con incrementos en la funcionalidad del programa, llamados características , para producir un programa complejo. Una línea de producto de software (SPL) es una familia de programas relacionados. Una línea de producto típica tiene F 0 como programa base y F 1 ..F n como características que podrían agregarse a F 0 . Diferentes composiciones de características dan lugar a diferentes programas. Sea + la operación de composición de características. Un programa P en SPL podría tener la siguiente expresión:
Es decir, P extiende el programa F 0 con las características F 1 , F 2 , F 4 y F 8 en este orden.
Podemos reformular P en términos de una proyección y contracción de una matriz unidimensional. Sea F i = [F 0 .. F n ] la matriz de características utilizadas por una línea de productos. Una proyección de F i elimina las características innecesarias, lo que produce una matriz más corta (llamémosla) G i . Una contracción de G i suma cada G i en un orden específico, para producir una expresión escalar. La expresión para P se convierte en:
donde los valores de índice realizan la proyección y la suma es una contracción de matriz. Esta idea se generaliza a matrices n-dimensionales que modelan líneas de productos multidimensionales.
Una línea de productos multidimensional se describe mediante múltiples conjuntos de características que interactúan. [1] [2] [3] [4] Como ejemplo elemental en 2D, es fácil crear una línea de productos de calculadoras, donde las variantes ofrecen diferentes conjuntos de operaciones. Otra variación podría ofrecer diferentes interfaces de presentación para las calculadoras, una sin GUI, otra con una GUI Java, una tercera con una GUI web. Estas variaciones interactúan: cada representación de GUI hace referencia a una operación de calculadora específica, por lo que cada característica de GUI no se puede diseñar independientemente de su característica de calculadora. Este diseño conduce a una matriz: las columnas representan incrementos en la funcionalidad de la calculadora y las filas representan diferentes interfaces de presentación. Esta matriz M se muestra a la derecha: las columnas permiten emparejar la funcionalidad básica de la calculadora (base) con características opcionales logarítmicas/exponenciales (lx) y trigonométricas (td). Las filas permiten emparejar la funcionalidad principal sin interfaz (core), con interfaces opcionales GUI (gui) y basadas en web (web).
Un elemento M ij implementa la interacción de la función de columna i y la función de fila j. Por ejemplo, el elemento etiquetado cb es un programa base que implementa la funcionalidad principal de una calculadora. El elemento gb agrega código que muestra la funcionalidad principal como una GUI; el elemento wb agrega código que muestra la funcionalidad principal a través de la web. De manera similar, el elemento ct agrega código trigonométrico a la funcionalidad principal de la calculadora; los elementos gt y wt agregan código para mostrar la funcionalidad trigonométrica como una GUI y como interfaces web.
Una calculadora se especifica de forma única mediante dos secuencias de características: una secuencia define la funcionalidad de la calculadora y la otra, la interfaz. Por ejemplo, la calculadora C, que ofrece funciones básicas y trigonométricas en un formato web, se define mediante la expresión:
En general, un cubo es una matriz n-dimensional. El rango de un cubo es su dimensionalidad. Un escalar es un cubo de rango 0, un vector es un cubo de rango 1 y una matriz es de rango 2. Siguiendo la notación tensorial: la cantidad de índices que tiene un cubo designa su rango. Un escalar S es de rango 0 (no tiene índices), V k es un vector (rango 1), M ij es una matriz (rango 2), C ijk es un cubo (rango 3).
Los cubos de programas son matrices n-dimensionales de funciones (transformaciones de programas) que representan líneas de productos n-dimensionales. Los valores a lo largo de cada eje de un cubo indican un programa base o una característica que podría elaborar un programa base. El rango de una línea de productos es el rango de su cubo.
Un programa en un SPL n-dimensional se especifica de forma única mediante n secuencias de características S 1 ..S n , una por dimensión. El diseño de un programa es un escalar (expresión) que se forma (1) proyectando el cubo de sus elementos innecesarios y (2) contrayendo el kcubo resultante a un escalar:
La generación del programa consiste en evaluar la expresión escalar para producir el programa P.
Una propiedad interesante del diseño de cubos es que el orden en el que se contraen las dimensiones no importa: cualquier permutación de dimensiones durante la contracción da como resultado una expresión escalar diferente (es decir, un diseño de programa diferente), pero todas las expresiones producen el mismo valor (programa). Por ejemplo, otra expresión (diseño) para producir la calculadora C contrae las dimensiones en el orden opuesto a su especificación original:
O más generalmente:
La importancia de los cubos de programas es que proporcionan una forma estructurada de expresar y construir modelos multidimensionales de SPL. Además, proporcionan especificaciones escalables. Si cada dimensión tiene k valores, una especificación de n-cubos de un programa requiere O(kn) términos, a diferencia de O(k n ) elementos de cubo que de otro modo tendrían que identificarse y luego componerse. En general, los cubos proporcionan una forma compacta de especificar programas complejos.
El problema de expresión (también conocido como el " problema de extensibilidad ") es un problema fundamental en los lenguajes de programación destinados a sistemas de tipos que pueden agregar nuevas clases y métodos a un programa de manera segura para los tipos. [5] [6] [7] [8] También es un problema fundamental en el diseño de SPL multidimensional. El problema de expresión es un ejemplo de un SPL de rango 2. Las siguientes aplicaciones explican/ilustran el problema de expresión o muestran cómo se escala a líneas de productos de programas grandes. EP es realmente un SPL de programas de ~30 líneas; las aplicaciones a continuación muestran cómo estas ideas se escalan a programas de >30K líneas (un aumento de tamaño de 10 3 ).
Además, los metamodelos FOSD pueden verse como casos especiales de cubos de programa.