1. PHP / Говнокод #17796

    +156

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    <?php
    // Код курильщика
       for ($i=1;$i<8;$i+=2){
       if($i==$row->ShipingTime) $result .="<option selected value='".$i."'>".$i."</option>";
       else $result .="<option value='".$i."'>".$i."</option>";
    
        if($i==7) {$i+=3;
         if($i==$row->ShipingTime) $result .="<option selected value='".$i."'>".$i."</option>";
         else $result .="<option value='".$i."'>".$i."</option>";
        }
        else {
         if($i==10) {
          $i+=4;
          if($i==$row->ShipingTime) $result .="<option selected value='".$i."'>".$i."</option>";
          else $result .="<option value='".$i."'>".$i."</option>";
         }
         else {
          for ($i=20;$i<45;$i+=10){
           if($i==$row->ShipingTime) $result .="<option selected value='".$i."'>".$i."</option>";
           else $result .="<option value='".$i."'>".$i."</option>";
           if($i==40){$i+=20;
            if($i==$row->ShipingTime) $result .="<option selected value='".$i."'>".$i."</option>";
            else $result .="<option value='".$i."'>".$i."</option>";
            $i+=30;
            if($i==$row->ShipingTime) $result .="<option selected value='".$i."'>".$i."</option>";
            else $result .="<option value='".$i."'>".$i."</option>";
           }
         }
        }
       }
    
    
    // Код здорового человека (провели рефакторинг)
    $ST_variants = array('1', '3', '5', '7', '10', '14', '20', '30' , '40', '60', '90');
    foreach ($ST_variants as $value) {
      print "<option ". ($value==$row->ShipingTime) ? 'selected' : '' ; ." value='".$value."'>".$value."</option>";
    }

    Заказчик хотел получить <select> со списком значений: '1', '3', '5', '7', '10', '14', '20', '30' , '40', '60', '90'...

    Запостил: govnokoder2, 16 Марта 2015

    Комментарии (15) RSS

    • здоровый человек называет переменные ST_variants? не знает printf/sprintf? ну приехали лол.
      Ответить
      • > не знает printf/sprintf
        Да нафиг тут спринтф? С интерполяцией наглядней будет, чем с ним:
        $ST_variants = array('1', '3', '5', '7', '10', '14', '20', '30' , '40', '60', '90');
        foreach ($ST_variants as $variant) {
            $selected = $variant == $row->ShippingTime ? 'selected ' : '';
            print "<option $selected $variant>$variant</option>";
        }
        Ответить
        • Оно конечно не запрещено, но рано или поздно все равно разбивается о необходимость чего-то более серьезного. Ну и лично меня умиляет вычисление значений не в предварительных переменных, а прямо в аргументах функции.
          Ответить
          • > чего-то более серьезного
            Да так то можно хоть обобщённый компонент для комбиков написать. Но надо ли это в этой задаче?
            Ответить
      • 'selected' : '' ; ." value='"


        рефакторинг-то хоть запускался вообще?
        Ответить
    • Не знаю, как там у вас в ПХП, но так, в общем случае, будет в два раза меньше проверок:
      function select(selected) {
          var options = [1, 3, 5, 7, 10, 14, 20, 30 , 40, 60, 90],
              result = options.map(function (x) {
                  return "<option value=\"" + x + "\">" + x + "</option>";
              }),
              index = options.indexOf(selected);
          result[index] = result[index].replace(" ", " selected ");
          return result.join("\n");
      }
      Ответить
      • > в два раза меньше проверок
        Зато в два раза больше кода и раза в два больше мусора в куче :3

        P.S. И да, оригинальный код толерантен к кривому или пустому $row->ShippingTime.
        Ответить
        • OK, можно result[index].replace(" ", " selected "); заменить на String(result[index]).replace(" ", " selected ");
          На счет памяти - хз. Может можно придумать какой-то способ похожий на with-output-to-string, какой-нибудь ob_buffer_start или как-оно там.
          Ответить
    • Ребята, не ссорьтесь, все варианты говно.
      Ответить
    • А я всё равно буду курить и бухать. Хоть здоровым не помру.
      Ответить
    • вывод html тегов таким способом не очень кошерен, так что второй вариант тоже курильщика
      Ответить

    Добавить комментарий