High-level modules should not depend on low-level modules — both should depend on abstractions.
# dirty — UserService is hardcoded to MySQLUserRepo
class MySQLUserRepo:
def __init__(self, db):
self.db = db
def find_by_id(self, user_id):
return self.db.get(user_id)
class UserService:
def __init__(self):
self.repo = MySQLUserRepo({}) # hardcoded!
def get_user(self, user_id):
return self.repo.find_by_id(user_id)Refactor `solve(db, user_id)`: instead of hardcoding the repo, create a simple in-memory repo from db (a plain dict) and look up user_id. The point: solve receives its data source — it doesn't instantiate one.
solve({'u1': {'id': 'u1', 'name': 'Alice'}}, 'u1') → {'id': 'u1', 'name': 'Alice'}
Sample tests