Dependency Inversion Principle
High-level modules should not depend on low-level modules; both should depend on abstractions. Invert the dependency flow.
High-level modules should not depend on low-level modules; both should depend on abstractions. Invert the dependency flow.
Clients should not depend on interfaces they don't use. Break large interfaces into smaller, focused ones.
Subtypes must be substitutable for their supertypes without breaking client code. Preserve behavioral contracts.
Software entities should be open for extension, closed for modification. Design for change without breaking existing code.
A class should have only one reason to change. Master focused, maintainable design.