# Solid Design

* `s`: Single Responsibility Principle
  * Each class should have only one sole purpose, and not be filled with excessive functionality
  * ex : loan class, there can be multiple loans, car, personal, home.
  * ex : send otp class, there can be multiple ways to send otp, email, sms, whatsapp.
* `o`: Open & Close Principle
  * Classes should be open for extension, closed for modification.
  * In other words, you should not have to rewrite an existing class for implementing new features.
  * ex: using interfaces, can can implement create new class to implement new features.
* `l`: Leskov's Subsititution Principle
  * This means that every subclass or derived class should be substitutable for their base or parent class.
  * ex: we have 3 social media: facebook, instagram & whatsapp
    * whatsapp doesnt support features like publish posts
    * there is no calling on instagram
  * we create interface that contain common functionality, have our classes extend from them
  * for specific features, we create new interfaces for them
* `i`: Interfae Segragation Principle
  * Interfaces should not force classes to implement what they can’t do.
  * Large interfaces should be divided into small ones.
* `d`: Dependency Inversion Principle
  * The principle states that we must use abstraction (abstract classes and interfaces) instead of concrete implementation.
  * High level modules should not depend on the low level module but both should depend on the abstraction.
  * ex: when perform payment, it doesnt matter whether you visa or mastercard, debit or credit card, payment provider will take it.
  * instead of taking input a specific class, take a interface which can be implemented by classes

For examples with code : <https://medium.com/@javatechie/solid-design-principle-java-ae96a48db97>
