**SINGLE RESPONSIBILITY PRINCIPLE*
A class should have only one reason to change. This means a class should have only one responsibility or functionality.
**OPEN CLOSED PRINCIPLE
A class should be open for extension but closed for modification. This means you should be able to add new functionality without modifying existing code.
**LISKOV SUBSTITUTION PRINCIPLE
Objects of a superclass should be replaceable with objects of a subclass without altering the correctness of the program.
_**INTERFACE SEGREGATION PRINCIPLE
A class should not be forced to implement interfaces it doesn’t use. Large interfaces should be split into smaller, more specific interfaces.
**DEPENDENCY INVERSION PRINCIPLE
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.