2011-09-06 26 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

我不認爲有任何性能問題的一種方式或其他,因爲數組實際上沒有被複製,只是引用

但是,爲了清晰和測試,我會爲該樹添加公共獲取者/設置者。您的獲取者可以像您一樣從Zend_Registry延遲加載,但至少允許公共setter更清楚地反映依賴關係,並允許您使用模擬樹進行測試。

相關問題