a class should have only a single responsibility (i.e. only one potential change in the software's specification should be able to affect the specification of the class)
OCP. Open/closed principle
software entities … should be open for extension, but closed for modification.
LSP. Liskov substitution principle
objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
ISP. Interface segregation principle
many client-specific interfaces are better than one general-purpose interface
DIP. Dependency inversion principle
one should depend upon Abstractions. Do not depend upon concretions