Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """ STEP 0: original code --------------------------------------------------- """
- def get_cached_user(user_id=None, username=None):
- """
- Returns a user object either by their user_id or by their username.
- Hits the database if no cached version is available.
- """
- user = cache.get_user_by_id(user_id)
- if not user:
- user = cache.get_user_by_username(username)
- if not user:
- user = db.get_user_by_id(user_id)
- if not user:
- user = db.get_user_by_username(username)
- if not user:
- raise ValueError('User not found')
- cache.set_user(user)
- return user
- """ STEP 1: group responsabilities -------------------------------------------- """
- def get_cached_user(user_id=None, username=None):
- """
- Returns a user object either by their user_id or by their username.
- Hits the database if no cached version is available.
- """
- user = cache.get_user_by_id(user_id) or cache.get_user_by_username(username)
- if not user:
- user = db.get_user_by_id(user_id) or db.get_user_by_username(username)
- if not user:
- raise ValueError('User not found')
- cache.set_user(user)
- return user
- """ STEP 2: move responsabilities to independent objects ----------------------- """
- def get_cached_user(user_id=None, username=None):
- """
- Returns a user object either by their user_id or by their username.
- Hits the database if no cached version is available.
- """
- return cache.get_user(user_id, username)
- class cache:
- def get_user(user_id, username):
- user = get_user_from_cache(user_id, username)
- if not user:
- user = database.get_user(user_id, username)
- cache.set_user(user)
- return user
- def get_user_from_cache(user_id, username):
- return get_user_by_id(user_id) or get_user_by_username(username)
- class database:
- def get_user(user_id, username):
- user = get_user_by_id(user_id) or db.get_user_by_username(username)
- if not user:
- raise ValueError('User not found')
- """ STEP 3: generalize conditions --------------------------------------------- """
- def get_cached_user(user_id=None, username=None):
- """
- Returns a user object either by their user_id or by their username.
- Hits the database if no cached version is available.
- """
- return get_cached_user_v2({"user_id" : user_id, "username" : username})
- def get_cached_user_v2(conditions):
- """
- Require a dictionary with the conditions to match (all!)
- and returns a user object. Es: {"user_id" : "1234"} or
- {"username" : "login", "password" : "1234"}
- Hits the database if no cached version is available.
- """
- return cache.get_user(conditions)
- class cache:
- def get_user(conditions):
- user = get_user_from_cache(conditions)
- if not user:
- user = database.get_user(conditions)
- cache.set_user(user)
- return user
- def get_user_from_cache(conditions):
- """ some come to dynamically adapt query througt conditions"""
- class database:
- def get_user(user_id, username):
- user = """ some come to dynamically adapt query througt conditions"""
- if not user:
- raise ValueError('User not found')
- """ What I like about this result is the extraction of the 'Repository' interface
- that lets us define a generic kind of recursive cache/db.
- Whenever the dynamic conditions parsing it's not the best, OO speacking, it seems
- a pragmatic and fast solution. """
Add Comment
Please, Sign In to add comment