在此责任链缓存功能中消除重复代码(DRY原则)

时间:2013-06-01 19:15:46

标签: language-agnostic dry

我正在创建一个Map Tile Server类,其函数get_tile(tilekey)应该执行以下操作:

  1. 尝试从内存字典中检索图像(更快);
  2. 如果不存在,请尝试从磁盘检索图像;
  3. 如果不存在,请尝试从互联网下载图像;
  4. 但是,因为我可能很快就会调用相同的图像,所以当我必须使用较慢的缓存层时,我还必须填充更快的缓存层,这就产生了重复的代码。下面是现在正在使用的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 个答案:

答案 0 :(得分: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]