A multi-dimensional product line is described by multiple interacting sets of features.1 2 3 4 As an elementary 2D example, it is easy to create a product line of calculators, where variants offer different sets of operations. Another variation might offer different presentation front ends to calculators, one with no GUI, another with a Java GUI, a third with a web GUI. These variations interact: each GUI representation references a specific calculator operation, so each GUI feature cannot be designed independently of its calculator feature. Such a design leads to a matrix: columns represent increments in calculator functionality, and rows represent different presentation front-ends. Such a matrix M is shown to the right: columns allow one to pair basic calculator functionality (base) with optional logarithmic/exponentiation (lx) and trigonometric (td) features. Rows allow one to pair core functionality with no front-end (core), with optional GUI (gui) and web-based (web) front-ends.
An element Mij implements the interaction of column feature i and row feature j. For example, the element labeled cb is a base program that implements the core functionality of a calculator. Element gb adds code that displays the core functionality as a GUI; element wb adds code that displays the core functionality via the web. Similarly, element ct adds trigonometric code to the core calculator functionality; elements gt and wt add code to display the trigonometric functionality as a GUI and web front-ends.
A calculator is uniquely specified by two sequences of features: one sequence defines the calculator functionality, the other the front-end. For example, calculator C that offers both base and trig functionality in a web format is defined by the expression:
In general, a cube is an n-dimensional array. The rank of a cube is its dimensionality. A scalar is a cube of rank 0, a vector is a cube of rank 1, and a matrix is rank 2. Following tensor notation: the number of indices a cube has designates its rank. A scalar S is rank 0 (it has no indices), Vk is a vector (rank 1), Mij is a matrix (rank 2), Cijk is a cube (rank 3).
Program Cubes are n-dimensional arrays of functions (program transformations) that represent n-dimensional product lines. The values along each axis of a cube denote either a base program or a feature that could elaborate a base program. The rank of a product line is the rank of its cube.
A program in an n-dimensional SPL is uniquely specified by n sequences of features S1..Sn, one per dimension. The design of a program is a scalar (expression) that is formed by (1) projecting the cube of its unneeded elements, and (2) contracting the resultant kcube to a scalar:
Program generation is evaluating the scalar expression to produce program P.
An interesting property of cube design is that the order in which dimensions are contracted does not matter—any permutation of dimensions during contraction results in a different scalar expression (i.e. a different program design), but all expressions produce the same value (program). For example, another expression (design) to produce calculator C contracts dimensions in the opposite order from its original specification:
Or more generally:
The significance of program cubes is that it provides a structured way in which to express and build multi-dimensional models of SPLs. Further, it provides scalable specifications. If each dimension has k values, an n-cube specification of a program requires O(kn) terms, as opposed to O(kn) cube elements that would otherwise have to be identified and then composed. In general, cubes provide a compact way to specify complex programs.
The expression problem (a.k.a. the 'extensibility problem) is a fundamental problem in programming languages aimed at type systems that can add new classes and methods to a program in a type-safe manner.5678 It is also a fundamental problem in multi-dimensional SPL design. The expression problem is an example of an SPL of rank 2. The following applications either explain/illustrate the expression problem or show how it scales to product lines of large programs. EP is really a SPL of ~30 line programs; the applications below show how these ideas scale to programs of >30K lines (a 103 increase in size).
Also, FOSD metamodels can be viewed as special cases of program cubes.
"Generating Product-Lines of Product-Families" (PDF). ftp://ftp.cs.utexas.edu/pub/predator/Origami.pdf ↩
"Refinements and Multi-Dimensional Separation of Concerns" (PDF). ftp://ftp.cs.utexas.edu/pub/predator/OrigamiMDSC.pdf ↩
"Scaling Step-Wise Refinement" (PDF). ftp://ftp.cs.utexas.edu/pub/predator/TSE-AHEAD.pdf ↩
"Evaluating Support for Features in Advanced Modularization Technologies" (PDF). ftp://ftp.cs.utexas.edu/pub/predator/ECOOP2005.pdf ↩
User-defined types and procedural data structures as complementary approaches to data abstraction. MIT Press. 12 August 1994. pp. 13–23. ISBN 9780262071550. 9780262071550 ↩
"Object-Oriented Programming versues Abstract Data Types" (PDF). http://www.cs.utexas.edu/users/wcook/papers/OOPvsADT/CookOOPvsADT90.pdf ↩
"The Expression Problem". http://www.daimi.au.dk/~madst/tool/papers/expression.txt ↩
"Synthesizing Object-Oriented and Functional Design to Promote Re-Use". http://citeseer.ist.psu.edu/krishnamurthi98synthesizing.html ↩