Resources:
Effective Program Structuring with the Dependency Inversion Principle