В разработке программного обеспечения , ориентированного на функции , кубы программ разработки программного обеспечения, ориентированного на функции ( кубы программ FOSD ), представляют собой n-мерные массивы функций (преобразований программ), которые представляют n-мерные линейки продуктов. Программа представляет собой композицию функций: базовая программа дополняется приращениями функциональности программы, называемыми функциями , для создания сложной программы. Линейка программного продукта (SPL) представляет собой семейство связанных программ. Типичная линейка продуктов имеет F 0 в качестве базовой программы и F 1 ..F n в качестве функций, которые могут быть добавлены к F 0 . Различные композиции функций дают разные программы. Пусть + обозначает операцию композиции функций. Программа P в SPL может иметь следующее выражение:
То есть P расширяет программу F 0 функциями F 1 , F 2 , F 4 и F 8 в указанном порядке.
Мы можем переформулировать P в терминах проекции и сжатия одномерного массива. Пусть F i = [F 0 .. F n ] обозначает массив характеристик, используемых линейкой продуктов. Проекция F i устраняет ненужные характеристики, давая более короткий массив (назовем его) G i . Сжатие G i суммирует каждый G i в определенном порядке, чтобы получить скалярное выражение. Выражение для P становится:
где значения индекса выполняют проекцию, а суммирование — это сокращение массива. Эта идея обобщается на n-мерные массивы, которые моделируют многомерные линейки продуктов.
Многомерная линейка продуктов описывается несколькими взаимодействующими наборами функций. [1] [2] [3] [4] В качестве элементарного двумерного примера легко создать линейку продуктов калькуляторов, где варианты предлагают разные наборы операций. Другой вариант может предлагать разные интерфейсы представления для калькуляторов, один без графического интерфейса, другой с графическим интерфейсом Java, третий с веб-интерфейсом. Эти варианты взаимодействуют: каждое представление графического интерфейса ссылается на определенную операцию калькулятора, поэтому каждая функция графического интерфейса не может быть разработана независимо от ее функции калькулятора. Такой дизайн приводит к матрице: столбцы представляют приращения в функциональности калькулятора, а строки представляют разные интерфейсы представления. Такая матрица M показана справа: столбцы позволяют связать базовую функциональность калькулятора (база) с дополнительными логарифмическими/возведением в степень (lx) и тригонометрическими (td) функциями. Строки позволяют связать основную функциональность без интерфейса (ядро), с дополнительным графическим интерфейсом (gui) и веб-интерфейсами (web).
Элемент M ij реализует взаимодействие функции столбца i и функции строки j. Например, элемент с меткой cb является базовой программой, реализующей основную функциональность калькулятора. Элемент gb добавляет код, который отображает основную функциональность в виде графического интерфейса пользователя; элемент wb добавляет код, который отображает основную функциональность через веб. Аналогично, элемент ct добавляет тригонометрический код к основной функциональности калькулятора; элементы gt и wt добавляют код для отображения тригонометрической функциональности в виде графического интерфейса пользователя и веб-интерфейсов.
Калькулятор однозначно определяется двумя последовательностями функций: одна последовательность определяет функциональность калькулятора, другая — интерфейс. Например, калькулятор C, который предлагает как базовую, так и тригонометрическую функциональность в веб-формате, определяется выражением:
В общем случае куб — это n-мерный массив. Ранг куба — это его размерность. Скаляр — это куб ранга 0, вектор — это куб ранга 1, а матрица — ранга 2. Следуя тензорной нотации: количество индексов куба обозначает его ранг. Скаляр S имеет ранг 0 (не имеет индексов), V k — вектор (ранг 1), M ij — матрица (ранг 2), C ijk — куб (ранг 3).
Кубы программ — это n-мерные массивы функций (преобразований программ), которые представляют n-мерные линейки продуктов. Значения вдоль каждой оси куба обозначают либо базовую программу, либо функцию, которая могла бы разработать базовую программу. Ранг линейки продуктов — это ранг ее куба.
Программа в n-мерном SPL однозначно задается n последовательностями признаков S 1 ..S n , по одному на измерение. Проект программы — это скаляр (выражение), который формируется (1) проекцией куба его ненужных элементов и (2) сжатием результирующего kcube в скаляр:
Генерация программы — это оценка скалярного выражения для создания программы P.
Интересное свойство кубической конструкции заключается в том, что порядок, в котором сокращаются измерения, не имеет значения — любая перестановка измерений во время сокращения приводит к другому скалярному выражению (т. е. к другому дизайну программы), но все выражения производят одно и то же значение (программу). Например, другое выражение (дизайн) для создания калькулятора C сокращает измерения в порядке, противоположном его исходной спецификации:
Или в более общем смысле:
Значимость кубов программ заключается в том, что они предоставляют структурированный способ выражения и построения многомерных моделей SPL. Кроме того, они предоставляют масштабируемые спецификации. Если каждое измерение имеет k значений, спецификация n-куба программы требует O(kn) членов, в отличие от O(k n ) элементов куба, которые в противном случае пришлось бы идентифицировать и затем составлять. В целом, кубы предоставляют компактный способ спецификации сложных программ.
Проблема выражения (также известная как « проблема расширяемости ») является фундаментальной проблемой в языках программирования, нацеленных на системы типов, которые могут добавлять новые классы и методы в программу безопасным для типов образом. [5] [6] [7] [8] Это также фундаментальная проблема в многомерном проектировании SPL. Проблема выражения является примером SPL ранга 2. Следующие приложения либо объясняют/иллюстрируют проблему выражения, либо показывают, как она масштабируется до линеек продуктов больших программ. EP на самом деле является SPL из ~30 строк программ; приложения ниже показывают, как эти идеи масштабируются до программ из >30 тыс. строк (увеличение размера на 10 3 ).
Кроме того, метамодели FOSD можно рассматривать как частные случаи программных кубов.