Many of the software principles and design patterns that we follow are about working with abstractions. However, these patterns and principles don’t provide a mechanism for finding these abstractions. Commonality and variability analysis (CVA) can provide this mechanism.
CVA is a way of finding what varies and encapsulating it in cohesive, loosely coupled classes. It identifies where things vary and how they vary. CVA results in cohesive concepts. These are the same principles upon which design patterns are based. “Isolating variation is a design pattern philosophy” (Shalloway2002, p.269).
“Much of the software principles from Gang of Four and elsewhere is about working with abstractions. However, they don’t tell us how to go about finding abstractions. This is where CVA can come in.” — paraphrasing Scott Bain, I think from the GoF advice webinar.