- The single-responsibility principle: a module, a class or a method should has only one responsibility.
- The open-close principle: open to extension, close to modification.
- The Liskov-substitution principle: a subclass should be used wherever its base class can be used.
- The interface segregation principle: a class should not depend on methods that it doesn't need to implement
- The dependency inversion principle: a module or a class should depend on abstractions instead of concrete implementations