Bird
Raised Fist0
LLDsystem_design~7 mins

Clean Architecture layers in LLD - System Design Guide

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Problem Statement
When application code mixes business logic with UI or database details, changes in one area cause bugs in others. This tight coupling makes the system hard to test, maintain, and evolve as requirements grow or technologies change.
Solution
Clean Architecture separates the system into layers with clear rules: inner layers contain business rules, outer layers handle details like UI and databases. Dependencies only point inward, so core logic stays independent and easy to test or replace.
Architecture
UI Layer
(Controllers, Views)
Application Layer
(Use Cases, Services)
Domain Layer
(Entities, Business
Infrastructure Layer
(Database, Frameworks)

This diagram shows the four main layers of Clean Architecture with arrows pointing inward, indicating dependencies flow from outer layers to inner layers only.

Trade-offs
✓ Pros
Keeps business logic independent from UI and database changes.
Improves testability by isolating core logic from external concerns.
Facilitates easier maintenance and evolution of the system.
Supports parallel development by separating concerns clearly.
✗ Cons
Adds initial complexity and more code structure to simple projects.
Requires discipline to maintain strict layer boundaries.
May introduce some performance overhead due to abstraction layers.
Use when building medium to large applications with complex business rules or when expecting frequent changes in UI or infrastructure components.
Avoid for very small or simple projects where added layers increase complexity without clear benefit.
Real World Examples
Amazon
Uses Clean Architecture principles to keep their core order processing logic independent from various front-end platforms and database technologies.
Netflix
Applies layered architecture to isolate business rules from delivery mechanisms, enabling rapid UI experimentation without risking core logic.
Uber
Separates domain logic from infrastructure to support multiple client apps and evolving backend services independently.
Code Example
The before code mixes validation, database saving, and UI printing in one class, making changes risky. The after code splits responsibilities: Order holds business rules, OrderService handles use cases, OrderRepository manages data storage, and OrderController manages UI interaction. This separation follows Clean Architecture layers and dependency rules.
LLD
### Before: Business logic mixed with database and UI
class OrderProcessor:
    def __init__(self, db):
        self.db = db

    def process_order(self, order_data):
        # Validate order
        if not order_data.get('items'):
            raise ValueError('No items')
        # Save to DB
        self.db.save(order_data)
        # Print confirmation
        print('Order processed')


### After: Clean Architecture layers separated

# Domain Layer
class Order:
    def __init__(self, items):
        if not items:
            raise ValueError('No items')
        self.items = items

# Application Layer
class OrderService:
    def __init__(self, order_repo):
        self.order_repo = order_repo

    def place_order(self, order):
        self.order_repo.save(order)

# Infrastructure Layer
class OrderRepository:
    def __init__(self, db):
        self.db = db

    def save(self, order):
        self.db.save(order)

# UI Layer
class OrderController:
    def __init__(self, order_service):
        self.order_service = order_service

    def submit_order(self, order_data):
        order = Order(order_data.get('items'))
        self.order_service.place_order(order)
        print('Order processed')
OutputSuccess
Alternatives
Layered Architecture
Layers are organized by technical roles but may allow dependencies between layers in both directions.
Use when: When the system is simpler and strict dependency rules are not critical.
Hexagonal Architecture
Focuses on ports and adapters around the domain, emphasizing input/output boundaries rather than strict layers.
Use when: When you want to isolate the domain with clear input/output interfaces.
Onion Architecture
Similar to Clean Architecture but emphasizes concentric circles with domain at the core and infrastructure at the outermost layer.
Use when: When you want a strong focus on domain model purity and dependency rules.
Summary
Clean Architecture separates software into layers with strict inward dependencies to isolate business logic.
This separation improves maintainability, testability, and flexibility to change UI or infrastructure independently.
It is best suited for medium to large systems with complex business rules and evolving requirements.

Practice

(1/5)
1. Which layer in Clean Architecture contains the core business rules and logic?
easy
A. UI layer
B. Entities layer
C. Database layer
D. Frameworks layer

Solution

  1. Step 1: Understand the role of each layer

    The Entities layer holds the core business rules and logic, independent of external concerns.
  2. Step 2: Identify the correct layer for business logic

    UI, Database, and Frameworks layers handle external interactions, not core logic.
  3. Final Answer:

    Entities layer -> Option B
  4. Quick Check:

    Business logic = Entities layer [OK]
Hint: Core logic always lives in the Entities layer [OK]
Common Mistakes:
  • Confusing UI layer with business logic
  • Thinking database layer contains core rules
  • Mixing frameworks with core logic
2. In Clean Architecture, which layer is responsible for adapting data from the database to the business logic?
easy
A. Entities layer
B. Use Cases (Interactor) layer
C. UI layer
D. Interface Adapters layer

Solution

  1. Step 1: Identify the role of Interface Adapters

    Interface Adapters convert data from external sources like databases into a form usable by inner layers.
  2. Step 2: Confirm other layers' roles

    Entities hold business rules, Use Cases orchestrate logic, UI handles presentation, so adapting data fits Interface Adapters.
  3. Final Answer:

    Interface Adapters layer -> Option D
  4. Quick Check:

    Data adaptation = Interface Adapters [OK]
Hint: Data conversion happens in Interface Adapters [OK]
Common Mistakes:
  • Choosing Entities layer for data adaptation
  • Confusing Use Cases with data conversion
  • Selecting UI layer for database data handling
3. Given the following flow in Clean Architecture: UI calls Use Cases, which then call Entities. What is the correct order of dependency direction?
medium
A. UI -> Entities -> Use Cases
B. Entities -> Use Cases -> UI
C. UI -> Use Cases -> Entities
D. Use Cases -> UI -> Entities

Solution

  1. Step 1: Understand dependency rule in Clean Architecture

    Dependencies always point inward, from outer layers to inner layers.
  2. Step 2: Apply to given flow

    UI depends on Use Cases, which depend on Entities, so direction is UI -> Use Cases -> Entities.
  3. Final Answer:

    UI -> Use Cases -> Entities -> Option C
  4. Quick Check:

    Dependency direction = UI to Entities [OK]
Hint: Dependencies always point inward [OK]
Common Mistakes:
  • Reversing dependency direction
  • Confusing which layer calls which
  • Assuming Entities depend on UI
4. A developer placed database access code directly inside the Entities layer. What is the main problem with this design?
medium
A. Entities layer should not depend on external frameworks or databases
B. Entities layer must handle UI rendering
C. Database code belongs only in the UI layer
D. Entities layer should only contain database schemas

Solution

  1. Step 1: Recall Clean Architecture dependency rules

    Inner layers like Entities must be independent of external concerns like databases.
  2. Step 2: Identify why database code in Entities is wrong

    It creates tight coupling and breaks separation of concerns.
  3. Final Answer:

    Entities layer should not depend on external frameworks or databases -> Option A
  4. Quick Check:

    Entities layer independence = true [OK]
Hint: Keep Entities free from external dependencies [OK]
Common Mistakes:
  • Thinking Entities handle UI
  • Placing database code in UI layer
  • Confusing database schemas with business logic
5. You need to design a system where the UI can be changed without affecting business rules, and the database can be swapped easily. Which Clean Architecture principle helps achieve this?
hard
A. Dependency Rule: Inner layers do not depend on outer layers
B. UI layer directly accesses Entities for faster updates
C. Database layer contains business logic for flexibility
D. Use Cases layer handles UI rendering and database access

Solution

  1. Step 1: Identify the principle for independence

    The Dependency Rule states inner layers (business rules) do not depend on outer layers (UI, database).
  2. Step 2: Explain how this helps system flexibility

    This separation allows changing UI or database without impacting core business logic.
  3. Final Answer:

    Dependency Rule: Inner layers do not depend on outer layers -> Option A
  4. Quick Check:

    Dependency Rule ensures flexibility [OK]
Hint: Inner layers must be independent for easy changes [OK]
Common Mistakes:
  • Allowing UI to access Entities directly
  • Putting business logic in database layer
  • Mixing UI rendering with Use Cases