Separation is a crucial but sophisticated concept.
1. Rigorous separation is essential to successful evolution of software systems.
2. It enables isolation of change.
3. It enables replacement of one implementation by another.
4. It is crucial to object hierarchies.
The question is the boundary between what and how.
1. The behaviors of objects are specified as method headers.
3. Important properties such as stability, performance, etc. are not visible
in the interface but are often needed for composition.