2

このメソッドは、検索キーワードと解析されたmysqlクエリを取得し、where式をLIKE%keyword%を含むように書き直します。

それはうまく機能しますが、これほど多くのループを持つメソッドを持つことが良いか悪いかはわかりません...

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;
}
4

3 に答える 3

5

KentBeckまたはMartinFowlerの考え方の学校は、実際には、この大きな方法を多くの小さな方法にリファクタリングするようにアドバイスします。私の意見では、それは簡単には読めません。これがリファクタリングの主な理由です。

于 2011-02-26T22:02:31.883 に答える
2

メソッドを分割することは、主に再利用に関するものではありません。そうすることで、コードの読み取り、テスト、および保守が容易になります。明確なメソッド名は、インラインコメントの代わりに使用することもできます。このメソッドは、分離できる2つの高レベルのことを実行します。オプション付きとオプションなしのwhere句を作成することです。私にとってのもう1つのヒントは、オプション付きの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句が取る可能性のある3つのフォームがあり、入力とともに各フォームがその結果を生成する必要があることを確認できます。

コード全体で行うことができるいくつかのマイナーな改善を次に示します。

  • count()整数を返し、ループ内のintval()呼び出しは必要ありません。forそれらを残した場合でも、ループの外側に呼び出しを適用して、毎回同じ値が得られるため、1回だけ実行することをお勧めします。
  • 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];
...
于 2011-02-26T22:42:34.957 に答える
1

本当に個人的な好み。一部のプログラマーは、これをいくつかの関数に分割します。個人的には、あなたのやり方でいいと思います。再利用できると思われるものを見つけた場合は、それを別のファイルにリファクタリングして、含めることができます。

私の意見では、一部のプログラマーは、何かを再利用する前に、物事を「再利用可能」にするのが速すぎます。

于 2011-02-26T21:57:11.593 に答える