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

    +66.4

    1. 1
    2. 2
    3. 3
    4. 4
    int str_length(const char *str)
    {
    	return (int)strlen(str);
    }

    Опенсорс, если чо.

    Запостил: Ambilight, 03 Января 2010

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

    • Обычная кросплатформенная обертка.
      Ответить
      • Что-за чушь? Что в ней кросплатформенного? Эта функция лучше не стала, если её переобъявили. Не каких проверок не добавили. Имя не сильно улучшилось. Говно вообщем.
        Ответить
        • Как это ничего не стало лучше? Она теперь signed возвращает. Нафиг надо, не ясно, но аффтару, видимо, зачем-то понадобилось.
          Ответить
          • Ну действительно... Длина строки может быть отрицательной. Так скоро докатимся и длина строки будет дробной. :)
            Ответить
          • #define str_length(a) (int)strlen(a)
            ?

            Хотя тоже смех..
            Ответить
    • А если в будущем придется возвращать что-то другое?
      Ответить
      • Да... Возвращала длину, а станет ширину... :D
        Ответить
      • Ну да... Например float. :D
        Ответить
        • Я имел ввиду не тип, а суть. Например, строки будут не нул-терминатед, или нужно будет учитывать не только до первого нуля? А может нужно как раз будет поставить какие-то ограничения, а у тебя, скажем, 30k строк и в половине методов вызывается этот? А если это метод класса со своими определенными особенностями работы со строками?
          В конце концов, может возврат нужно было часто равнять к инту? Ну тогда говнистость максимум в отсутствии кастов, и то я не помню, что стрлен возвращает.
          Верите или нет, но если в этот метод добавить одну строку, то получится в любом случае легче, выгоднее и проще, чем впихивать эту строку во весь код.
          Ответить
          • Вот и нужно было сделать класс, а не городить огород из говнометодов.
            Ответить
            • Правильно, лучше сад говноклассов с одним методом.
              Ответить
              • Сарказм.
                Ответить
              • Сорри, за оффтоп: ржал под столом :) Очень понравилась шутка :)
                Ответить
                • Тоже сорри за оффтоп: Ржал над столом. :) Тоже понравилась шутка. Но потом меня стол ещё сильнее рассмешил и я снова ржал над столом, но уже под столом.
                  Ответить
          • Если нагородил везде кривые вызовы, на такой случай можно использовать что-нибудь наподобие:
            echo 'mv "$1" "${1}~"; cat "${1}~" | sed -e "s#str_length[ ]*(#strlen(#g" > $1; rm -f "${1}~"' > sed.sh
            find ./ -name "*.cpp" -exec ./sed.sh {} \;
            rm -f sed.sh

            Если на ккой-то хрен понадобился именно int, то вполне можно использовать "#define" или вообще без него обойтись. А делать функцию для преобразования типов (size_t -> int) - это как-то немного неприемлемо.

            А по поводу "если добавить строчку", то а если убрать три строчки (всю эту функцию), тогда вообще говнокода не будет; но написанно именно так, поэтому обсуждаем именно это. Да, понятно, что возможно это пережитки ранних версий кода, или наоборот сделанно с расчётом на будущее, поэтому вполне может быть, что в данных строках есть смысл, однако, нам об этом неизвестно и конкретно данный вариант кода выглядит странновато.
            Ответить
            • Дело не в кривых вызовах, а в том, что они могут в будущем иметь другой смысл. И функция могла быть сделана для будущего рефакторинга и модернизации, а не для конвертации типов. Такой умный, а варианты не учитываешь.
              Ответить
    • Нужно пользоваться нормальными, удобными, уже готовыми классами для строк, а не городить свои велосипеды, типа int str_length(const char *str). Мало того, что велосипед, да ещё и кривой. В любом случае const char * - не самый лучший вариант для строк в С++. С++ - не Си, в котором нельзя было создать класс для удобной и безопасной работы.
      Так, что жуткий говнокод.
      Ответить
      • Работа с указателями тебе тут опасна? Или из-за того, что это строка меняется смысл указателей?
        Ответить
        • Вижу, что ты молодой программист. Советую почитать умные книжки. В них это описываеться. Да и со временем на практике поймешь, что строки в стиле Си (char*) - опасны и неудобны.
          Ответить
          • А поконкретнее можно? Мне очень интересно. Если ты руку набил с чаровыми указателями, имхо, тебе с ними удобнее и приятнее работать, чем со строками -- местами кривоватыми обертками указателей.
            Ответить
          • в умных книжках пишут, что всему свое время и место... ингда вполне достаточно char*...
            Ответить
            • Это очень редко нужно. Там где это нужно там не грех strlen воспользоваться.
              Ответить
              • ну допустим мне const char* нужен чаще, чем std::string...
                если че, я gamedeveloper...
                Ответить
                • Раз тебе он нужен, то ты напишешь обертку, типа
                  int str_length(const char *str)
                  ?
                  Ответить
                  • я напишу size_t str_length() либо #define str_length(a) strlen(a)...
                    Ответить
                    • >#define str_length(a) strlen(a)
                      Зачем он тебе нужен? O_o
                      Просто strlen пользуйся. Зачем конструкции городить?
                      Ответить
                      • потому что в один прекрасный момент я могу перейти на utf-8 и мне может понадобится не длинна в байтах а количество букв...
                        Ответить
                        • Боюсь, что обсуждаемая "обёртка" в таком варианте как она написана для такой ситуации окажется ничем не лучше, чем указанный #define
                          Ответить
                  • Если я не уверен, что меня будет устраивать strlen, то пишу.
                    Ответить
                    • Чем он тебя будет неустраивать?
                      Ответить
                      • А всю ветку почитать не дано?
                        У меня может возникнуть ситуация, когда строка оканчивается не нулем, или когда мне нужно принудительно ограничивать возвращаемое значение, или когда строка может содержать стопицот нулей.
                        Ответить
    • очевидно автор решил избавиться от варнингов преобразованием типов (int)
      Ответить
      • Это его не оправдывает, да и есть другие возможности отключения варнингов, например всякие #pragma и прочие. А основной способ избавления от таких варнингов - не использовать самописный говновелосипед или говнонаследие Си, а нормальную библиотеку для работы со строками.
        Ответить
        • Говнонаследие Си создано лишь для совместимости и это не значит, что в С++ его нужно использовать. Обычно скрещение устаревших и новых методов -плохо сказываеться на безопасности и понимаймости кода.
          Ответить
        • Вообще-то варнинги не просто так придуманы. КО.
          Ответить
          • Правильно. Лучше их не скрывать, а сделать что-бы их действительно не было. Для этого нужно использовать уже готовые, удобные и проработанные чужие классы для работы со строками, чем писать самому кривой инструмент, типа int str_length(const char *str). Можно конечно и самому класс написать, но по первости это тяжело, да и ошибиться можно. А с чужим, тк уже много раз использовался и отлажен - проблем быть не должно. Естественно это должна быть уважаемая бесплатная библиотека. :)
            Ответить
            • И не просто уважаемая, а используемая и исправленная уже как много лет назад.
              Ответить
            • ...на BSD-лицензии. С которой можно нормально работать.
              Представь ситуацию: мне от строки нужно умет знать её длину, брать произвольный символ или подстроку. Ну, для примера. Ты довольный берешь какой-нибудь std::wstring и начинаешь потихоньку охуевать от этого вектора на темплэйтах. Так не легче ли эти три метода самому написать?
              Ответить
              • +100500, повторюсь еще раз, всему свое время и место...
                Ответить
              • Будто-бы в этом классе нет такой простой функции, как получение длины... И что там сложного в этом классе? Помоему организованный и удобный класс, проще, чем указатель на символ...
                Ответить
                • То есть ради получения длины я должен создать массив итераторов, выделяя на всю эту бодягу память, и соответственно время, и если все пойдет хорошо (!), взять оттуда циферку, сделать каст в инт и удалить всю эту шнягу. Красиво? Ну не нужно мне для трех функций эту хрень за собой таскать.
                  Кстати, есть вариант, что корпоративная политика запрещает пользоваться stl'ем.
                  Ответить
    • Фу-фу нафлудили. Строго говоря, я немного напортачил, определив сей говнокод как Си++: на самом деле это Си, просто я уже привык работать с ++.
      Во-вторых, это кусок из кода замечательной гамалки teeworlds.
      — Ambilight-кун.
      Ответить
    • long double str_length(const BitOfChar *str)
      {
      return (long double)strlen(str);
      }
      Ответить
      • Просвети: это что?
        Ответить
      • >long double str_length(const BitOfChar *str)
        Зачем такая большая точность long double для длины строки? На сколько я помню, в char последний раз было 8 бит. А точность 1/8 вместит даже float.
        Ответить
      • Ээээ... Да не гони. Что-за long double? Такого нет. Есть только float и double. ;)
        Ответить
        • long double действительно нет? Я думал он существует... Всеми компиляторами поддерживаеться? Кто-нибудь знает?
          Ответить
    • Дак а в чем проблема сделать стопицотмегабайтный тип? Ну мне полюбому надо интернет в одной переменной сохранить)))
      Ответить
    • Где сдесь С++?
      Ответить
      • Его сдесь нет. Чего пристал?
        Ответить
        • У обоих ошибка? O_o
          "Здесь" пишеться!!! Говнокодят не только на языке С++, но и на Русском... :)
          Хотя я и сам часто тороплюсь... :)
          Ответить
          • "Пишется" пишется!!! На [color=red]р[color]усском не кодят, на нем пишут.
            Ответить
            • Да ладно. Посмотри компилятор MS Visual Studio. Там вполне на русском можно процедурки называть. Кодят! Ещё как кодят. Даже компиляры есть, что чисто на русском записывают для них проги. ;)
              Ответить
              • И картошку руками можно выкапывать, да.
                Ответить
                • Я же не сказал в машинных кодах писать программы или на ассемблере.
                  Для русского человек более естественно писать программы на родном языке.
                  Вот например язык программирования, где можно это сделать на русском:
                  http://ru.wikipedia.org/wiki/Оберон_(язык_программирования)#.D0.93.D0 .BB.D0.B0.D0.B3.D0.BE.D0.BB
                  Ответить
                  • И называеться Глагол. И много других таких.
                    Ответить
                  • Может быть в теории где-то и пишут на русском, но на практике я нигде не встречал исходных кодов на русском. Даже комментарии зачастую оставляют на английском.
                    Ответить
            • И да. Человек просто патриот, раз пишет Русском. ;)
              Ответить

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