偏执狂:避免循环中/循环后的代码重复

时间:2010-12-21 23:05:10

标签: refactoring

我对代码重复有一个奇怪的问题。有很多像这样的循环:

    $prev_name = null;
    $clone = null;

    while($row = mysql_fetch_assoc($res)){
      if($prev_name != $row['req']){    
        if($prev_name){
          while($clone <= $end){            
            echo '<td>-</td>';              
            $clone->step();
          }
          echo '</tr>';
        }
        echo '<tr><td>' . htmlspecialchars($prev_name = $row['req']) . '</td>';                                                                                                                                    
        $clone = clone $start;        
      }

      $rowdate = date_create($row['date']);
      while($clone < $rowdate){         
        echo '<td>-</td>';
        $clone->step();
      }

      echo '<td>' . $row[$field] . '</td>';
      $clone->step();
    }

    if($prev_name){
      while($clone <= $end){
        echo '<td>-</td>';
        $clone->step();
      }
      echo '</tr>';
    }

如你所见,循环后的if()与循环中的2-if if()相同。是否有可能减少这种重复?

2 个答案:

答案 0 :(得分:3)

把它放在一个函数中。

 function writeSteps($prev_name,$clone,$end)
 {
    if($prev_name){
      while($clone <= $end){            
        echo '<td>-</td>';              
        $clone->step();
      }
 }

答案 1 :(得分:1)

不确定。 Extract Method是你的朋友。

只需将此代码放入方法中并从两个位置调用它。

if($prev_name){
  while($clone <= $end){            
    echo '<td>-</td>';              
    $clone->step();
  }
  echo '</tr>';
}