2010-11-22 3 views
0

코드베이스는 MDB2에서 상속받은 databse 클래스의 기능과 함께 사용할 수 있습니다. 이것은 사용중인 MVC 프레임 워크의 기초를 형성하고 (커스텀 빌드 작업), 모델은 차례대로 db로부터 상속받습니다.상속 대신 캡슐화 할 클래스 수정

여러분 중 일부는 눈치 채 셨겠지만, 이것은 다소 큰 문제로 이어집니다. 모델을 인스턴스화 할 때마다 새 데이터베이스 연결이 작성됩니다. 이것은 분명히 낭비입니다. 또한 트랜잭션이 의도 한대로 사용할 수 없다는 것을 의미합니다. 트랜잭션이 모델의 한 인스턴스에서 시작되면 커밋이 발생할 때까지 그 인스턴스의 효과는 다른 인스턴스에서 보이지 않기 때문입니다.

내 계획은 db 클래스를 상속받는 대신 MDB2를 캡슐화 한 다음 싱글 톤 기능을 통해 MDB2의 단일 인스턴스를 유지하도록하는 것입니다.

그러나 MDB2는 많은 방법을 사용하는 큰 라이브러리이며 코드 기반에서 더 높은 부분은 MDB2 방법에 액세스 할 수 있는지에 달려 있습니다.

상위 계층을 수정하지 않고 MDB2 클래스를 캡슐화하고 호출을 전달하는 방법이 있습니까? MDB2의 모든 메서드에 대해 래퍼 메서드를 작성하지 않아도됩니까?

+0

예제 모델 클래스를 보여줄 수 있습니까? 그렇다면 이들이 결합 된 정도를 알 수 있습니까? – Gordon

답변

3

아직 코드를 제공하지 않았으므로 아주 적은 코드로 상속을 제거하는 방법과 동시에 모든 기능을 유지하면서 MDB 클래스가 한 번만 인스턴스화되도록하는 방법을 제안합니다.

class Db 
{ 
    protected static $_mdb; 
    public function __construct() 
    { 
     if(self::_mdb === NULL) { 
      self::_mdb = new MDB; 
     } 
    } 
    public function __call($method, $args) 
    { 
     return call_user_func_array(array(self::_mdb, $method), $args); 
    } 
} 

이것은 기본적으로 DB 클래스를 MDB의 데코레이터로 만듭니다. 첫 번째 인스턴스에서 DB 클래스는 MDB의 정적 인스턴스를 만들고 저장합니다. 이것은 하위 클래스를 포함하여 DB의 모든 인스턴스간에 공유됩니다. 여기에 싱글 톤을 사용할 이유가 없습니다.

__call 인터셉터는 MDB 메서드에서 메서드를 호출하는 DB에서 호출 한 메서드가 캐치되어 MDB 인스턴스에 위임되는지 확인합니다. 매직 메소드는 심각한 성능 영향을 미칠 수 있으므로 성능에 영향을 줄 때 DB 클래스에 호출 된 메소드를 추가하고 거기에서 위임하십시오.

DB 인스턴스가 여전히 모델 클래스와 밀접하게 연결되어 있기 때문에 이것은 여전히 ​​최상의 솔루션이 아닙니다. 더 많은 리팩토링을 감당할 수 있다면, 현재 DB에서 상속받은 모든 클래스를 대신 (ActiveRecords가 아니면) DB 인스턴스를 캡슐화하도록 제안합니다. 그런 다음 종속성 삽입을 사용하여 DB 인스턴스를 사용할 수있게 만듭니다.