SOLID Principles in Programming
SOLID Principles in Programming
The SOLID principle helps in reducing tight coupling. Tight coupling means a group
of classes are highly dependent on one another which you should avoid in your code.
So if our code has loosely-coupled classes, then it is considered as a good code.
Loosely coupled classes minimize changes in your code, helps in making code more
reusable, maintainable, flexible and stable. Now let’s discuss one by one these
principles…
1. Single Responsibility Principle: This principle states that “A class should have
only one reason to change” which means every class should have a single
responsibility or single job or single purpose. In other words, a class should have
only one job or purpose within the software system.
Example:
Imagine a baker who is responsible for baking bread. The baker’s role is to focus
on the task of baking bread, ensuring that the bread is of high quality, properly
baked, and meets the bakery’s standards.
-However, if the baker is also responsible for managing the inventory, ordering
supplies, serving customers, and cleaning the bakery, this would violate the SRP.
-To adhere to the SRP, the bakery could assign different roles to different
individuals or teams. For example, there could be a separate person or team
responsible for managing the inventory, another for ordering supplies, another for
serving customers, and another for cleaning the bakery.
Example:
Imagine you have a class called PaymentProcessor that processes payments for an
online store. Initially, the PaymentProcessor class only supports processing
payments using credit cards. However, you want to extend its functionality to also
support processing payments using PayPal.
Instead of modifying the existing PaymentProcessor class to add PayPal support, you
can create a new class called PayPalPaymentProcessor that extends the
PaymentProcessor class. This way, the PaymentProcessor class remains closed for
modification but open for extension, adhering to the Open-Closed Principle
Example:
One of the classic examples of this principle is a rectangle having four sides. A
rectangle’s height can be any value and width can be any value. A square is a
rectangle with equal width and height. So we can say that we can extend the
properties of the rectangle class into square class.
In order to do that you need to swap the child (square) class with parent
(rectangle) class to fit the definition of a square having four equal sides but a
derived class does not affect the behavior of the parent class so if you will do
that it will violate the Liskov Substitution Principle.
Example:
Suppose if you enter a restaurant and you are pure vegetarian. The waiter in that
restaurant gave you the menu card which includes vegetarian items, non-vegetarian
items, drinks, and sweets.
-In this case, as a customer, you should have a menu card which includes only
vegetarian items, not everything which you don’t eat in your food. Here the menu
should be different for different types of customers.
-The common or general menu card for everyone can be divided into multiple cards
instead of just one. Using this principle helps in reducing the side effects and
frequency of required changes.
-In simpler terms, the DIP suggests that classes should rely on abstractions (e.g.,
interfaces or abstract classes) rather than concrete implementations.
-This allows for more flexible and decoupled code, making it easier to change
implementations without affecting other parts of the codebase.
Example: