Author: Robert C. Martin
A class should have only one reason to change, Robert C. Martin.
Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
Many client-specific interfaces are better than one general-purpose interface,Robert C. Martin.
Depend upon abstractions, [not] concretions,Robert C. Martin.