2010-03-01 2 views
3

저는 (php를 사용하는) 클래스 개발에 관한 기사를 많이 읽었습니다. 태그 라인은 이고 '확장 가능하고 강력하며 유지 보수가 가능하고 확장 가능합니다.'"진정한 확장 성"클래스를 만드는 방법

초심자로서, 저는 제 말대로 "추상적 인"클래스를 만들어 왔습니다. 의미 나는 방금 반복적 인 코드를 분리하여 클래스에 넣고 공통 작업에 액세스하는 방법을 제공합니다.

문제는 클래스를 확장 가능하게 만드는 방법을 찾을 수 없다는 것입니다. (나는 추상적 클래스의 개념을 알고 있습니다. 나는 그것들을 사용하고 있습니다 만, 다른 클래스가 따르는 메소드를 정의하는 것입니다). 문제는, 난 항상 자신이 핵심 클래스를 수정하는 것만으로 기능성을 추가하는 것입니다..

내 수업을 확장 가능하게 만드는 데 유용한 정보가 있습니까? (나는 이것에 대한 봤어 모든 팝 아웃 추상 클래스, 인터페이스 및 OOP, 포인터 또는 확장 가능한 클래스를 만들기위한 몇 가지 팁에 대한 토론)에 대한 설명입니다.

Oh, btw, 나에게 쉽게 간다. 나는 9 개월 전 "실제"oop 프로그래밍을 시작했다. (나는 OOP에 대한 이론을 쓰고 있었지만, 우리는 프로페셔널하게 작업했다. 그것은 프로젝트 마감일을 지키고, 졸업하기 전까지 4 년간 지속되었습니다.)

class A { 
public function filter_string($str){ 
    return str_replace ('foo', 'bar', $str); 
} 
} 

class B extends A { 
public function filter_string($str){ 
    return str_replace ('machin', 'chose', parent::filter_string ($str)); 
} 
} 

$a = new A; 
echo $a->filter_string('foo machin'); // echoes 'bar machin' 

$b = new B; 
echo $b->filter_string('foo machin'); // echoes 'bar chose' 

답변

1

발견 한 것처럼 확장 가능한 클래스를 만드는 것은 시스템을 유용하고 재사용 가능한 객체로 분해합니다.

캡슐화, 세분성, 종속성, 유연성, 성능, 진화, 재사용 가능성 등 여러 가지 요소가 작용하기 때문에 작업이 어려워집니다.

실제 시나리오를 모델링하려고합니까, 아니면 커뮤니케이션/공동 작업과 응용 프로그램 내부의 종속성에 중점을 둡니까?

내가보기에 당신이 찾고있는 것을 보여주는 예가 나와 있습니다. 확실히 훨씬 더 좋은 예제가 있습니다.

무언가를 어디에서 캐싱했는지에 상관없이 내 개발자에게 간단하고 표준화 된 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')를 얻고 난 항상 결과를 얻을 수 있습니다.

마찬가지로, 현재 작업하고있는 기능에만 액세스 할 수 있습니다.

관련 문제