2011-09-06 4 views
1

내 ZF 프로젝트에는 Zend_Registry에 저장된 큰 배열을 처리해야하는 모델이 있습니다. 배열은 데이터베이스가 아닌 캐시에서 레지스트리로 가져옵니다. 모델의 여러 메소드는 요청하는 동안 배열을 여러 번 사용할 수 있습니다. 내가해야하는 경우 마음 모범 사례와 최적화 된 성능을에 데, 나는 확실하지 않다 :메소드에서 사용하기 위해 모델에 데이터를 유지해야합니까?

  • 그위한 전용 속성을 적용하고 바로 레지스트리에서 배열 각 시간을 얻을 캐시
  • 의 어떤 종류를 사용합니다. 전용 재산의

예 :

class Application_Model_Category { 

    ... 
    public function methodOne() { 
     foreach (Zend_Registry::get('tree') as $category) { 
      ... 
     } 
    } 
    public function methodTwo() { 
     $tree = Zend_Registry::get('tree'); 
     foreach ($tree as $category) { 
      ... 
      $count = count($tree); 
     } 
    } 
    ... 
} 

이 방법은 모든 (메모리, CPU 사용량 등)에 차이가 있습니까 : 레지스트리에서 때마다 점점

class Application_Model_Category { 

    private $_tree = null; 
    ... 
    public function _getTree() { 
     if (!$this->_tree) { 
      $this->_tree = Zend_Registry::get('tree'); 
     } 
     return $this->_tree; 
    ... 
    public function methodOne() { 
     foreach ($this->_getTree() as $category) { 
      ... 
     } 
    } 
    public function methodTwo() { 
     $tree = $this->_getTree(); 
     foreach ($tree as $category) { 
      ... 
      $count = count($tree); 
     } 
    } 
    ... 
} 

예? 또는 첫 번째 방법이 조금 더 멋지게 보이십니까?

답변

2

나는 확실히 첫 번째 것이 될 것이다. 필요한 경우 나중에 변경하는 것이 훨씬 쉬우 며 데이터 가져 오기가 더 잘 캡슐화됩니다. (정말 그 문장에, 두 번째 것은 첫 번째의 원인이됩니다.)

이것에 대해 생각 :

만약에 나중에 수 있도록 생성자에 인수를 전달 할 수 있도록하려면 도로 아래로 레지스트리에서 가져 오는 동작을 재정의합니까? 첫 번째 방법을 사용하는 경우 한 곳에서 코드를 변경하면됩니다.

또한 첫 번째 옵션으로 클래스를 확장하면 하위 클래스는 getTree의 작동에 대한 지식이 필요하지 않습니다. 두 번째 방법으로 레지스트리에 의존하게됩니다.

기본적으로 첫 번째 방법은 커플 링을 약간 줄입니다.

+0

질문을 끝내면 첫 번째 방법을 사용하는 것이 거의 분명해졌습니다. 하지만 당신은 견고한 이유를주었습니다, 고마워요! – yentsun

1

글쎄, 분명히 첫 번째 방법은 거의 무시할 정도로 처리 속도가 느려지지만 모든 기능에 따라 다르므로 생성하려고합니다. 첫 번째 방법은 처리를 계속하기 위해 _tree 변수가 존재하도록 보장하고, 두 번째 방법은 예외를 발생시킬 가능성이 높기 때문에 변수를 처리하지 않습니다. 나는 2 차보다는 1 차 방법을 추천 할 것이다.

2

내가 어떤 성능 문제가 어떤 식 배열이 실제로 그냥 ,을 복사을 참조하지 않기 때문에 다른이 있다고 생각하지 않는다.

그러나 명확성과 테스트를 위해이 트리에 공용 getter/setter를 추가 할 것입니다. 당신의 getter는 당신이하고있는 것처럼 Zend_Registry에서 느슨하게로드 할 수 있습니다. 그러나 공용 설정자가 의존성을보다 명확하게 반영하고 모의 나무로 테스트 할 수 있도록 허용하십시오.

관련 문제