On this page
A class should have one and only one reason to change, meaning that a class should have only one job
Objects or entities should be open for extension but closed for modification
Let Q(x)
be a property provable about objects x of type T
Then Q(y)
should be true for objects y of type S where S is a subtype of T
in another words
objects of a superclass should be replaceable with objects of its subclasses without breaking the application
A client should never be forced to implement an interface that it does not use, or clients should not be forced to depend on methods that they do not use
High-level modules should not depend on low-level modules
Both should depend on abstractions
Abstractions should not depend on details
Details should depend on abstractions