1. ActionScript / Говнокод #2689

    −186.1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    var topItem:Object;
    var rowNum:int;
    var rowCount:int;
    ...
    else if (!topItem && !rowNum == rowCount)
    ...

    Чтобы не утомлять вас догадками, во что же это превратится и в каком порядке произойдут операции: это условие выполниться только когда:
    topItem == null
    rowNum != 0
    rowCount == 0
    Как следует из названий переменных, человек, написавший это ожидал, что количество строк может быть меньше, чем порядковый номер одной из строк...
    Взято, опять же из Flex Framework mx.controls::Tree.
    Скорее всего автор имел в виду следующее:

    else if (!topItem && rowNum !== rowCount)

    Но булевые переменные, они ж такие коварные :)

    Запостил: wvxvw, 27 Февраля 2010

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

    • topItem == null
      rowNum == 0
      rowCount == 1

      Не?
      Ответить
      • Да, такое условие тоже будет true, но оно бессмысленно, т.как незачем проверять вторую чаcть - нам просто достаточно узнать, что rowNum == 0.
        кроме того, то, что оно включает в себя еще и другую ситуацию - как бы тоже не айс...
        Ну и вообще, там по смыслу имелось в виду другое, т.е. именно != а не !х == у.
        Ответить
      • Да, чтобы не возникало сомнений:
        else if (!topItem && !rowNum == rowCount)
                {
                    parent = collection ? getParentItem(bottomItem) : null;
                    index =  bottomItem ? getChildIndexInParent(parent, bottomItem) : 0;
                    rowNum = 0;
                }

        Т.е. если уж писатель и рассчитывал на то, что условие выполнится только тогда, когда rowNum == 0, то последния строчка вызывает серьезные опасения за него и AS3 в целом :)
        Ответить
        • Ну да, согласен.
          Баг, с кем не бывает. Исправят в какой-нибудь из будущих версий.
          Ответить
        • а может, !rowNum == rowCount это (rowNum==0) XOR (rowCount==0) ? ;)
          Ответить
          • Тогда все равно говнокод - rowNum ^ rowCount :)
            Они все равно оба интеджеры и у XOR приоритет выше чем у AND.
            Ответить
    • operator precedence надо либо знать назубок либо пользоваться скобками, ибо воистену...
      Ответить

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