The Open/Closed Principle (OCP)

A module should be open for extension but closed for modification.

Liskov’s Substitution Principle (LSP)

Subclasses should be substitutable for their base classes.

The Dependency Inversion Principle (DIP)

High-level modules should not depend upon low-level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.