A class should have only one job.
Software entities (Classes, modules, functions) should be open for extension, not modification.
A sub-class must be substitutable for its super-class
Make fine grained interfaces that are client specific. Clients should not be forced to depend upon interfaces that they do not use.
Dependency should be on abstractions not concretions: A. High-level modules should not depend upon low-level modules. Both should depend upon abstractions. B. Abstractions should not depend on details. Details should depend upon abstractions.
Resource: https://blog.bitsrc.io/solid-principles-every-developer-should-know-b3bfa96bb688