Principles of Computer Science and Programming
A class should only have one reason to change; Separation of concerns.
A class should have only 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.
Classes should be open for extension but closed for modification.
Software entities should be open for extension, but closed for modification.
You should be able to substitute a base type for a subtype.
Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
Don't put too much into an interface; YAGNI; split into separate interfaces.
High-level modules should not depend upon low-level ones; use abstraction.
Entities must depend on abstractions, not on concrete implementations.
The construction (creation) of objects.
Used when object construction is complicated. It's piecewise.
Used when object creation logic becomes too convoluted and the constructor is not descriptive. It's non-piecewise. Can be outsourced (A separate function, a separate class, hierarchy of factories). A component responsible solely for the wholesale (not piecewise) creation of objects.
A partially or fully initialized object that you copy (clone) and make use of.
A component which is instantiated only once.
The structure of classes (e.g. class members).
No central theme (they are all different).