現状
全員が Yii::app()->memcache->get メソッドを直接使用してキャッシュからデータを取得するプロジェクトがあります。一見すると何の問題もないように見えます。しかし、プロジェクトが拡大し、プロセスがますます複雑になり、キャッシュの内容が増加するにつれて、この方法によって引き起こされる隠れた危険性がますます明らかになります。すべてのリビジョンまたはデータ変更では、大規模なコードを見つけて変更する必要があります (暗黙的なアセンブリ呼び出しが行われる場合もあります)。たとえ 1 か所でもミスがあり、修正されていないと、システムのバグが発生したり、根本原因が見つからない不明なエラーが発生したりすることがあります。
上記の問題に直面して、私の改善計画について話させてください。以下の改善方法は私の個人的な見解を示したものであり、より良い方法があれば、ぜひ議論してください。
最適化と改善
コンピュータ業界には、間接演算の層がもう 1 つ追加されている限り、コンピュータ サイエンスでは解決できない問題はないという古い格言があります (「Object-C 基本チュートリアル」の 19 ページから引用) 。私のアプローチは、下位レベルの開発者や共同開発者がデータに直接アクセスできないようにするレイヤーを追加することです。キャッシュが多すぎることによる混乱を避けるために、キャッシュを分類してカプセル化する必要があります。オンラインストアのキャッシュを例に挙げます:
[php]
クラス EShopCache{
private $_cacheKey = array('userName','shopTitle','isValPro','isValShop');
プライベート $_cache = array();
パブリック関数 __get($key) {
if ( array_in($key, $this->_cacheKey) ){
if ( !array_key_exixts($key, $this->_cache) ) {
$this->_cache[$key] = Yii::app()->memcache->get($key);
} }
$this->_cache[$key] を返す
}
false を返します
}
}
この改善により、使いやすくなっただけでなく、セマンティックも強化されました。
[php]
$eshopCache = 新しい EShopCache
echo $ eshopCache -> ユーザー名
if ( $ eshopCache ->isValShop == 1 ) {
エコー「オンラインストアは物理的な認証を受けています」
}
要件が変更され、データ料金を変更する必要がある場合、このクラスを変更するだけで済みます。次の層のすべてのインターフェイスを変更する必要はなく、変更を忘れることを心配する必要はありません。カプセル化と下位層の隠し呼び出し。
継続的な改善
ニーズが再び変化した場合、別の質問があります。オンライン ストアが表示したいのは、ユーザー名 (userName) ではなく、ユーザー定義のニックネーム (nickName) です。ファイルを調べて変更するだけでよいでしょうか。改善計画は以下の通りです:
[php]
クラス EShopCache{
private $_cacheKey = array('userName','shopTitle','isValPro','isValShop');
private $_aliases = array('userName'=>'nickName');プライベート $_cache = array();
パブリック関数 __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);} }
$this->_cache[$key] を返す
}
false を返します
}
}
この時点では、このクラスの関数は十分に使用できます。私が提供する解決策は、デザイン パターンで「プロキシ パターン」を使用して、キャッシュされたデータに間接的にアクセスすることです。異議がある場合は、議論のために yagas@sina.com に電子メールを送信してください。