それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

メソッドの実行結果をキャッシュする。

最近WSHをさわれてません。JavaScript書きたい・・・
業務でプログラムをかくと睨まれるので、家に帰ってWebサーバメンテしながらPHP書くだけ。

CodeReposになげた、キャッシュコントローラを引き続きかいてる。

結果の変数をキャッシュするより

メソッドをキャッシュ対応に書き換えてしまうのも一つの手だとおもう。
IFが減って、コードがスッキリする。

時間かかる処理の結果をキャッシュする

<?php
//メソッドの結果をキャッシュするクラス
class Cached{
	public function call_func($methodname, $args){
		//todo ID generatorを使うように変更する。
		$str = $methodname.var_export($args,true);
		$id  = md5($str);
		$var = $this->load($id,$methodname);
		if($val){
			return $val;
		}else{
			$val = call_func($methodname, $args);
			$this->save($id,$methodname,$val);
			return $val;
		}
	}
	public function handler(){
		if($this->handler){
			return $this->$handler;
		}else{
			return $this->defaultHandler();
		}
	}
	public function defaultHandler(){
		$handler = new Cache_Handler();
		$handler->addResource(new Cache_Handler_Resource_File());
		return $handler;
	}
	public function setHandler($handler_obj){
		$this->$handler = $handler_obj;
	}
	protected function save($id,$methodname,$return_value){
		return $this->handler->setCache($id,$return_value,$methodname);
	}
	protected function load($id,$methodname){
		return $this->handler->getCache($id,$methodname);
	}

}
/////////TEST
$cached = new Cached();
$cached->call_func( "date" );

?>

file_get_conentsに使うと良いね。

たとえば、file_get_contents。PHPで多用される関数。
特にScapingやマッシュアップで使われる。file_get_contents("http://....")

これ、実行結果をキャッシュより、関数書き換えた方がスッキリ。
メンテも楽なんじゃないかな。

<?php
/////////file_get_contents の結果をキャッシュする
///メソッドの呼び出し自体を変える。
$cached = new Cached();
$cached->call_func( "file_get_contents", $agrgs );

?>

JavaScriptならもうちょっとSimpleに書けるのだろうが。
もし、PHPJavaScriptのように記述できたら、こういう事が出来そう。

var $__file_get_contents = file_get_contents;//本来のfile_get_contentsを退避
var $file_get_contents = function ($args){
  if(val = cached.get(args)){
      return val;
  }else{
   __file_get_contents ();
  }


}

こういう記述ができるよね。PHPJavaScriptのようには行かない。ArrayとFunctionのsyntaxSugarが無い。このことがちょっと不満。