발견 한 것처럼 확장 가능한 클래스를 만드는 것은 시스템을 유용하고 재사용 가능한 객체로 분해합니다.
캡슐화, 세분성, 종속성, 유연성, 성능, 진화, 재사용 가능성 등 여러 가지 요소가 작용하기 때문에 작업이 어려워집니다.
실제 시나리오를 모델링하려고합니까, 아니면 커뮤니케이션/공동 작업과 응용 프로그램 내부의 종속성에 중점을 둡니까?
내가보기에 당신이 찾고있는 것을 보여주는 예가 나와 있습니다. 확실히 훨씬 더 좋은 예제가 있습니다.
무언가를 어디에서 캐싱했는지에 상관없이 내 개발자에게 간단하고 표준화 된 API를 제공하는 캐싱 시스템을 개발하고자했습니다. 기본 수준의 캐싱 시스템에서 원하는 것은 무엇입니까?
- 은 뭔가 (세트) 내가 뭔가를 검색 할 수 있도록하려는
- 을 캐시 할 수 있도록하려는
- 내가
(삭제) 캐시를 무효화 할 수 있도록하려면 (수)
나는이 함께했다 :
abstract class MyNs_Cache
{
abstract public function Set($key, $data, $ttl);
abstract public function Get($key);
abstract public function Delete($key, $ttl);
}
내 확장 기본 클래스가있다.나는 다음 세 가지 캐싱 클래스 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 캐시 내가 캐싱 시스템에서 원하는 모든 것을 않습니다 (세트// 얻을 삭제)뿐만 아니라 (내 파일 시스템 캐시에 대한 유용하고 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) { ... }
}
지금 내가 항상 그냥 $를 OBJ와 내 캐시 개체 중 하나를 얻을 수 있다는 사실을 알고> ('some_key')를 얻고 난 항상 결과를 얻을 수 있습니다.
마찬가지로, 현재 작업하고있는 기능에만 액세스 할 수 있습니다.