關於緩衝的話題
來源:互聯網
上載者:User
當前狀況 有一個項目,大家都直接使用Yii::app()->memcache->get方法從緩衝中擷取資料。咋一看,好像沒有什麼不妥。但是隨著項目的擴大,流程越來越複雜,緩衝內容的增多,這個方法所帶來的隱患就越發明顯了。每一次的改版或資料變動,都需要尋找一大片的代碼進行修改(有可能還會有隱式的組裝調用)。哪怕漏掉了一個地方沒有更正過來都會造成系統的BUG,甚至是找不到根源的未知錯誤。 面對以上問題,我說說我的改進方案。以下的改進方法僅代表我的個人看法,如果有更好的方法,歡迎大家一起討論。 最佳化改進 電腦界有句老話,大意是:只要再多添一層間接,電腦科學中就沒有解決不了的問題(引用自《Object-C基礎教程》第19頁)。我的處理方法就是增加一層,避免下層及協作開發人員直接接觸到資料。為避免緩衝過多容易造成混亂,我們需要對緩衝進行歸類封裝。以網店的緩衝為例: [php] class EShopCache{ private $_cacheKey = array(‘userName’,’shopTitle’,’isValPro’,’isValShop’); private $_cache = array(); public function __get($key) { if ( array_in($key, $this->_cacheKey) ){ if ( !array_key_exixts($key, $this->_cache) ) { $this->_cache[$key] = Yii::app()->memcache->get($key); } return $this->_cache[$key]; } return false; } } 這樣改進之後,不但使用方法更簡單,而且更具語義化。[php] $eshopCache = new EShopCache; echo $ eshopCache ->username; if ( $ eshopCache ->isValShop == 1 ) { echo ‘網店已經進行實體認證’; } 如果需求有變更需要對資料費進行修改,我們只需要對這個類進行修改,不需要對下一層的每一個介面進行修改,也不用擔心忘了修改下層的封裝及隱蔽調用。 持續改進 還有一個問題,如果需求再變化。網店要顯示的是使用者自訂的暱稱(nickName),而不再是使用者名稱(userName),難道我們只能翻遍檔案修改了嗎?改進方案如下: [php] class EShopCache{ private $_cacheKey = array(‘userName’,’shopTitle’,’isValPro’,’isValShop’); private $_aliaeses = array(‘userName’=>’nickName’); private $_cache = array(); public function __get($key) { if ( array_in($key, $this->_cacheKey) ){ if ( !array_key_exixts($key, $this->_cache) ) { $_key = array_key_exists($key, $this->_aliases)? $this->_aliases[$key] : $key; $this->_cache[$key] = Yii::app()->memcache->get($_key); } return $this->_cache[$key]; } return false; } } 到此,這個類的功能已經可以滿足我們使用。我提供的方案就是使用設計模式中的“代理模式”來間接地訪問快取資料。如果有什麼異議,歡迎大家發郵件到yagas@sina.com 共同討論。