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

    +160

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    void log(string srv, string text) {
                    time_t rawtime; tm * ptm; time ( &rawtime ); ptm = gmtime ( &rawtime );
                    ofstream logfile(LOG, ios::app);
                    logfile << (ptm->tm_year+1900) << "-" << (ptm->tm_mon+1) << "-" << ptm->tm_mday << " "
                            << (ptm->tm_hour+MSD%24) << ":" << ptm->tm_min << ":" << ptm->tm_sec << endl << srv << ":\t" << text << endl << endl;
                    logfile.close();
            }

    Жистоке, брутальне логирование.

    Запостил: kainwinterheart, 14 Августа 2010

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

    • не понял где говнокод... в избыточном использовании СТЛ?
      Ответить
      • Где тут избыточное использование STL ?
        endl'ы лишние всего лишь.
        Открывать-закрывать каждый раз файл вероятно не лучшее решение.
        Ответить
        • это система логирования... если файл не закрыт при завершении приложения или креше, мы можем потерять несколько последних строк... можно конечно делать flush, но это только усложнит довольно простую систему используемую в основном только в дебаге...
          Ответить
          • Вообще-то endl и так сбрасывает буфер.
            Ответить
            • хорошо... но куда деваться от функций типа init/close в которых нужно получить ofstream готовый к записи, и что делать если логирование понадобится в функциях которые выполняются до main, а там не угадаешь, кто раньше выполнится...
              данный вариант универсален и может использоваться в любом месте программы... да он медленный, но в дебаг режиме это неважно, а в релиз эта функция не попадет......
              Ответить
              • >куда деваться от функций типа init/close
                Это же С++. Там есть конструктор/деструктор.
                >в функциях которые выполняются до main
                О каких функциях речь ?
                >в дебаг режиме это неважно
                С чего вообще появилась мысль о дебаге?
                Ответить
                • о конструкторах и деструкторах статических объектов. стандарт не гарантирует и не дает возможности управлением порядка инициализации глобальных и статических объектов.. отсюда появляются всякие прикрутки типа инициализация при первом использовании либо забивание на логирование до создания класса логера...

                  в большинстве случаев логирование в конечном продукте не нужно, вполне достаточно информации об ошибке...
                  Ответить
                  • >о конструкторах и деструкторах статических объектов.
                    Деструкторы уж вряд ли :)
                    >типа инициализация при первом использовании
                    Так и что в этом плохого?
                    >в большинстве случаев логирование в конечном продукте не нужно
                    Смотря какой продукт. В каком-нибудь мелком - скорее да, чем нет.
                    В крупном - наоборот.
                    Ответить
                    • это не зависит от крупности или мелкости проекта, если лог пользователю полезен, то он нужен, и с системой логирования стоит повозиться, если не нужен, то его не должно быть...
                      а для отлова ошибок, лучше нагородить систему типа commit log... то есть лог заводится в определенном месте (там где он нужен), если произошла ошибка, сохраняем лог в который дописываем адрес ошибки, содержимое стека, регистры, любую другую информацию которая подскажет где и почему ошибка... если ошибки нет, лог стираем... либо лог в виде циклического буфера, то есть затираем самые старые сообщения, при ошибке сохраняем на диск либо отправляем отчет...
                      Ответить
                      • Смотря какой лог.
                        Одно дело лог доступа в каком-нибудь сервере.
                        И совсем другое - лог отладочный.
                        Первый нужен пользователю, второй - разработчику.
                        При этом второй тип лога востребован гораздо чаще.
                        Под частотой имеется в виду отношение подсистем логирования к числу программ.
                        P.S. Где/как заводятся логи и как обрабатываются это уже нюансы. Не вижу смысла акцентировать на них внимание.
                        Ответить
                        • ну так я и говорю, если лог нужен пользователю, то стоит повозиться с системой логирования... если разработчику, то система логирования должна быть как можно проще, чтоб ее можно было легко отрубить... поэтому данный код может быть говнокодом только в каком-то особенном контексте...
                          Ответить
                          • Правильно ли я понял: любой наскоро сляпанный код, который потенциально будет удален - не есть говнокод?
                            Ответить
                            • Это безвредный говнокод, но быть таковым не перестает. Но и не всегда наскоро сляпанный код -- говнокод. Это может быть кривоватый/некрасивый/медленный но такой себе обычный код.
                              Ответить
                              • Безвредный говнокод частенько ещё и бесполезный.
                                С другой стороны само определение говнокода довольно размыто.
                                Я бы даже сказал : размазано.
                                Ответить
                                • Хршо сказал) Ну наскоро написанный код может иметь гору временных переменных, которые можно вкатать в одну строку, либо наоборот повторяющиеся операции, которые можно сделать один раз, кривые названия переменных и т.д., но это же не говнокод. Это такой случай)
                                  Ответить
                            • этот код решает (причем хорошо решает) определенную задачу...
                              единственный остающийся наезд на этот код с вашей стороны это производительность, но в месте его применения (я имею ввиду отладочную версию) она не важна...
                              этот код можно считать говнокодом, только если лог фай является одним из результатов работы программы, расчитанной на высокую производительность...
                              ну и как бы KISS никто не отменял...
                              Ответить
                              • Короче, я понял ... СТЛ головного мозга.
                                >KISS никто не отменял
                                И не надо меня ЦЕЛОВАТЬ
                                Ответить
    • Навскидку увидел две неинициализированные переменные, я привереда)
      Може собака в офстриме зарыта, но я тогда не в теме)
      Ответить
      • >две неинициализированные переменные
        Какие ?
        Ответить
        • time_t rawtime; tm * ptm;

          Имел ввиду, сразу не инициализрованные. Имхо плохо так.
          Ответить
          • Безусловно было б лучше так:
            time_t rawtime = time(NULL); 
            tm * ptm = gmtime ( &rawtime );
            Ответить

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