缓存处理的逻辑一般是
if ( 缓存命中) {
返回缓存的内容
}else {
获取数据源 更新缓存的 key 返回数据源的值 }
但一沱一沱这样的代码到处写总觉得很难看,有没有优雅一点的写法?
cache[key] ||= fetch data
缓存可能是保存到文件,而且也有缓存时间判断
def my_cache(key) return cache[key] if modified?(key) yield end my_cache(key) do create_data end
#2 楼 @yakczh 同样重复的代码提出个方法咯,[] 和 []= 都可以重新定义的啊,存到哪里都没关系吧?
[]
[]=
cache.fetch(key) do # balabala end
考虑下 memoize 方法。 我曾在这篇博客中分析过,几乎大部分的缓存操作都可以转换成 memoize 函数(不过停步,这篇只讲了 PHP 中的情形作为科普,Ruby、Python 中由于太普遍常见了我就没分析):http://jex.im/programming/memoization-in-php.html
Ruby 和 Python 中实现我文中说的那种优雅的 memoization 可方便多了。PHP 要折腾很多。
有个 Gem:Memoist。 曾经 Rails 中也有个模块:ActiveSupport::Memoize, 不过后来他们好像更推荐||=的方法了:http://www.railway.at/articles/2008/09/20/a-guide-to-memoization/
Google 搜索下“Ruby memoization”可以得到更多惯例用法
这里可以使用元编程了。