Articulo de referencia

cubos del programa FOSD

En el desarrollo de software orientado a características , los cubos de programas de desarrollo de software orientado a características ( cubos de programas FOSD ) son matrices ...

En el desarrollo de software orientado a características , los cubos de programas de desarrollo de software orientado a características ( cubos de programas FOSD ) son matrices n-dimensionales de funciones (transformaciones de programas) que representan líneas de productos n-dimensionales. Un programa es una composición de características: un programa base se amplía con incrementos en la funcionalidad del programa, llamados características , para producir un programa complejo. Una línea de productos de software (SPL) es una familia de programas relacionados. Una línea de productos típica tiene F₀ como programa base y F₁ ... Fₙ como características que se pueden agregar a F₀ . Diferentes composiciones de características dan como resultado diferentes programas. Sea + la operación de composición de características. Un programa P en SPL podría tener la siguiente expresión:

P = F 8 + F 4 + F 2 + F 1 + F 0

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 da como resultado 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 obtener una expresión escalar. La expresión para P se convierte en:

PAG=i=(0,1,2,4,8)Fi{\displaystyle P=\sum _{i=(0,1,2,4,8)}\mathbf {F} _{i}}

donde los valores del índice realizan la proyección y la suma es la contracción de la matriz. Esta idea se generaliza a matrices n-dimensionales que modelan líneas de productos multidimensionales.

Líneas de productos multidimensionales

Una línea de productos bidimensional (o cubo)

Una línea de productos multidimensional se describe mediante múltiples conjuntos de características que interactúan entre sí. [ 1 ] [ 2 ] [ 3 ] [ 4 ] Como ejemplo elemental en 2D, es fácil crear una línea de calculadoras, donde las variantes ofrecen diferentes conjuntos de operaciones. Otra variación podría ofrecer diferentes interfaces de usuario para las calculadoras: una sin GUI, otra con una GUI en Java y una tercera con una GUI web. Estas variaciones interactúan: cada representación de GUI hace referencia a una operación específica de la calculadora, por lo que cada característica de la GUI no puede diseñarse independientemente de su característica de la calculadora. Este diseño da lugar a una matriz: las columnas representan incrementos en la funcionalidad de la calculadora y las filas representan diferentes interfaces de usuario. Dicha matriz M se muestra a la derecha: las columnas permiten combinar la funcionalidad básica de la calculadora (base) con características opcionales de logaritmo/exponenciación (lx) y trigonometría (td). Las filas permiten combinar la funcionalidad principal sin interfaz (core), con interfaces opcionales de GUI (gui) y basadas en web (web).

El elemento M ij implementa la interacción entre la característica de columna i y la característica de fila j. Por ejemplo, el elemento cb es un programa base que implementa la funcionalidad principal de una calculadora. El elemento gb agrega código para mostrar la funcionalidad principal mediante una interfaz gráfica de usuario (GUI); el elemento wb agrega código para mostrarla 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 mediante una interfaz gráfica de usuario (GUI) y una interfaz 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 de usuario. Por ejemplo, la calculadora C, que ofrece funcionalidad tanto básica como trigonométrica en formato web, se define mediante la expresión:

do=METROdob+METROdot+METROwb+METROwt=i=(doormi,wmib)j=(basmi,td)METROij{\displaystyle C=M_{cb}+M_{ct}+M_{wb}+M_{wt}=\sum _{i=(core,web) \atop j=(base,td)}\mathbf {M} _{ij}}
Nota: Cada dimensión es una colección de programas base y funcionalidades. No todas sus combinaciones son significativas. Un modelo de funcionalidades define las combinaciones válidas de funcionalidades. Por lo tanto, cada dimensión tendría su propio modelo de funcionalidades. Es posible que ciertas funcionalidades de una dimensión excluyan o requieran funcionalidades de otras dimensiones. En cualquier caso, estos modelos de funcionalidades definen las combinaciones válidas de funcionalidades en una línea de productos multidimensional.

Cubos

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. Según la notación tensorial: el número de índices que tiene un cubo determina 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) y 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 desarrollar un programa base. El rango de una línea de productos es el rango de su cubo.

Nota: Los cubos de programa se inspiran en los tensores y cubos de datos de las bases de datos. La principal diferencia radica en que los elementos de un cubo de datos son valores numéricos que se suman durante la contracción del cubo; los elementos de un cubo de programa son transformaciones que se componen. Ambos utilizan notación y terminología tensorial .

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:

PAG=i1=S1inorte=SnorteKi1inorte{\displaystyle P=\sum _{i_{1}=S_{1}\dots i_{n}=S_{n}}\mathbf {K} _{i_{1}\dots i_{n}}}

La generación de programas 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 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 al de su especificación original:

C = M cb + M wb + M ct + M wt

O, en términos más generales:

PAG=inorte=Snortei1=S1Ki1inorte{\displaystyle P=\sum _{i_{n}=S_{n}\dots i_{1}=S_{1}}\mathbf {K} _{i_{1}\dots i_{n}}}
Nota: El diseño de cubos subyacente es un diagrama conmutativo , de modo que existe un número exponencial de caminos desde el programa vacío 0 hasta el programa P. Cada camino representa una contracción particular de un cubo y corresponde a un diseño incremental único de P. Entre estos caminos se incluyen agregaciones de cubos que contraen cubos utilizando diferentes órdenes dimensionales.

La importancia de los cubos de programa radica en que proporcionan una forma estructurada de expresar y construir modelos multidimensionales de lenguajes de programación de software (SPL). Además, ofrecen especificaciones escalables. Si cada dimensión tiene k valores, una especificación de un programa mediante un cubo de n elementos requiere O(kn) términos, en comparación con los O(k n ) elementos que, de otro modo, tendrían que identificarse y luego componerse. En general, los cubos proporcionan una forma compacta de especificar programas complejos.

Aplicaciones

El problema de la expresión (también conocido como el problema de la extensibilidad ) es un problema fundamental en los lenguajes de programación orientados a sistemas de tipos que pueden agregar nuevas clases y métodos a un programa de manera segura en cuanto a tipos. [ 5 ] [ 6 ] [ 7 ] [ 8 ] También es un problema fundamental en el diseño de SPL multidimensionales. El problema de la expresión es un ejemplo de un SPL de rango 2. Las siguientes aplicaciones explican/ilustran el problema de la 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 ).

  • Problema de expresión
  • Ilustración de un problema de expresión pequeña
  • Entornos de desarrollo integrados (IDE) extensibles
  • Separación multidimensional de preocupaciones
  • Línea de productos de calculadoras

Además, los metamodelos FOSD pueden considerarse casos especiales de cubos de programas.

Referencias

  1. "Generación de líneas de productos de familias de productos" (PDF) . Archivado del original (PDF) el 6 de julio de 2017.
  2. "Refinamientos y separación multidimensional de preocupaciones" (PDF) . Archivado del original (PDF) el 6 de julio de 2017.
  3. "Escalado del refinamiento por etapas" (PDF) . Archivado del original (PDF) el 6 de julio de 2017.
  4. "Evaluación del soporte para funcionalidades en tecnologías de modularización avanzadas" (PDF) . Archivado del original (PDF) el 6 de julio de 2017.
  5. Tipos definidos por el usuario y estructuras de datos procedimentales como enfoques complementarios para la abstracción de datos . MIT Press. 12 de agosto de 1994. págs. 13–23 . ISBN  9780262071550.
  6. "Programación orientada a objetos versus tipos de datos abstractos" (PDF) .
  7. "El problema de la expresión" .
  8. "Síntesis del diseño orientado a objetos y el diseño funcional para promover la reutilización" .