2011-02-26 49 views
2

該方法需要搜索搜索關鍵字和解析的mysql查詢,並重寫where表達式以包含LIKE%關鍵字%。這個方法應該分解成單獨的方法嗎?

它運作良好,但我不知道它好或壞的做法有這麼多循環的方法...

private function build_where($query_array, $options) 
{ 
    //add WHERE starting point 
    $where = '';   

    if(!empty($query_array['WHERE'])) 
    { 
     //build where array 
     $where_array = $query_array['WHERE']; 

     //start the where 
     $where .= 'WHERE '; 

     //get columns array 
     $columns_array = $this->build_columns_array($query_array); 

     //if there is a search string   
     if(!empty($options['sSearch'])) 
     { 
      //check for enabled columns 
      $i = 0; 
      $columns_length = count($columns_array); 
      for($i; $i < intval($columns_length); $i++) 
      { 
       //create the options boolean array 
       $searchable_columns['bSearchable_'.$i] = $options['bSearchable_'.$i]; 
      } 

      //loop through searchable_columns for true values 
      foreach($searchable_columns as $searchable_column_key => $searchable_column_val) 
      { 
       if($searchable_column_val == true) 
       { 
        //get an integer from the searchable_column key 
        $column_id = preg_replace("/[^0-9]/", '', $searchable_column_key); 

        //lookup column name by index 
        foreach($columns_array as $columns_array_key => $columns_array_val) 
        { 
         //if the $columns_array_key matches the $column_id 
         if($columns_array_key == $column_id) 
         { 
          //loop to build where foreach base expression 
          $i = 0; 
          $where_length = count($where_array); 
          for($i; $i < intval($where_length); $i++) 
          { 
           //append the existing WHERE Expressions 
           $where .= $where_array[$i]['base_expr']; 
          }        

          //append the LIKE '%$options['sSearch'])%' 
          $where .= ' AND '.$columns_array_val." LIKE '%".$options['sSearch']."%' OR "; 
         } 
        } 
       } 
      } 
      //remove the last OR 
      $where = substr_replace($where, "", -3);          
     } 
     else 
     { 
      //loop to build where 
      $i = 0; 
      $where_length = count($where_array); 
      for($i; $i < intval($where_length); $i++) 
      { 
       $where .= $where_array[$i]['base_expr']; 
      } 
     }    
    } 

    //print_r($where_length); 
    return $where; 
} 

回答

2

分解方法主要不是重用。這樣做可以使代碼更易於閱讀,測試和維護。清除方法名稱也可以替代內聯註釋。此方法執行兩個高級別的事情:可以使用options和without選項構建where子句。對我來說,另一個暗示是,構建帶有選項的where子句的邏輯看起來足夠豐富,足以保證自己的方法。

private function build_where($query_array, $options) { 
    if(!empty($query_array['WHERE'])) { 
     $where_array = $query_array['WHERE']; 
     $columns_array = $this->build_columns_array($query_array); 
     if (empty($options['sSearch'])) { 
      return $this->build_where_with_options($where_array, $columns_array, $options); 
     } 
     else { 
      return $this->build_where_without_options($where_array, $columns_array); 
     } 
    } 
    else { 
     return ''; 
    } 
} 

現在,您可以快速掃描build_where()地看到,有三種可能的形式在where子句可以採取當與輸入每個表單需要產生的結果一起。

這裏有一些小的改進可以使整個代碼:

  • count()返回一個整數,而不需要在for環路intval()電話。即使你把它們留在那裏,最好在循環外部應用這個調用,因爲它每次只產生一次,因爲它每次產生相同的值。
  • if($searchable_column_val == true)相當於if($searchable_column_val),因爲它們都將$searchable_column_val轉換爲布爾值,而後者在轉換後的布爾值等於true時通過。
  • $where = substr_replace($where, "", -3)可以用$where = substr($where, 0, -3)代替,並且稍微清楚些。
  • 而不是循環查找特定鍵的數組,您可以通過簡單地使用該鍵獲取值來利用PHP的數組。

對於最後一個,這個代碼

foreach($columns_array as $columns_array_key => $columns_array_val) 
{ 
    //if the $columns_array_key matches the $column_id 
    if($columns_array_key == $column_id) 
    { ... } 
} 

可以通過這個

$columns_array_val = $columns_array[$column_id]; 
... 
+0

真棒反饋的人!謝謝! – Peter 2011-02-26 23:01:07

1

個人喜好真的。一些程序員會將這些分成幾個函數。就我個人而言,我認爲你擁有它的方式很好。如果我看到一些我認爲可以重用的東西,我會將它重構爲一個可以包含的單獨文件。

在我看來,有些程序員太快了,他們甚至沒有什麼可重用的東西,所以它們會讓事情變得「難以估量」。

+0

更換謝謝你的答覆。除了整個塊以外,在這個塊中沒有任何可重用的東西。 – Peter 2011-02-26 22:13:36

5

Kent Beck或Martin Fowler的思想學派實際上會建議您將這些大型方法重構爲許多小方法。在我看來,這並不容易理解,這將是重構的主要原因。

+0

感謝您的回覆和解釋。 – Peter 2011-02-26 22:12:33

相關問題