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

    +150.9

    1. 1
    if (FALSE !== strpos($this->lin{$i},$this->o)) {

    я б до такого сравнения даже в кошмарном сне бы не додумался.

    Запостил: guest, 15 Февраля 2009

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

    • mr.The:
      Йода мастер писал код этот.
      Ответить
    • Zend:
      И что вас здесь смутило? Обычная техника предотвращения возникновения ошибок сравнения еще на стадии "компиляции".
      Ответить
    • lee:
      Нормальная практика сравнения с выводом константы на первое место для предотвращения ошибок со сравнением.
      Ответить
    • Keeper:
      Нормальная-то она нормальная, но выглядит всё равно жутко. o_O
      Ответить
    • yubuy:
      хм. как по мне, так лучше ошибиться со знаком равно и потом поискать ошибку несколько минут, чем потом тратить время на разбор вот таких закорючек.
      Ответить
    • mykola:
      гм. Постоянно пишу подобное. Вот только что чиста на афтомате написал:
      while ( null != ($row = $db->fetch() )  ) {
        ..

      выходит тяжелое наследие Ц и гдб сыграло со мной злую шутку и я теперь говнокодер? Какая жалость.
      Ответить
    • yubuy:
      нет, я не говорю что такой вариант плохой, просто в данном варианте не понимаю зачем так извращаться и мучить программистов, которые после будут разбираться в твоем коде, не проще написать вот так,
      if ($this->lin{$i} == $this->o){
      Ответить
    • Иван:
      [quote= yubuy]нет, я не говорю что такой вариант плохой, просто в данном варианте не понимаю зачем так извращаться и мучить программистов, которые после будут разбираться в твоем коде, не проще написать вот так[/quote]
      Не проще и даже НЕ правильно. Ваш пример работает на равенство, а исходный на поиск подстроки.
      Ответить
    • имхо реально хуже "аццкого сравнения" выглядят мемберы с благозвучными именами типа "о" (наверное от слова "ояебу") и lin (линолеум? или массив китайцев с именем Lin?) хехе.
      Ответить
    • yubuy:
      [quote=Иван]Не проще и даже НЕ правильно. Ваш пример работает на равенство, а исходный на поиск подстроки.[/quote]
      вы думаете результат будет различаться если я попбробую, найти в строке длинной в 1 символ символ и если я сравню эту строку с символом?
      Ответить
    • yubuy:
      [quote=Иван]Не проще и даже НЕ правильно. Ваш пример работает на равенство, а исходный на поиск подстроки.[/quote]
      вы думаете результат в данном случае результат будет различаться если я попбробую, найти в строке длинной в 1 символ символ и если я сравню эту строку с символом?
      Ответить
    • Это не говнокод, это обход говнистости языка.
      Если $this->lin{$i} будет начинаться с $this->o, то strpos выдаст 0, а 0 равнозначен false в булевых проверках для пыха.
      Вот и приходится использовать false !== strpos(a,b)...
      И это стандартная практика.
      Ответить
    • Иван:
      [quote=yubuy]вы думаете результат в данном случае результат будет различаться если я попбробую, найти в строке длинной в 1 символ символ и если я сравню эту строку с символом?[/quote]
      Нет контекста и я не телепат. Если предполагается, что величины будут всегда иметь одинаковую длину, то лучше заменить на равенство. Но приведенный пример НЕЛЬЗЯ заменить равенством.
      Ответить
    • [quote=Говногость]Это не говнокод, это обход говнистости языка.
      Если $this->lin{$i} будет начинаться с $this->o, то strpos выдаст 0, а 0 равнозначен false в булевых проверках для пыха.[/quote]
      я вс наверно огорчу.. для этого можно юзать оператор "===". либо !(условие)===true; хотя это то-же говнисто выглядит.
      Ответить
    • anmiles:
      [quote]либо !(условие)===true[/quote]

      Гениально!
      А чем же, по вашему, хуже
      [quote]FALSE !== (условие)[/quote]
      из примера?
      Ответить
    • Надо же, сколько гавнопрограммеров-то повылазило, ни разу в жизни не читавших мануал.
      http://php.net/strpos
      Ума хватает лишь на то, чтоб называть непонятое Вами говнокодом?
      Ответить
    • yubuy:
      епмарек.
      я абсолютно ничего не имею против таких конструкций как FALSE !== (условие) и т.д. но блин в данном варианте не проще вместо вот этого
      if (FALSE !== strpos($this->lin{$i},$this->o)) {
      написать $this->lin{$i} == $this-o?
      Ответить
    • yubuy:
      еще раз объясню для тех неговнокодеров, которые поленись разобрать что делает этот код. ищется подстрока this->o в строке $this->lin{$i}. знаете что значит {$i} вытаскиваеся символ, ОДИН символ из $this->lin. Так на какой хер так сравнивать а? Это хороший код?
      Ответить
    • Говногость:
      2 говнокодер yubuy:

      Все поняли что ОДИН символ, и это бессмыслено, если операнды - строки. Но если нет, то начинаются различия. На "==" однозначно менять НЕЛЬЯ.
      $a = '';
      $b = 0;

      if ($a{0} == $b) - сработает
      if (FALSE !== strpos($a{0},$b)) - нет

      Аналогично и другие варианты.
      Вообще, тут лучше использовать "===" вместо "==", но все равно различия есть.
      Ответить
    • dead_star:
      я в шоке
      нет ну я конечно тоже пробегая беглым взглядом подумал что $this->lin{$i} это строка
      но когда присмотрелся увидел скобки и понел что это всеголишь один символ

      to #19 действительно говногость
      перво наперво этот код выдает ошибку Notice
      $a = '';
      $b = 0;
      
      if ($a{0} == $b) - сработает
      if ($a{0} === $b) - нет
      if (FALSE !== strpos($a{0},$b)) - нет

      ну и нафига заморочки со strpos()
      Ответить

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