"A class should only have a single responsibility, that is, only changes to one part of the software's specification should be able to affect the specification of the class."
"Objects/entities should be open for extension but closed for modification"
"q(x)-x of type T-provable then q(y)y of type S & is a subtype of T-also provable"
"A client should never be forced to implement an interface that it doesn't use"
"Entities must depend on abstractions, not on concretions"