本をチェックする必要がありますデザインパターン: 再利用可能なオブジェクト指向ソフトウェアの要素
お気づきのように、拡張可能なクラスを作成する際の問題は、システムを有用で再利用可能なオブジェクトに分解することです。
カプセル化、粒度、依存性、柔軟性、パフォーマンス、進化、再利用性など、多くの要因が関係するため、この作業は困難です。
現実世界のシナリオをモデル化しようとしていますか?それとも、アプリケーション内のコミュニケーション/コラボレーションと依存関係に焦点を当てていますか?
これは、あなたが探しているものをちょっと示していると思う例です。確かに、はるかに優れた例があります。
私は、開発者が何をどこにキャッシュしていても、シンプルで正規化された API を開発者に提供するキャッシュ システムを開発したいと考えていました。(基本レベルで) キャッシング システムに何が必要ですか?
- 何かをキャッシュできるようにしたい (set)
- その何かを取り出せるようになりたい (get)
- キャッシュを無効化(削除)できるようにしたい
私はこれを思いついた:
abstract class MyNs_Cache
{
abstract public function Set($key, $data, $ttl);
abstract public function Get($key);
abstract public function Delete($key, $ttl);
}
私の拡張可能な基本クラスがあります。次に、3 つのキャッシング クラスを取得MyNs_Cache_FsしMyNs_Cache_Apcました。MyNs_Cache_Memcache
class MyNs_Cache_Fs
{
...
public function Set($key, $data, $ttl)
{
// here I use fopen/fwrite/etc. to create the cached data
}
public function Get($key)
{
// here I retrieve the file from the filesystem (if it exists)
}
public function Delete($key) { ... }
}
それはかなり簡単です。FileSystem の観点からキャッシュを実装します。私の元のクラスを超えて何も提供しません。
class MyNs_Cache_Apc
{
...
public function Set($key, $data, $ttl)
{
return apc_add($key, $data, $ttl); // NOT A FILESYSTEM CALL
}
public function Get($key) { ... } // you get the idea.
// This is specific to APC, so I add the functionality HERE
// NOT in my main Caching class.
public function PurgeCache()
{
return apc_clear_cache();
}
}
私の APC キャッシュは、キャッシュ システムで必要なすべての処理 (set/get/delete) を行いますが、キャッシュ全体をクリアする機能も提供します (これは、私のファイル システム キャッシュでは役に立たず、memcached では不可能です)。
class MyNs_Cache_Memcache
{
// Memcached needs a pool of servers. APC and filesystem don't.
private $servers = array(..);
// It also uses a memcached object.
private $conn;
public function __construct()
{
$this->conn = new Memcached;
foreach ($this->$servers as $server)
$this->AddServer($server);
}
... // we do all the standard stuff using memcached methods
// We also want to be able to manage our connection pool
public function AddServer($server)
{
$this->conn->addServer(...);
}
// And in some cases, we use inc/dec from memcached
// APC doesn't have this, and it makes little sense in a filesystem
public function Increment($key) { ... }
}
これで、キャッシュ オブジェクトの 1 つをいつでも取得でき、$obj->Get('some_key') を使用するだけで常に結果が得られることがわかりました。
同様に、現在作業しようとしているものに固有の機能にもアクセスできます。