Dependency Inversion Principle
- High level modules should not import anything from low-level modules
- both should depend on abstractions
- e.g.: interfaces
- both should depend on abstractions
- Abstractions should not depend on details
- details (concrete implementations) should depend on abstractions