Design Principles

dry

kiss

encapsulate what varies

program to an interface, not an implementation

favour composition over inheritance

SOLID

single responsibility principle

open/closed principle

Liskov substitution principle

interface segregation principle

dependency inversion principle