可以使这个代码变小吗?

时间:2009-12-31 12:32:36

标签: php caching methods

我有两个方法

private function cacheAdd($id,$data)
{
   $this->minicache->set($id,$data);
}

private function cacheGet($id)
{
   return $this->minicache->get($id);
}

每次如果我想检查项目是否被缓存,我必须做类似的事情:

public function getFriendIds()
  {

 $info = $this->cache->minicache->getInfo("getFriendIds"); // if its an array then it is cached
    if(is_array($info))
    {
      return $this->cache->cacheGet("getFriendIds"); // return the cached object
    }
     // from here items wasnt cached
    else
    {
      $this->cache->cacheAdd("getFriendIds",$this->twitter->getFriendIds());  // so add to cache
      return $this->cache->cacheGet("getFriendIds"); // and return the cached items
    }
  }

但我认为有一种简单的方法可以做到这一点吗?

我想到这样的事情:

$this->cache->docache($this->myitems());

方法docache只接受方法并将methodname转换为字符串并检查项目是否已经缓存?如何才能完成?

编辑:

我实现了这个docache方法

   public function docache($id,$data)
    {
      $info = $this->minicache->getInfo($id);

      if(is_array($info))
      {
      return $this->cache->cacheGet($id); // return the cached object
      }

      else
      {
        $this->cacheAdd($id,$data);  // so add to cache
        return $this->cacheGet($id); // and return the cached items
      }

    }

如果我想调用方法,我就这样做。

  public function getFriendIds()
  {
      return $this->cache->docache("getFriendIds",$this->twitter->getFriendIds());
  }

不,这不是小得多吗?

3 个答案:

答案 0 :(得分:1)

我认为getFriendIds是所有类似模式的一系列方法之一,你想要做的就是让所有这些方法都长一行(左右)。在这种情况下,您可以将getFriendIds重构为您想要的方法:

protected function memoize($name, $callable, $args=array()) {
    $info = $this->cache->minicache->getInfo($name); // if its an array then it is cached
    if(is_array($info)) {
        return $this->cache->cacheGet($name); // return the cached object
    } else {
        $this->cache->cacheAdd($name, call_user_func_array($callable, $args));
        return $this->cache->cacheGet($name); // and return the cached items
    }
}

public function getFriendIds() {
    $this->memoize(__METHOD__, array($this->twitter, __FUNCTION__));
}

未经测试,因此可能存在一些问题。

答案 1 :(得分:1)

你也可以在这里保存几行。

public function docache($id,$data)
{
    $info = $this->minicache->getInfo($id);

    if(!is_array($info))
    {
        $this->cacheAdd($id,$data);  // so add to cache
    }

    return $this->cache->cacheGet($id); // return the cached object
}

答案 2 :(得分:1)

你可以通过这种方式缩小(和更快): 它只能防止存储$ info变量,所以它的速度要快一些。 ;) 代码要短得多:p

 public function docache($id,$data){
  if(!is_array($this->minicache->getInfo($id))) $this->cacheAdd($id,$data);  // add to cache if theres none
  return $this->cacheGet($id); // and return the cached items
}

编辑:哦,我们同时发布了相同的代码:p