SOLID
SRP - Single responsibility principle
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.” See also design by contract.
ISP - Interface segregation principle
“many client-specific interfaces are better than one general-purpose interface.”[8]
DIP - Dependency inversion principle
one should “depend upon abstractions, [not] concretions.”[8]