Bird
Raised Fist0
LLDsystem_design~7 mins

Single Responsibility Principle in LLD - System Design Guide

Choose your learning style10 modes available
Problem Statement
When a class or module handles multiple responsibilities, changes in one area can cause unexpected bugs in others. This makes the code hard to understand, test, and maintain, slowing down development and increasing errors.
Solution
Divide the code so each class or module has only one reason to change by focusing on a single responsibility. This keeps code simpler, easier to test, and safer to modify without affecting unrelated parts.
Architecture
Bad Design
Multi-task
↓
Handles User
Data & Email
↓
Handles Email
Handles Email

The diagram shows a single class doing multiple jobs versus splitting those jobs into separate classes each with one responsibility.

Trade-offs
✓ Pros
→
Improves code readability by focusing each class on one task.
→
Makes testing easier since each class has a clear purpose.
→
Reduces risk of bugs when changing code because responsibilities are isolated.
→
Facilitates parallel development as different developers can work on separate classes.
✗ Cons
→
May increase the number of classes, making the project structure larger.
→
Requires careful design upfront to identify distinct responsibilities.
→
Can introduce more files and interfaces, which might seem complex initially.
Use when classes or modules start to grow large or handle multiple unrelated tasks, especially in projects expected to evolve or be maintained long-term.
Avoid in very small scripts or prototypes where simplicity and speed of writing code outweigh long-term maintainability.
Real World Examples
Amazon
Amazon separates order processing, payment handling, and notification sending into different services to allow independent updates and scaling.
Netflix
Netflix uses single responsibility in microservices to isolate user management, streaming, and recommendation logic, enabling faster deployment and fewer bugs.
Spotify
Spotify splits music playback, user playlists, and social sharing into distinct components to simplify development and testing.
Code Example
The before code mixes user data saving and email sending in one class, violating single responsibility. The after code splits these into two classes, each handling one responsibility, making the code easier to maintain and test.
LLD
### Before applying Single Responsibility Principle
class UserManager:
    def __init__(self, user_data):
        self.user_data = user_data

    def save_user(self):
        # code to save user data
        pass

    def send_welcome_email(self):
        # code to send email
        pass


### After applying Single Responsibility Principle
class UserDataManager:
    def __init__(self, user_data):
        self.user_data = user_data

    def save_user(self):
        # code to save user data
        pass

class EmailSender:
    def send_welcome_email(self, user_email):
        # code to send email
        pass
OutputSuccess
Alternatives
Modular Monolith
Groups related responsibilities into modules within a single application instead of separate classes or services.
Use when: Choose when the system is not large enough to justify full microservices but still needs separation of concerns.
Facade Pattern
Provides a simplified interface to a complex subsystem but does not enforce single responsibility inside the subsystem.
Use when: Choose when you want to hide complexity but not necessarily separate responsibilities.
Summary
Single Responsibility Principle ensures each class has only one reason to change.
It improves code clarity, testability, and reduces bugs by isolating responsibilities.
Use it especially in growing or long-lived projects to keep code manageable.

Practice

(1/5)
1. What does the Single Responsibility Principle (SRP) mean in simple terms?
easy
A. A class should handle multiple tasks to reduce the number of classes.
B. Each class or module should have only one job or responsibility.
C. All functions should be written in a single class for simplicity.
D. Classes should share responsibilities to improve collaboration.

Solution

  1. Step 1: Understand the principle's core idea

    The Single Responsibility Principle states that a class or module should have one and only one reason to change, meaning it should do one job.
  2. Step 2: Match the explanation to the options

    Each class or module should have only one job or responsibility. clearly states that each class or module should have only one job, which matches the principle.
  3. Final Answer:

    Each class or module should have only one job or responsibility. -> Option B
  4. Quick Check:

    Single Responsibility Principle = One job per class [OK]
Hint: One class, one job keeps code clean and simple [OK]
Common Mistakes:
  • Thinking one class should do many tasks
  • Believing all code should be in one place
  • Confusing SRP with code reuse
2. Which of the following class names best follows the Single Responsibility Principle?
easy
A. UserAuthenticator
B. DataProcessorAndReportGenerator
C. UserManagerAndLogger
D. FileHandlerAndNetworkSender

