1. Си / Говнокод #3154

    +143

    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
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    // народ на протяжении 5+ лет жаловался что постоянно что-то в этой библиотеке Х
    // криво потому что часто (с их слов) попытки вызова ее функций просто обламываются:
    
    int module_main_function()
    {
      int rc = 0;
      // ...
    
      rc = libX_do_work( ... )
      if (rc != OK) {
        // error!!!
      }
    
      // ...
    }
    
    // теперь заглянем в инициализацию этого модуля:
    
    int module_init()
    {
       int rc; 
       // ... кучи дежурного копи-паста для инициализации скипнуты ...
       rc = libZ_init();
       if (rc != OK)
       {
         /* error handling */
       }
    
       rc = libY_init();
       if (rc != OK)
       {
         /* error handling */
       }
    
       libX_init();   /* лопата */
       if (rc != OK)
       {
         /* error handling */
       }
    
       rc = libA_init();
       if (rc != OK)
       {
         /* error handling */
       }
    
       // ... и т.д. и т.п.
    }

    меня жалобы одного отдела начали потиху доставать что наша библиотека (назовем ее libX) у них в модуле постоянно не работает и шо ваабще за херня. как встроили ее - так и не работает. иногда. в 80+ модулях работает как часы - ни один другой отдел не жалуется - а вот в ихнем очень специальном модуле нет.

    ну я к ним подвалил. они меня сразу в рабочую функцию тыкать стали - вот тут дескать не работает. я им методично: покаж где инициализация. я когда в инициализацию заглянул, почти сразу начал роготять (давно так не смеялся, наболело за годы).
    им минут пять понадобилось что бы в своем копи-паст параде рассмотреть эту глюку.

    ЗЫ ответ: на строке с лопатой, не хватает "rc = ". у библиотеки есть внешняя конфигурация на отсутствии коей она у них обламывалась постоянно. и исправить скрипты свои что бы чужая конфигурация не убивалясь им похоже религия не позволяет.

    Запостил: Dummy00001, 04 Мая 2010

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

    • отличный пример говнокода!!
      Ответить
    • Ну забыли и что. Уныло.
      Ответить
      • ну блин не сидеть же и ныть о проблеме. что именно эти кадры делали на протяжении Н лет. вместо того что бы прогнать хотя бы раз под дебагером или вставить нормальное сообщение об ошибке, которое им бы сразу и сказало "library is uninitialized."
        Ответить
      • в основном и забывают когда код таким образом пишется, где-то поправил где-то забыл потом 2 часа ищещь где.
        >>> И как Вы предлагаете потом обрабатывать разные возможные коды ошибки?
        switch(xxx_init())
        Ответить
    • Даже посрать повода нет.
      Ответить
    • rc = libZ_init();
      if (rc != OK)

      Все бы норм было если бы херней не страдали, а писали как люди:
      if (libZ_init() != OK)

      Поназаводят стопицот переменных и виноватых ищут
      Ответить
      • Да.
        Ответить
      • И как Вы предлагаете потом обрабатывать разные возможные коды ошибки? Лично я предпочитаю писать как-то так

        {
            int rc = libX_init();
            if (rc != OK) 
            {
                /* error handling */
            }
        }
        {
            int rc = libZ_init();
            if (rc != OK) 
            {
                /* error handling */
            }
        }


        Лишние скобки и табуляция, конечно, не очень хорошо, зато защищает от нечаянного повторного использование переменной.
        Ответить
        • А как же православное if ( (a = fun ( )) == NULL) ?
          Ответить
          • а что это? (вот только не надо про с++, вопрос серьозный)
            Ответить
            • Это - православное присваивание со сравнением. Пришло из злоебучих дебрей плейн си.
              Ответить
            • Это говнокод, мой молодой товарищ.
              Ответить
          • int rc;
            if ((rc = libX_init()) != OK)
            {
            /* pizdec handling */
            };
            Ответить
            • Только один хрен забудут присвоить результат rc - ситуация не изменилась!
              Ответить
              • От долбоёбства ничего не спасёт. Если так плохо с памятью, то кидай исключение, если производительности не жалко. О нём забыть тяжело.
                Ответить
        • >И как Вы предлагаете потом обрабатывать разные возможные коды ошибки
          switch еще не придумали?
          Ответить
          • Если ошибок несколько, тогда кейз рулит. Но, например, функция умеет возвращать нулл как ошибку, и всё остальное, как допустимый вариант. Тогда еботню городить не стоит, а возврат обработать бы неплохо. Как раз один if спасёт отца русской демократии. А возвращать коды ошибок, как мне кажется, моветон.
            Ответить
    • Кулстори, бро! Отличная обработка ошибок
      Ответить
    • показать все, что скрытоvanished
      Ответить

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