def execute(self, user_data): user = User(user_data) # Entity self.repo.save(user) # Calls the interface, not the concrete DB
This is where , popularized by Robert C. Martin ("Uncle Bob") in his seminal book, comes to the rescue. arquitectura limpia robert c martin pdf
By drawing boundaries around your business logic and using Dependency Inversion, you stop writing "framework-dependent code" and start writing In the ever-evolving world of software development, one
# Use Case directly depends on a specific Database library (BAD) class RegisterUser: def execute(self, user_data): db = MySQLConnection() # Violates Dependency Rule db.save(user_data) You define an abstract interface inside the Use Case circle. user): pass class RegisterUser: def (self
In the ever-evolving world of software development, one painful truth remains constant: change is inevitable. Requirements shift, frameworks become obsolete, and user interfaces get redesigned. Yet, the core business logic of your application—the "soul" of your software—should remain untouched.
# 1. Inner Circle (Use Case Layer) class UserRepositoryInterface(ABC): # Defined HERE, not in the DB layer @abstractmethod def save(self, user): pass class RegisterUser: def (self, repo: UserRepositoryInterface): # Dependency Injection self.repo = repo