4.4.2 How to Apply the Program to Interfaces, Not Implementations Principle