Central to the notion of product-lines and product-families are tracking and managing three different kinds of software assets:
- common/core assets that are shared by all the products in the product-line
- shared assets that are common to some products but not others, and ...
- product-specific assets (or custom-components) that are specific to a single product in the product-line.
A few resources on the subject of Commonality and Variability are as follows:
- A good (albeit old) article on Variability Management in Software Product Lines has a nice overview of some basic variability enabling techniques and the use of binding time
- A dissertations on Variation Mechanisms and Multi-view Architecting in Platform-based Product Family Development
- Expressing Product Diversification -- Categorizing And Classifying Variability In Software Product Family Engineering
- Coplien, Weiss and Hoffman wrote a nice overview article on Commonality and Variability in Software Engineering
- Alan Shalloway has an excellent introductory article on Commonality and Variability Analysis in conjunction with Design Patterns.
- Use Late-Binding instead of Branching:
- Build/Package Options
- Feature Configuration/Selection
- Business Rules
- Interface vs. Implementation vs. Integration
- Container vs. Content vs. Context
Think about which of the following needs to "vary" and what needs to stay the same:
Commonality & Variability analysis helps identify the core dimensions of variation for your project
Use a combination of strategies based on the different types of needed variation and the "dimension" in which each one operates