Five design principles intended to make software designs more understandable, flexible, maintainable, scalable, and efficient.
SOLID:
A class should have one and only one reason to change, meaning that a class should have only one job.
Objects or entities 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.
Entities must depend on abstractions, not on concretions. It states that the high-level module must not depend on the low-level module, but they should depend on abstractions.
High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details, details should depend upon abstractions.
Learning Sources: