LLD stands for low-level design and the goal here is to code different components of a system. Specifically, the idea here is to design classes, their members and the interaction among them. The prime focus while doing this is to take care of following principles -
- Correctness
- Readability
- Extensibility
- Inheritance
- Polymorphism
2.1 Compile-time (Function Overloading)
2.2 Runtime or dynamic (Function Overriding) - Encapsulation
- Abstraction
- Association, Aggregation and Composition
- Class diagram (Structural UML)
- Sequence, usecase, activity diagrams (Behavioral UML)
- https://en.wikipedia.org/wiki/SOLID
- https://www.youtube.com/watch?v=HoA6aZPR5K0
- https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/
- Separation of concerns - https://en.wikipedia.org/wiki/Separation_of_concerns (Microservices as an example)
https://en.wikipedia.org/wiki/Software_design_pattern
Types
- Creational - Singleton, Factory, Prototype, Builder
- Structural - Facade, Adaptor, Decorator, Proxy
- Behavioural - Observer, Strategy, Iterator, Chain of responsibility
- Design logger
- Design slf4j
- Design a rate-limiter
- Design a cache
- Design publisher subscriber
- Design producer consumer
- Design a tic-tac-toe https://www.youtube.com/watch?v=gktZsX9Z8Kw
- Design a parking lot
- Design an elevator https://github.com/eMahtab/design-an-elevator-system
- Design a chess game
- Spring Boot Component, Service, Repository, Controller
- Refactoring by Martin Fowler https://github.com/HugoMatilla/Refactoring-Summary
- Facade, Adaptor, Decorator, Proxy