A class should have only one reason to change, meaning it should have only one job or responsibility.

</br>
</br>
Software entities (classes, modules, functions) should be open for extension but closed for modification. This means that the behavior of a class can be extended without modifying its source code.

</br>
</br>
Objects of a superclass should be replaceable with objects of a subclass without affecting the correctness of the program.
</br>
</br>
Interfaces should be small & specific to the purpose rather than big and generic in purpose.

</br>
</br>
High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details (i.e., concrete implementations) should depend on abstractions.