этот метод должен быть разложен на отдельные методы? - PullRequest
2 голосов
/ 27 февраля 2011

Этот метод выполняет поиск по ключевому слову для поиска и анализирует запрос 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;
}

Ответы [ 3 ]

5 голосов
/ 27 февраля 2011

Научная школа Кента Бека или Мартина Фаулера фактически посоветует вам реорганизовать эти большие методы вплоть до множества небольших методов.На мой взгляд, это нелегко прочитать, что было бы главной причиной для рефакторинга.

2 голосов
/ 27 февраля 2011

Разбиение методов - это прежде всего не повторное использование. Это может облегчить чтение, тестирование и обслуживание кода. Четкие имена методов также могут заменить встроенные комментарии. Этот метод делает две вещи высокого уровня, которые можно разделить: создание предложения 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() возвращает целое число и не нуждается в вызовах intval() в ваших циклах for. Даже если вы оставите их внутри, было бы лучше применить вызов вне цикла, чтобы он выполнялся только один раз, поскольку каждый раз выдает одно и то же значение.
  • 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];
...
1 голос
/ 27 февраля 2011

Личные предпочтения действительно.Некоторые программисты делят это на несколько функций.Лично я думаю, что у тебя все в порядке.Если бы я увидел что-то, что, по моему мнению, можно использовать повторно, я бы преобразовал его в отдельный файл, который мог бы быть включен.

По моему мнению, некоторые программисты слишком быстры, чтобы сделать вещи "пригодными для повторного использования", прежде чем они дажеесть что-то, чтобы использовать это снова.

...