-> SRP -> Single Responsibility Principle
-> OCP -> Open/Closed Principle
-> LSP -> Liskov Substitution Principle
-> ISP -> Interface Segregation Principle
-> DIP -> Dependency Inversion Principle
-> A class should have only one reason to change.
-> There should be never be, more than one reason for a class to change.
-> We should design a class in such a way that there should not be more than one responsibility associated with a class.
-> Opening up for extension, closing it down for modifications.
-> Modules should be opened for extension but closed for modifications.
-> Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
-> Functions that use references of the base class must be able to use objects of derived class even without knowing them.
-> Always program in interfaces.
-> A subclass should behave in such a way that it will not cause problems when used instead of the superclass.
Interface Segregation Principle
-> Many client-specific interfaces are better than one general-purpose interface.
-> Clients should not be forced to depend upon interfaces that they don’t use.
Dependency Inversion Principles
-> High level modules should not depend on the lower level modules.
-> One should depend upon Abstractions. Do not depend upon concretions.
-> Never derive from concrete class, derive from interfaces.