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.
This diagram shows the four main layers of Clean Architecture with arrows pointing inward, indicating dependencies flow from outer layers to inner layers only.
### 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')