这个方法应该分解成单独的方法吗?

时间:2011-02-26 21:54:40

标签: php decomposition

此方法搜索搜索关键字并解析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 个答案:

答案 0 :(得分:5)

Kent Beck或Martin Fowler的思想学派实际上会建议你将这些大型方法重构为许多小方法。在我看来,这并不容易阅读,这将是重构的主要原因。

答案 1 :(得分:2)

分解方法主要不是重用。这样做可以使代码更易于阅读,测试和维护。清除方法名称也可以替代内联注释。这个方法做了两个可以分开的高级事情:用选项构建一个where子句而没有选项。另一个暗示是,使用options构建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];
...

答案 2 :(得分:1)

真正的个人偏好。一些程序员会把它分成几个函数。就个人而言,我认为你拥有它的方式很好。如果我看到一些我认为可以重复使用的内容,我会将其重构为一个可以包含的单独文件。

在我看来,一些程序员在他们甚至没有重复使用之前就太快速地让事情变得“可以补偿”。