Resources:

Effective Program Structuring with the Dependency Inversion Principle