Son un conjunto de cinco principios fundamentales de diseño de software. Estos principios buscan mejorar la calidad del código, facilitar el mantenimiento y aumentar la flexibilidad y la reutilización del mismo.
Cada clase debería tener una sola responsabilidad.
Una clase debe de estar abierta a la extensión, pero cerrada a la modificación.
Los objetos de una subclase deben poder reemplazar a los objetos de su superclase sin alterar el programa.
Evita las interfaces grandes, pues puden forzar la implementación de métodos innecesarios.
Los módulos de alto nivel no deben depender de los de bajo nivel, sino que ambos deben depender de abstracciones.