1. C++ / Говнокод #1874

    +55.9

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    while (true)
      {
        m_CurrentDevice += delta;
    
        if (m_CurrentDevice < 0)
          m_CurrentDevice = devices[DEV_PLATE]-1;
    
        if (m_CurrentDevice > devices[DEV_PLATE]-1)
          m_CurrentDevice = 0;
    
        break;
      }

    Это конечно написано не специально - в результат целой кучи итераций и переделок. но результата это не отменяет

    Запостил: TObject, 21 Сентября 2009

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

    • цикл зачотный
      Ответить
    • Ээ, а зачем тут цикл?
      Ответить
      • Вероятно, именно цикл есть наследие большого количества "итераций" и "переделок". Он стал уже не нужен, но: удовлетворяет контракту -- не тронь. Это из парадигмы "заплаточного" программирования.
        Ответить
    • да на самом деле ничему он не удовлетворяет - я его удалил тут же как обнаружил

      2Dimarius
      ээ, а действительно?..
      Ответить
      • Я предположил, что отрывок имеет хотя бы минимальный смысл. Кода то я не видел...
        Вообще "заплаточное" программирование -- это самый большой источник невразумительного кода вида

        <выходной параметр> public method1(<входные параметры>) {
        <здесь делаем дело>
        }

        <выходной параметр> public method2(<входные параметры>) {
        <здесь делаем тоже самое дело>
        }

        То есть, два метода с разными названиями делают одно и тоже, и сигнатура одинакова.
        Оказывается, что сначала эти методы делали разные вещи, предназначались для использования в разных местах, но после очередной заплаты возникла необходимость в том, чтобы они делали одно и тоже, но выносить это "одно" нельзя в отдельный метод, потому что следующая заплатка вновь может потребовать различного поведения.

        Всякие там случаи, когда сначала переменные определяются, а затем перекладываются в другие без изменений. Возникают конструкции, которые имеют инвариантом что угодно, как приведённый цикл: что в него не брось, он ни на что не повлияет.

        Зато, в большинстве случаев, можно быстро писать "приблизительный" код. Который что-то там делает, но точно его контракт не известен (тем более невозможно точно знать, что внутри него происходит). Мы думаем, что "потом залатаем".
        Ответить
        • Это скорее парадигма "творческий поиск", когда сначала мы делали одно, потом решили переделать, потом еще переделать, потом вообще сделать по-другому (причем на каждой итерации неясно, будем ли мы возвращаться к старым версиям, в результате последние просто камментется, а не удаляются). В суровой древности у этого цикла было еще куча проверок, которые в случае чего делали continue (т.е. нужен был именно цикл), есенно до break. После рефактора и удаления всякого мусора остался такой красивый цикл. Сама суть кода (+=, проверки) в данном случае не важна (она корректна). Собственно в финальной версии только они и остались.
          Ответить

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