Vikas Rajput Profile picture
Oct 20, 2023 18 tweets 5 min read Read on X
SOLID principle is one of the most important design principles in OOP languages like Java, Python, C#, etc.

Sadly, most of the programmers find it super difficult to understand.

Here's the simplest guide to understand SOLID principles:
1. Full form

S = Single Responsibility Principle
O = Open/Closed Principle
L = Liskov Substitution Principle
I = Interface Segregation Principle
D = Dependency Inversion Principle

(we will use Java to understand them)
2. Single Responsibility

A class should always have one responsibility and there should be only a single reason to change it.
2.1. Bad Implementation

Below Employee class contains personal details, business logic to perform a few calculations, and DB logic to save/update.

Our class is tightly coupled, hard to maintain, multiple reasons to modify this class. Image
2.2. Good Implementation:

We can split a single Employee class into multiple classes as per their specific responsibility.

It made our class loosely coupled, easy to maintain, and only single reason to modify. Image
3. Open Close

Class should be Open for Extension but Closed for Modification.
3.1. Bad Implementation

Below EmployeeSalary class calculates salary based on employee type: Permanent and Contractual.

Issue: In the future, if a new type(Part-time Employee) comes then the code needs to be modified to calculate the salary based on employee type. Image
3.2. Good Implementation:

We can introduce a new interface EmployeeSalary and create two child classes for Permanent and Contractual Employees.

By doing this, when a new type comes then a new child class needs to be created and our core logic will also not change from this. Image
4. Liskov Substitution

Child Classes should be replaceable with Parent Classes without breaking the behavior of our code.
4.1. Bad Implementation

Below, TeslaToyCar extends Car but does not support fuel() method as its toy. That's why it's violating the LS principle.

In our code where ever we've used Car, we can't substitute it directly with TeslaToyCar because fuel() will throw Exception. Image
4.2. Good Implementation

Creating new subclass RealCar from parent Car class, so that RealCar can support fuel() and Car can support generic functions support by any type of car.

As shown below, TeslaToyCar and TeslaRealCar can be substituted with their respective Parent class. Image
5. Interface Segregation:

Interface should only have methods that are applicable to all child classes.

If an interface contains a method applicable to some child classes then we need to force the rest to provide dummy implementation.

Move such methods to a new interface.
5.1. Bad Implementation:

Vehicle interface contains the fly() method which is not supported by all vehicles i.e. Bus, Car, etc. Hence they've to forcefully provide a dummy implementation.

It violates the Interface Segregation principle as shown below: Image
5.2. Good Implementation:

Pulling out fly() method into new Flyable interface solves the issue.

Now, Vehicle interface contains methods supported by all Vehicles.

And, Aeroplane implements both Vehicle and Flyable interface as it can fly too. Image
6. Dependency Inversion

Class should depend on abstractions (interface and abstract class) instead of concrete implementations.

It makes our classes de-coupled with each other.

If implementation changes then the class referring to it via abstraction won't change.
6.1. Bad Implementation

We've got a Service class, in which we've directly referenced concrete class(SQLRepository).

Issue: Our class is now tightly coupled with SQLRepository, in future if we need to start supporting NoSQLRepository then we need to change Service class. Image
6.2. Good Implementation

Create a parent interface Repository and SQL and NoSQL Repository implements it.

Service class refers to Repository interface, in future if we need to support NoSQL then simply need to pass its instance in constructor without changing Service class. Image
Thanks for reading!

This Saturday, I'm sharing my life story to @thehumansoftech and will be sharing my entire journey as a Backend Engineer do join in.

Details below:

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Vikas Rajput

Vikas Rajput Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @vikasrajputin

Apr 6, 2024
Mastering docker will be your best decision as a backend engineer.

But getting started with docker, can be super intimidating.

Here's a 2 min guide, to quickly understand docker and why is it used so widely:
𝟭. 𝗣𝗿𝗼𝗯𝗹𝗲𝗺 𝗦𝗼𝗹𝘃𝗲𝗱 𝗯𝘆 𝗗𝗼𝗰𝗸𝗲𝗿

- Building and Deploying an application is always a challenge for programmers. Specially if you're programming on different OS and deploying on server with different OS.

- There's always a chance of human error causing our application to not work on remote servers.

- This problem becomes even worse when we're working on real world application with tons of module, DB, third party integrations, environment specific configuration.

- This is where docker enters into the picture:
𝟮. 𝗗𝗲𝗳𝗶𝗻𝗶𝘁𝗶𝗼𝗻

- Docker allows developers to build, package, and deploy applications in a consistent and efficient way.

- It provides an easy way to create isolated environments for applications, which can help to avoid conflicts and compatibility issues.
Read 6 tweets
Apr 3, 2024
SQL Indexing is one of the most important ways of improving a query performance

Mostly there're 2 types of Indexes:

1) Clustered Index
2) Non-Clustered Index

Here's what it means in the simplest terms:
1. Clustered index

It's a special type of index that reorders the way records in the table are physically stored.

This means that the data rows are stored in the same order as the index.

There can only be one clustered index per table.
For eg:

"Employees" table has fields "ID", "Name", and "Department".

If we create a clustered index on the "ID" field, the data rows will be physically stored in the table in ascending order by "ID".

This can be useful for quickly finding specific records based on "ID".
Read 10 tweets
Mar 29, 2024
SQL Indexing in a Nutshell:
1. Introduction

It is a technique, using which we can improve search performance in our database.

When we search for any record in DB, it goes to the index, finds the exact location of the record, skips the unnecessary records in between, and quickly gives us the results.
2. Example

As shown in the diagram, consider a table PRODUCT with ID as the primary key.

Let's say you want to find a product with the 'ID' of 104.

Without indexing, the database would look through each row, one by one, until it finds the product that will fetch results slowly
Read 7 tweets
Mar 25, 2024
No matter if you're learning SQL for Data Science or Software Development.

You should master SQL "Normalization".

Here's a simple guide to get you started:
1. Introduction

Normalization is a process to eliminate redundant data, prevent data anomalies, and ensure data integrity.

It makes your life super easy to manage, store and query data effectively in longer run!

Normalization happens in multiple stages:

1NF, 2NF, 3NF
2. Realworld Example

To understand normalization, let's consider a simple restaurant database example.

We have one table "Orders" with columns: OrderID, CustomerName, Dish, Chef, DishType, Price. Image
Read 11 tweets
Mar 13, 2024
To master docker, you need to have a solid understanding of how docker volume works.

Here's a quick guide to help you understand everything about volumes:
1. Introduction to volumes

Docker volumes are the preferred mechanism for persisting data generated and used by docker containers.

Think of it as an external hard drive you plug into multiple computers (containers).
2. Why need volumes?

Containers are temporary while data is permanent.

Volumes protect data even if a container dies.

Without volumes:
• Data in containers is lost when the container is killed.
• Sharing data among different containers becomes difficult.
Read 7 tweets
Mar 11, 2024
It took me 10 years to learn this, but let me teach it to you in the next 5 minutes.

It completely changed my life as a programmer: Image
1. ASK Questions

- No matter how dumb you sound

- No matter how silly that question is

Just ASK

- Don't assume anything, have absolute clarity of your work before you start.

- A minor communication gap will ruin your entire hard work so keep asking questions.
2. Don't jump straight into coding

- Pick a pen and paper, and solve it first.

- Understand how the data is flowing in your code.

- Analyse every aspect of the given functionality.

- See if it impacts other modules.
Read 13 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(