Problem Statement
When different parts of a program handle multiple responsibilities mixed together, it becomes hard to understand, maintain, and update. Changes in one part can unexpectedly break others, causing bugs and slowing development.
┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ User Interface│────▶│ Business Logic│────▶│ Data Access │ └───────────────┘ └───────────────┘ └───────────────┘
This diagram shows three separate layers: User Interface, Business Logic, and Data Access, each focusing on a specific concern.
### Before: No separation of concerns class OrderProcessor: def process_order(self, order): print(f"Validating order {order}") # validation logic print(f"Charging payment for {order}") # payment logic print(f"Saving order {order} to database") # database logic ### After: Separation of concerns class OrderValidator: def validate(self, order): print(f"Validating order {order}") # validation logic class PaymentProcessor: def charge(self, order): print(f"Charging payment for {order}") # payment logic class OrderRepository: def save(self, order): print(f"Saving order {order} to database") # database logic class OrderProcessor: def __init__(self): self.validator = OrderValidator() self.payment = PaymentProcessor() self.repository = OrderRepository() def process_order(self, order): self.validator.validate(order) self.payment.charge(order) self.repository.save(order)
separation of concerns in system design?class DataFetcher:
def fetch(self):
return "data"
class Processor:
def process(self, data):
return data.upper()
class UI:
def display(self, processed_data):
print(processed_data)
fetcher = DataFetcher()
data = fetcher.fetch()
processor = Processor()
processed = processor.process(data)
ui = UI()
ui.display(processed)Pass the test and this pattern moves unknown