2009-12-31 3 views
0

Je ces deux méthodesPosible pour rendre ce code plus petit?

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

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

Chaque fois que si je veux vérifier si les éléments i sont mis en cache dois faire quelque chose comme ça:

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 
    } 
    } 

Mais je pense qu'il ya une méthode simple faites-le bien?

Je pensais que quelque chose comme ceci:

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

et docache méthode prend juste la méthode et convertit la methodname à chaîne et vérifie si l'article est déjà mis en mémoire cache ou non Comment pourrait-il être fait?

EDIT:

Je mis en œuvre cette méthode de 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 
     } 

    } 

et si je veux appeler la méthode que je fais.

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

Non c'est beaucoup plus petit n'est-ce pas?

+1

Qu'est-ce qui vous inquiète? Il n'y a pas grand chose de la méthode 'docache' à améliorer en termes d'efficacité temporelle ou spatiale ou même de lisibilité. Quant à la simplification des choses, les relations de classe pourraient être un bon endroit pour se concentrer. Pourquoi y a-t-il un cache et une minicache? Pourquoi les méthodes de cache déléguer à minicache? Qu'est-ce que 'minicache-> getInfo' fait que' minicache-> get' ne le fait pas? Que renvoie 'minicache-> get' si' $ id' n'est pas dans le cache? – outis

+0

hmm ... vraiment de bonnes questions, minicache est une bibliothèque externe – streetparade

Répondre

1

Je le prends getFriendIds est l'une des nombreuses méthodes d'un modèle similaire, et ce que vous voulez faire est de les faire tous une ligne (ou plus). Dans ce cas, vous pourriez vous refactoring getFriendIds dans la méthode que vous désirez:

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__)); 
} 

Untested, donc il peut y avoir quelques problèmes.

+0

n'est pas exactement le docache que j'ai implémété ci-dessus? – streetparade

+0

Presque. 'docache' n'était pas dans votre question originale. La principale différence est que 'memoize' appelle la méthode paresseusement et seulement si sa valeur n'est pas mise en cache (notez le' call_user_func_array'), tandis que 'docache' vous oblige à toujours appeler la méthode (ce qui va à l'encontre des valeurs de cache). Les deux ont besoin d'un raffinement supplémentaire: ajouter '$ args' pour mettre en cache l'indexation. – outis

+0

REMARQUE: $ callable doit être array(); merci de passer une bonne journée – streetparade

1

Vous pouvez également enregistrer quelques lignes ici.

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 
} 
1

Vous pouvez faire un peu plus petit (et plus rapide) de cette façon: Il empêche que la variable $ info d'être stocké, il est donc un peu plus vite. ;) Et le code est beaucoup plus courte: 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 
} 

Edit: oh, nous avons affiché sur le même code en même temps: p

+0

semble propre merci – streetparade

Questions connexes