次のことを行う関数を使用して、Map Tile Server クラスを作成しget_tile(tilekey)
ています。
- メモリ内ディクショナリからイメージを取得してみてください (高速)。
- 存在しない場合は、ディスクからイメージを取得してみてください。
- 存在しない場合は、インターネットから画像をダウンロードしてみてください。
しかし、後で同じイメージを呼び出す可能性があるため、低速のキャッシュ レイヤーを使用する必要がある場合は、高速のキャッシュ レイヤーも埋める必要があり、これにより繰り返しコードが生成されます。以下は、現在動作しているものの 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#) で実装する予定であるため、問題固有の言語に依存する質問というよりも、デザイン パターンに関する質問です。