Solution

  1. Step 1: Analyze class names for single responsibility

    Classes with multiple responsibilities in their names violate SRP. UserManagerAndLogger, DataProcessorAndReportGenerator, and FileHandlerAndNetworkSender suggest multiple jobs.
  2. Step 2: Identify the class with one clear responsibility

    UserAuthenticator clearly focuses on one task: authenticating users, which aligns with SRP.
  3. Final Answer:

    UserAuthenticator -> Option A
  4. Quick Check:

    Class name with one job = UserAuthenticator [OK]
Hint: Class name shows one clear job means SRP followed [OK]
Common Mistakes:
  • Choosing classes with multiple jobs in name
  • Ignoring SRP and mixing responsibilities
  • Assuming longer names are better
3. Given this Python class, what is the main SRP violation?
class OrderProcessor:
    def process_order(self, order):
        self.validate_order(order)
        self.save_order(order)
        self.send_confirmation_email(order)

    def validate_order(self, order):
        pass

    def save_order(self, order):
        pass

    def send_confirmation_email(self, order):
        pass
medium
A. The class handles order validation, saving, and email sending, mixing responsibilities.
B. The class does not validate the order properly.
C. The class should not have any methods.
D. The class only processes orders and follows SRP.

Solution

  1. Step 1: Identify responsibilities in the class

    The class OrderProcessor validates orders, saves orders, and sends confirmation emails. These are three distinct jobs.
  2. Step 2: Check SRP compliance

    SRP requires one responsibility per class. Mixing validation, saving, and emailing violates SRP.
  3. Final Answer:

    The class handles order validation, saving, and email sending, mixing responsibilities. -> Option A
  4. Quick Check:

    Multiple jobs in one class = SRP violation [OK]
Hint: One class, one job; multiple jobs mean SRP broken [OK]
Common Mistakes:
  • Ignoring multiple responsibilities in one class
  • Thinking multiple methods mean multiple classes
  • Assuming SRP allows all related tasks in one class
4. You have a class that both calculates taxes and generates invoices. What is the best way to fix this SRP violation?
medium
A. Combine tax calculation and invoice generation into a single method.
B. Add more methods to handle discounts and payments in the same class.
C. Split the class into two: one for tax calculation and one for invoice generation.
D. Remove tax calculation and keep only invoice generation.

Solution

  1. Step 1: Identify the problem with the current class

    The class does two jobs: calculating taxes and generating invoices, which breaks SRP.
  2. Step 2: Apply SRP by separating responsibilities

    Splitting into two classes, each with one responsibility, fixes the violation and improves maintainability.
  3. Final Answer:

    Split the class into two: one for tax calculation and one for invoice generation. -> Option C
  4. Quick Check:

    Separate classes for separate jobs = SRP fix [OK]
Hint: Split mixed jobs into separate classes to follow SRP [OK]
Common Mistakes:
  • Adding unrelated methods to the same class
  • Combining jobs into one method
  • Removing needed functionality instead of splitting
5. You are designing a system for a library. Which design best follows the Single Responsibility Principle?
hard
A. A single class 'LibrarySystem' that manages books, users, loans, and notifications.
B. A single class 'Library' that handles everything including maintenance and reporting.
C. One class 'LibraryManager' that handles books and users, and another class 'LoanAndNotificationManager' for loans and alerts.
D. Separate classes: 'BookManager' for books, 'UserManager' for users, 'LoanManager' for loans, and 'NotificationService' for alerts.

Solution

  1. Step 1: Analyze each design for responsibility separation

    Designs with a single class handling books, users, loans, and notifications, or a single class handling everything, put many jobs into one class, violating SRP. Designs with one class for books and users, and another for loans and notifications, mix multiple jobs in each class.
  2. Step 2: Identify the design with clear single responsibilities

    Separate classes: 'BookManager' for books, 'UserManager' for users, 'LoanManager' for loans, and 'NotificationService' for alerts. separates concerns into distinct classes, each with one responsibility, following SRP best.
  3. Final Answer:

    Separate classes: 'BookManager' for books, 'UserManager' for users, 'LoanManager' for loans, and 'NotificationService' for alerts. -> Option D
  4. Quick Check:

    Separate classes for separate jobs = SRP followed [OK]
Hint: One class per job in system design follows SRP best [OK]
Common Mistakes:
  • Grouping unrelated responsibilities in one class
  • Mixing multiple jobs in fewer classes
  • Ignoring SRP for convenience
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard