DEV Community

Roshan singh
Roshan singh

Posted on

LLD Design Process (From Requirements to Code)

LLD Design Process (From Requirements to Code)

Step 1: Understand Requirements

Before creating any class, understand what the system should do.

Ask:

  • What features are required?
  • What operations are supported?
  • What are the future extensions?

Example: Document Editor

Requirements:

  1. Add Text
  2. Add Image
  3. Add New Line
  4. Add Tab Space
  5. Render Document
  6. Save Document

Never jump directly to classes.

First understand the problem.


Step 2: Extract Nouns → Classes

Nouns in requirements often become classes.

Example

Requirements:

  • Add Text
  • Add Image
  • Save Document

Nouns:

  • Document
  • Text
  • Image
  • Storage
  • Editor

Possible classes:

Document
TextElement
ImageElement
Storage
DocumentEditor
Enter fullscreen mode Exit fullscreen mode

Another Example (Parking Lot)

Requirements:

  • Park Vehicle
  • Generate Ticket
  • Multiple Floors

Nouns:

ParkingLot
Floor
Slot
Vehicle
Ticket
Enter fullscreen mode Exit fullscreen mode

These become candidate classes.


Step 3: Find IS-A Relationships → Inheritance

Ask:

"Can I say child IS-A parent?"

Example

TextElement IS-A DocumentElement
ImageElement IS-A DocumentElement
NewLineElement IS-A DocumentElement
TabSpaceElement IS-A DocumentElement
Enter fullscreen mode Exit fullscreen mode

Therefore:

                DocumentElement
                        ▲
                        |
       ----------------------------------
       |         |          |           |
 TextElement ImageElement NewLineElement TabSpaceElement
Enter fullscreen mode Exit fullscreen mode

Code

class DocumentElement {
public:
    virtual string render() = 0;
};
Enter fullscreen mode Exit fullscreen mode
class TextElement : public DocumentElement {};
class ImageElement : public DocumentElement {};
Enter fullscreen mode Exit fullscreen mode

Rule

Use inheritance only when:

Child IS-A Parent
Enter fullscreen mode Exit fullscreen mode

Examples:

Car IS-A Vehicle
Dog IS-A Animal
CreditCardPayment IS-A Payment
Enter fullscreen mode Exit fullscreen mode

Step 4: Find HAS-A Relationships → Composition/Aggregation

Ask:

"What objects are contained inside another object?"

Example

A document contains elements.

vector<DocumentElement*> documentElements;
Enter fullscreen mode Exit fullscreen mode

Meaning:

Document HAS-A collection of DocumentElements
Enter fullscreen mode Exit fullscreen mode

UML:

Document 1 -------- * DocumentElement
Enter fullscreen mode Exit fullscreen mode

Another Example

Parking Lot:

ParkingLot HAS-A Floors
Floor HAS-A Slots
Enter fullscreen mode Exit fullscreen mode

Rule

Use composition/aggregation when:

Parent HAS-A Child
Enter fullscreen mode Exit fullscreen mode

Examples:

Car HAS-A Engine
Document HAS-A Elements
ParkingLot HAS-A Floors
Enter fullscreen mode Exit fullscreen mode

Step 5: Identify Actions → Methods

Ask:

"What actions can objects perform?"

Example

Document Editor:

Add Text
Add Image
Render
Save
Enter fullscreen mode Exit fullscreen mode

Methods:

addText()
addImage()
render()
save()
Enter fullscreen mode Exit fullscreen mode

Parking Lot

Actions:

parkVehicle()
unparkVehicle()
generateTicket()
Enter fullscreen mode Exit fullscreen mode

Methods:

parkVehicle()
unparkVehicle()
Enter fullscreen mode Exit fullscreen mode

Rule

Verbs become methods.

Nouns → Classes
Verbs → Methods
Enter fullscreen mode Exit fullscreen mode

Step 6: Find Variations → Interfaces / Abstract Classes

Ask:

"What can change in the future?"

Example

Saving document:

File
Database
Cloud
Enter fullscreen mode Exit fullscreen mode

These are different implementations.

Create abstraction:

             Persistence
                   ▲
                   |
         --------------------
         |                  |
   FileStorage        DBStorage
Enter fullscreen mode Exit fullscreen mode

Code:

class Persistence {
public:
    virtual void save(string data) = 0;
};
Enter fullscreen mode Exit fullscreen mode

Why?

Tomorrow we can add:

class CloudStorage : public Persistence {};
Enter fullscreen mode Exit fullscreen mode

without changing existing code.

Rule

When multiple implementations exist:

Create Interface / Abstract Class
Enter fullscreen mode Exit fullscreen mode

Examples:

Payment
 ├─ UPI
 ├─ Card
 └─ Cash

Storage
 ├─ File
 ├─ DB
 └─ Cloud
Enter fullscreen mode Exit fullscreen mode

Step 7: Draw UML

After identifying:

  • Classes
  • Methods
  • Inheritance
  • Composition

Draw UML.

Example

Document
    |
    | contains
    v
DocumentElement
      ▲
      |
-----------------------
|         |           |
Text    Image     NewLine
Enter fullscreen mode Exit fullscreen mode
Persistence
      ▲
      |
---------------
|             |
FileStorage DBStorage
Enter fullscreen mode Exit fullscreen mode

Step 8: Write Code

Convert UML to code.

Abstract Class

class DocumentElement {
public:
    virtual string render() = 0;
};
Enter fullscreen mode Exit fullscreen mode

Child Classes

class TextElement : public DocumentElement {};
class ImageElement : public DocumentElement {};
Enter fullscreen mode Exit fullscreen mode

Composition

class Document {
private:
    vector<DocumentElement*> elements;
};
Enter fullscreen mode Exit fullscreen mode

Dependency Injection

class DocumentEditor {
private:
    Persistence* storage;
};
Enter fullscreen mode Exit fullscreen mode

Interview Thinking Framework

Whenever interviewer gives a problem:

Requirements
      ↓
Nouns
      ↓
Classes
      ↓
IS-A
      ↓
Inheritance
      ↓
HAS-A
      ↓
Composition
      ↓
Verbs
      ↓
Methods
      ↓
Variations
      ↓
Interfaces
      ↓
UML
      ↓
Code
Enter fullscreen mode Exit fullscreen mode

Quick Cheat Sheet

Noun → Class

Vehicle
Ticket
Document
User
Payment
Enter fullscreen mode Exit fullscreen mode

Verb → Method

park()
save()
render()
pay()
login()
Enter fullscreen mode Exit fullscreen mode

IS-A → Inheritance

Car IS-A Vehicle
ImageElement IS-A DocumentElement
Enter fullscreen mode Exit fullscreen mode

HAS-A → Composition

Car HAS-A Engine
Document HAS-A Elements
Enter fullscreen mode Exit fullscreen mode

Future Variations → Interface

Payment
Storage
Notification
Logger
Enter fullscreen mode Exit fullscreen mode

Final Flow:

Requirements
   ↓
Classes
   ↓
Inheritance
   ↓
Composition
   ↓
Methods
   ↓
Interfaces
   ↓
UML
   ↓
Code
Enter fullscreen mode Exit fullscreen mode

Top comments (0)