SOLID (Single Responsibility, Open Close Principle, Liskov Substitution, Interface Segregation, Dependency Inversion)
A class should only have one reason to change. This minimizes the impact of modifications.
An class / any software entity should be open for extension, but closed for modification.
Let q(x) be a property provable about objects of x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T. function / functions that use pointers or references to base class must be able to use objects of derived classes without knowing it. in terms of class, objects of a superclass should be replaceable with objects of subclasses without affecting the program’s correctness. A subclass can replace a superclass, if and only if, the subclass does not change the functionality of the superclass.
Clients should not be forced to depend upon interfaces they do not use.
High level modules shouldn’t depend on low level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend upon abstractions. Class should depend on interfaces rather then concerte classes.
Seperation of concerns
Dependency Inversion Principle (DIP)
Adaptability to change
Focus on business value