Learn SOLID Principles with CLEAN CODE Examples by @AmigosCode
Each class should have only one sole purpose and not be filled with excessive functionality.
Classes should be open for extension but closed for modification. In other words, you should not have to rewrite an existing class for implementing new features.
This means that every subclass or derived class should be substitutable for their base or parent class.
Interfaces should not force classes to implement what they can't do. Large interfaces should be divided into small ones.
Components should depend on abstractions not on concretions.