2013-03-09 68 views
0

我目前正在嘗試使用PHP(Drupal)進行調查。 到目前爲止,我有這樣的:PHP類:我應該使用2個類還是1個?

class Survey{ 

    public $id; 
    public $uid; 
    public $rate; 
    public $reason; 
    public $complete; 
    public $opinion; 

    public function save(){ 
    drupal_write_record('survey', $this); 
    } 
} 

這是偉大的,我可以創建調查的一個新實例,設置屬性,並調用保存就可以了。

但是,我也希望能夠有方法從數據庫檢索這些調查的結果並對它們採取行動,給我不同的數字。在類Survey中使用這些方法並不合適,因爲它們實際上是多個調查。但是它們是相關的,並且可能還會返回Survey的實例,因此不確定它們是否應該是完全獨立的類。這裏做的最好的事情是什麼?

順便說一句我不在乎它是否是Drupally的答案。

感謝, Amshad

+0

我認爲你需要改善你的問題標題。 – 2013-03-09 18:16:44

+0

是啊不知道該怎麼稱呼它,任何暗示? – Amshad 2013-03-09 18:58:40

+0

閱讀時(特別是來自搜索鏈接),您的問題必須反映技術(語言或平臺)。 – 2013-03-09 19:01:49

回答

0

正如任何事情,也有很多辦法用自己的優點和缺點。我的(當前)首選項是將類方法(靜態)和對象方法組合起來分別處理對象組和單個對象組。

考慮下面的代碼:

class Survey { 
    public $id; 
    public $uid; 
    public $rate; 
    public $reason; 
    public $complete; 
    public $opinion; 

    public function save() 
    { 
     drupal_write_record('survey', $this); 
    } 
    /** 
    * Loads survey from secondary storage 
    * 
    * @param string $id Unique surevy ID 
    */ 
    public function load($id) { 
     // loads a survey from secondary storage 
    } 
    /** 
    * Returns report of survey results. 
    * 
    * @param array $surveys array of surveys to process. If not passed or NULL, 
    *  The whole set of completed surveys will be processed. 
    * @return string HTML Formatted report 
    */ 
    public static function compile_results($surveys = NULL) 
    { 
     if(empty($surveys)) 
     { 
      $surveys = self::get_completed_results(); 
     } 
     foreach($surveys as &$survey) 
     { 
      // process an individual survey, possibly aggregating it 
     } 
    } 
    /** 
    * Retreives completed surveys from secondary storage. 
    * 
    * @return array Array of completed Survey objects 
    */ 
    public static function get_completed_surveys() 
    { 
     $surveys = array(); 
     // Select all surveys from secondary storage 
     $survey_rows = array(); //replace with code to get surveys 
     foreach($survey_rows as $survey_row) 
     { 
      $survey = new Survey(); 
      $survey['id']  = $survey_row['id']; 
      $survey['uid']  = $survey_row['uid']; 
      $survey['rate']  = $survey_row['rate']; 
      $survey['reason'] = $survey_row['reason']; 
      $survey['complete'] = $survey_row['complete']; 
      $survey['opinion'] = $survey_row['opinion']; 

      $surveys[] = $survey; 
     } 
     return $surveys; 
    } 
} 

您可以使用靜態方法與對象組的工作。你甚至可以有一個靜態數組來存放每個加載的調查的參考。

另一種選擇是有一個「調查」類,其目的是與調查組一起工作。以前的方法讓我感覺更清潔。

0

使用單個類來保存數據庫邏輯和業務邏輯都違反了Separation of Concerns原則。我將使用一個獨立的接口和類,例如SurveyRepository(接口)和DrupalSurveyRepository(使用Drupal DB層的接口的實現)來管理調查持久性(即讀取和寫入數據庫)。這樣可以簡化(單元)測試,因爲如果與某些依賴關係注入結合使用以提供模擬接口實現,則無需數據庫連接即可與測量相關的代碼。

對於Drupal 7+項目,我會考慮在Entity API module的幫助下將Survey作爲實體類型(請參閱https://drupal.org/node/1261744)。搜索調查然後可以使用EntityFieldQuery完成,而加載和保存可以使用現有的entity_load()entity_save()函數完成。

相關問題