2015-05-28 2 views
0

У меня есть эти три функции, и я нахожу это уродливым, чтобы повторить все тот же код, это вовсе не СУХОЙ. В то же время, я не уверен, как я могу реорганизовать эти функции, чтобы сохранять четкое выражение. Не могли бы вы порекомендовать что-нибудь?Дизайн шаблона для рефакторинга

Благодаря

def download_loc(instance, filename): 
    username = instance.username_or_anonymous() 
    slug = instance.slug 
    filename_with_timestamp = filename_timestamped(instance, filename) 
    return "%s/%s/stl/%s" % (username, slug, filename_with_timestamp) 

def preview_loc(instance, filename): 
    username = instance.username_or_anonymous() 
    slug = instance.slug 
    filename_with_timestamp = filename_timestamped(instance, filename) 
    return "%s/%s/preview/%s" % (username, slug, filename_with_timestamp) 

def screenshot_loc(instance, filename): 
    username = instance.username_or_anonymous() 
    slug = instance.slug 
    filename_with_timestamp = filename_timestamped(instance, filename) 
    return "%s/%s/screenshot/%s" % (username, slug, filename_with_timestamp) 
+3

вы делаете тип (СТЛ, предварительный просмотр и скриншот) другой параметр и есть одна функция – Leon

+1

Посмотрите на то, что это то же самое, посмотрите на то, что по-другому, инкапсулировать каждый. –

ответ

4

Введем третью функцию, которая принимает имя типа в качестве параметра. Лично я бы просто назвал эту функцию, но если она вызывается из большого количества мест, это имеет значение для ее обертывания.

def loc(instance, filename, typename): 
    username = instance.username_or_anonymous() 
    slug = instance.slug 
    filename_with_timestamp = filename_timestamped(instance, filename) 
    return "{}/{}/{}/{}".format(username, slug, typename, filename_with_timestamp) 

def download_loc(instance, filename): 
    return loc(instance, filename, "stl") 

def preview_loc(instance, filename): 
    return loc(instance, filename, "preview") 

def screenshot_loc(instance, filename): 
    return loc(instance, filename, "screenshot") 
+1

Обратите внимание, что оператор '%' устарел в пользу 'str.format'. – That1Guy

+1

Спасибо @ That1Guy, я обновил ответ – Leon