1. JavaScript / Говнокод #11514

    +154

    1. 1
    2. 2
    3. 3
    function isEmptyStr(val) {
        return val == null || val === "";
    }

    Запостил: glprizes, 01 Августа 2012

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

    • Что плохого в этом коде?
      Ответить
      • А проверка на нулл засем? Точнее даже не нахрена, а почему в таком виде. И почему не через length
        Ответить
        • Так мы не знаем, как используется эта функция. Только посмотрев весь код, где вызывается эта функция, можно говорить, нужна ли проверка на null.
          Ответить
          • Название намекает, что функция принимает параметром строку. В JavaScript undefined, null, "" вычисляются в false, поэтому вместо isEmptyStr(s) достаточно было бы написать !s
            Ответить
            • Ещё 0 и NaN и сам false вычисляется в false, поэтому приведенная вами замена не эквивалентна.
              Название функции немного не соответствует сути, но, на мой взгляд, не в такой степени, чтобы считать это говнокодом.
              Ответить
              • Вопрос о том, является ли 0, false или NaN пустой строкой, не имеет смысла, так как это не строки. На "нормальных" входных данных замена эквивалентна.
                Ответить
                • Функция принимает только строки в качестве аргумента? По крайней мере, это из привиденного кода не видно. "Str" в названии функции ещё ни о чём не говорит. Если это так, лучше привести ещё код, где функция вызывается.
                  В процессе развития проекта бывает, что функция меняет своё назначение, а название остаётся старым.
                  Ответить
                  • Предлагаете добавить условие typeof val == "string"?
                    Ответить
                    • Не могу сказать, так как не знаю, какие аргументы может принимать функция.
                      Ответить
            • С названия совсем не очевидно, что функция принимает параметром только строку. Например, встроенная функция Array.isArray принимает ведь не только массив. Так и здесь, с назнавания isEmptyString можно предположить, что функция принимает не только строку и возвращает false если аргумент - непустая строка или значение другого типа.
              Ответить
              • > можно предположить, что функция принимает не только строку и возвращает false если аргумент - непустая строка или значение другого типа
                То есть так? ;)
                function isEmptyString(s) {
                    return s === "";
                }
                Ответить
                • function isEmptyString(s) {
                      return s === "" or s == NULL;
                  }
                  Ответить
                  • Ой, не глядя на код ОПа, я его почти повторил.
                    Ответить
                  • А зачем s == null, null же не строка в любом случае, это значение другого типа...

                    P.S. Вот если бы oneguy сформулировал свою фразу как "возвращает false, если аргумент не пустая строка и не нулл", тогда я бы согласился с кодом ОП'а.

                    А так, имхо, мой код более точно подходит к описанию "возвращает false если аргумент - непустая строка или значение другого типа".
                    Ответить
                    • "Так и здесь, с назнавания isEmptyString можно предположить, что функция принимает не только строку и возвращает false если аргумент - непустая строка или значение другого типа."
                      Я здесь описал не функцию ОПа, то пример того, что если в названии функции присутствует Str, то это не означает, что функция принимает только строку. Тем самым опровёрг утверждение glprizes-а
                      "Название намекает, что функция принимает параметром строку."
                      Ответить
                  • А вот и оппаньки...
                    new String("") === ""
                    Ответить
                    • Хм, ну раз это выражение возвращает false, и new String() это object а не string, то, имхо, остается только такой вариант:
                      function isEmptyString(s) {
                          return typeof(s.length) != undefined && s.length == 0;
                      }

                      P.S. Блин оно теперь на пустых массивах возвращает true ;(
                      Ответить
                      • Там конечно же "undefined", а не undefined. Хотя эту проверку можно вообще опустить, т.к. undefined != 0...

                        P.P.S. Неужели в JS никак нельзя отличить любой объект, у которого есть length от массива или строки, запиленных через new Array/new String?
                        Ответить
                        • Как-то так?
                          http://ideone.com/Ra97V
                          Ответить
                          • Если нужен был именно такой эффект, то тогда:
                            function isEmptyString(s) { return String(s) === ""; }

                            Но автор не рассказал зачем ему нужна была такая функция. Скорее всего она ему была не нужна.

                            EDIT: а хотя, нет, так массив тоже пройдет. Блин.
                            Ответить
                            • > а хотя, нет, так массив тоже пройдет.
                              JS такой JS ;)
                              Ответить
                          • Но если задаться целью подсунуть не пустую строку, то, все равно осуществимо:

                            function StringBuilder() {
                            	this.__proto__ = String.prototype;
                                    this.length = 0;
                            }
                            function isEmptyString(s) {
                                return (s instanceof String || typeof(s) == 'string') && s.length == 0;
                            }
                            isEmptyString(new StringBuilder()); // true
                            Ответить
                            • JS способствует развитию паранойи ;)

                              На самом деле, если кто-то это туда передал - значит так ему и надо...
                              Ответить
                              • Я тоже считаю, что излишняя паранойя не нужна, а то можно кучу бреда накуралесить...
                                Всё равно в javascript можно всё сломать, зачем лишний раз упираться, если всего-то строку на пустоту нужно проверить
                                Ответить
                              • Ну так и XSS тоже этому помогает. Язык построили вообще без намека на безопасность и инкапсуляцию, оно и понятно, что любой, кто на нем пишет рано или поздно станет параноиком.
                                Ответить
                                • Вы упускаете основную мысль: проблему нельзя решить на том уровне, на котором она появилась. Потому писать код с расчётом "а вдруг кто-то испоганил Object.prototype" - глупо.

                                  Надо всего-лишь не позволять никому встраивать в страницу собственный javascript код. Параноиком нужно быть не при программировании на javascript, а при обработке данных, поступающих от пользователя (т.е. решать проблему на более высоком уровне).
                                  Ответить
                                  • И теперь на вашей странице не будет баннеров из Гугл-адз. В Фейсбуке не будет мини-приложений от сторонних разработчиков и т.п?
                                    Или, может, всем отказаться от Гугл-аналитикс и других сервисов которые предоставляются похожим образом между разными сайтами?
                                    Ответить
                                    • Сомневаюсь, что гугловые апи портят стандартные функции. А если что-то и патчат, то именно для того, чтобы предоставить сервис, и всяческие костыли только нарушат работу сервиса.

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

                                        Кроме того, честно говоря, гугловский код совсем даже не отличается каким-то высоким качеством, особенно в том, что касается ЯваСкрипта и Флеша. АПИ к картам текло памятью как сито, например.

                                        Но, проблема не в Гугле и тамошних программистах, потому что большинство и того хуже, а в том, что язык по задумке такой уродский, что написать на нем более-менее безопасную программу не возможно, либо возможно, но в самых тривиальных ситуациях.
                                        Ответить
                                        • > написать на нем более-менее безопасную программу не возможно, либо возможно, но в самых тривиальных ситуациях

                                          Вот вы сами себе противоречите и подтверждаете мой тезис: не нужно даже пытаться, всё равно не угадаешь, что сломают (если сломают). Только код запутается, профита от этой паранои ноль.
                                          Ответить
                                          • Чему я противоречу? Если каждый раз переходя дорогу вы подвергаетесь повышеному риску, то изза того, что это случается часто и незибежно, этим риском нужно пренебрегать? В чем логика?
                                            Ответить
                                            • > Если каждый раз переходя дорогу вы подвергаетесь повышеному риску, то изза того, что это случается часто и незибежно, этим риском нужно пренебрегать?

                                              Вы за время перехода обдумываете все варианты, как злые водители могут вас сбить, и как отразить эти атаки? Или же тупо подходите к переходу, ждете зеленого света, смотрите на всякий случай направо и налево и идете?
                                              Ответить
                                              • Могу даже и на светофор не посмотреть - разница в том, что когда вы пишете программу, вы будете повторять одно и то же действие много (потенциально очень много) раз, а перехожу дорогу я всего один раз (посмотрев на светофор, или по сторонам, или и то и другое). Т.е. речь не о риске пешехода в одном конкретном случае перехода дороги - а о программе, которая управляет светоформаи.
                                                Ответить
                            • wvxvw, твой пример не будет работать в другом window (фрейм, или новая вкладка)

                              универсальный вариант:
                              function isEmptyString (s) {
                                  return Object.prototype.toString.call(s).slice(8, -1) === "String" && s.length === 0;
                              }
                              Ответить
                              • Я смогу обмануть и этот код тоже :)
                                Ниже, по-идее универсальное решение:
                                function isEmptyString(s) { return s == "" && s.constructor === "".constructor; }
                                Ответить
                                • Вроде как тоже не будет работать между фреймов. Хотя не уверен.
                                  Ответить
                                • wvxvw, как ?)
                                  Ответить
                                  • Object.prototype._toString = Object.prototype.toString;
                                    Object.prototype.toString = function() {
                                        if (this instanceof String) return "[object String]";
                                        else return this._toString();
                                    }
                                    :)
                                    Ответить
              • На сколько я понимаю, ее еще как бы нету, это ж тот самый ХТМЛ-5 пакет о котором все говорят! (* читать с предыханием *). Т.е. ее поддерживают только Мозила / Хром, а в ИЕ ее еще как бы и нету... или есть уже?
                Ответить
        • Как правильно написать код?
          Ответить

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