Programming Principles

Every software entities should have responsibility over a single part of the functionality.
Single Responsibility Principle (SRP)

Software entities should be open for extension, but closed for modification.
Open-Closed Principle (OCP)

Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
Liskov Substitution Principle (LSP)

No client should be forced to depend on methods it does not use.
Interface Segregation Principle (ISP)

High-level modules should not depend on low-level modules. Both should depend on abstractions.
Abstractions should not depend on details. Details should depend on abstractions.
Dependency Inversion Principle (DIP)

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.
Don’t Repeat Yourself (DRY)