2013-06-01 4 views
1

Я создаю класс Map Tile сервера с функцией get_tile(tilekey) которая должна сделать следующее:Устранение повторного кода (DRY принцип) в этой цепочке функции кэширования ответственности

  1. Пытаться извлечь изображение из ин - словарь памяти (быстрее);
  2. Если нет, попробуйте извлечь изображение с диска;
  3. Если нет, попробуйте загрузить изображение из Интернета;

Но, поскольку я могу вызвать одно и то же изображение вскоре после этого, я должен также заполнить более быстрые уровни кеша, когда мне придется использовать более медленный, и это вызывает повторяющийся код. Ниже Python-синтаксис в стиле псевдокод, что работает в настоящее время:

## WARNING: this is Pseudo-Code!! 

def get_tile(tilekey): 
    if tilekey in tiles.keys(): 
     tileimage = tiles[tilekey] 
    elif file.exists (tilekey + ".jpg"): 
     tiles[tilekey] = open_image_from_disk(tilekey + ".jpg") 
     tileimage = tiles[tilekey] 
    else: 
     download_image_to_disk(urltemplate + tilekey + ".jpg") 
     tiles[tilekey] = open_image_from_disk(tilekey + ".jpg") 
     tileimage = tiles[tilekey] 
    return tileimage 

У меня есть такого рода «пытаются сделать f1, если нет, то f2, f1, если нет, то f3, f2, f1 », и если бы это было глубже, тогда количество повторяющегося кода увеличилось бы геометрически. У меня сложилось впечатление, что какая-то умная комбинация некоторых трюков вроде try/except/finally или рекурсии/делегирования или какой-либо другой умной конструкции потока управления может сделать вещи чище.

В заключение я планирую реализовать это на нескольких языках (по крайней мере, на Python и C#), поэтому это скорее вопрос дизайна, чем вопрос, зависящий от конкретной проблемы.

ответ

1

Как об этом:

## WARNING: this is Pseudo-Code!! 

def get_tile(tilekey): 
    if !tilekey in tiles.keys():   
    if !file.exists (tilekey + ".jpg"): 
     download_image_to_disk(urltemplate + tilekey + ".jpg") 

    tiles[tilekey] = open_image_from_disk(tilekey + ".jpg") 

    return tiles[tilekey] 
+0

И Оскаром награждается ... Большое спасибо! Теперь это настолько очевидно, что записано ... – heltonbiker

+0

@heltonbiker :) Я большой поклонник принципа KISS – dratewka

Смежные вопросы