Matt Johnson
SIngle Responsibility Principle A class should have only a single responsibility.
A software module should be open for extension and closed for modification
Liskov Substitution Principle Objects in a program should be replacaeble with instances of their subtypes without altering the correctness of program
TClients should not be forced to depend on interfaces that they do not use
Program to an interface, not to an implementation