Я создаю класс Map Tile сервера с функцией get_tile(tilekey)
которая должна сделать следующее:Устранение повторного кода (DRY принцип) в этой цепочке функции кэширования ответственности
- Пытаться извлечь изображение из ин - словарь памяти (быстрее);
- Если нет, попробуйте извлечь изображение с диска;
- Если нет, попробуйте загрузить изображение из Интернета;
Но, поскольку я могу вызвать одно и то же изображение вскоре после этого, я должен также заполнить более быстрые уровни кеша, когда мне придется использовать более медленный, и это вызывает повторяющийся код. Ниже 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#), поэтому это скорее вопрос дизайна, чем вопрос, зависящий от конкретной проблемы.
И Оскаром награждается ... Большое спасибо! Теперь это настолько очевидно, что записано ... – heltonbiker
@heltonbiker :) Я большой поклонник принципа KISS – dratewka