If our goal is to create a code base that will be usable for a long time, we need flexibility. Source code (just like product feature sets and business tactics) isn't chiseled out of rock—it tends to morph into different forms over time. If our source code is to be flexible, it needs to be able to morph and adapt. Only then will it be able to provide a solid foundation for implementing different feature sets of a product (or entire product lines) as the business landscape driving its development changes. Abstraction is a core tenet of flexibility.
In our context, abstraction means representing a single instance of a complex implementation with a representation that can be applied to many different instances. For example, let's take another look at an earlier example from Chapter 1, Introducing Real-Time Systems:
The diagram itself is...