SOLID

Single responsibility principle

A class should only have one responsibility

Open-closed principle

Code should be open for extension, but closed for modification.
(Aka freely extensible, but should not need modification of the original code)

Liskov substitution principle

Objects in a program should be replaceable with instances of their (super/sub) types without altering the correctness of that program.

e.g. Board <- Board3D

Interface segregation principle

Many client-specific interfaces are better than one general-purpose interface

Dependency inversion principle

Depend upon abstractions rather than concretions