The Single Responsibility rule states that a class should have a single purpose, and its methods should all be related to that purpose.
The Encapsulation rule states that a class’s implementation details should be hidden from its clients as much as possible.
The Most Qualified Class rule states that work should be assigned to the class that knows best how to do it.
The Low Coupling rule states that the number of class dependencies should be minimized.
The rule of Transparency states that a client should be able to use an interface without needing to know the classes that implement that interface.
The Open/Closed rule states that programs should be structured so that they can be revised by creating new classes instead of modifying existing ones.
The Liskov Substitution Principle (LSP) specifies when it is meaningful for one interface to be a subtype of another. In particular, X should be a subtype of Y only if an object of type X can always be used wherever an object of type Y is expected.
The rule of Abstraction states that a class’s dependencies should be as abstract as possible.