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

    +4

    1. 1
    2. 2
    while (st.indexOf(" ") != -1)
            st = st.replace(" ", " ");

    Запостил: FrontlineReporter, 15 Мая 2016

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

    • Эм... Пробел меняется на пробел и это когда-то заканчивается?.. Пойду выпью яду...
      Ответить
      • в юникоде пробел пробелу рознь. может где чего убилось про копе-пасте этого кода потому что там на самом деле три одинаковых пробела.

        но я не раз писал подобный код для чистки е-буков: замена nbsp (0xA0) на обычный пробел (0x20). но на самом деле там все еще хуже: https://www.cs.tut.fi/~jkorpela/chars/spaces.html
        Ответить
        • Скорее уж два пробела, чем юникод. Какой смысл менять nbsp в цикле?
          Ответить
          • если два пробела то еще смешнее

            предлагаю запилить модуль для нода: 2SpacesToOneSpace
            Ответить
    • Кстати, а как эту задачу решают в обычной ситуации? Может, где-то есть небольшой модуль replaceall для Node?
      Регулярки с g - интересно, но (1) их надо учить ради этого и (2) как быть с произвольными строками?
      Ответить
      • Лучше использовать регулярные выражения с модификатором g ("глобальный").
        Допустим, мы хотим убрать все пробелы в строке тремя различными способами, можно сравнить их быстродействие:
        st=st2=st3=document.body.innerHTML
        //вариант выше
        console.time('test1');
        while(st.indexOf(" ")!=-1) st=st.replace(" ","");
        console.timeEnd('test1');
        //split + join
        console.time('test2');
        st2=st2.split(' ').join('');
        console.timeEnd('test2');
        //используем регулярные выражения
        console.time('test3');
        st3=st3.replace(/ /g,'');
        console.timeEnd('test3');
        Ответить
        • А если всякие []{}() в строке, экранировать придётся. С пользовательским вводом регулярки просто так не используешь.
          Либо быстро и для конкретных строк, либо медленно. Нехорошо это.
          Ответить
          • > С пользовательским вводом регулярки просто так не используешь.

            мне казалось что они PCRE? или нет? в PCRE можно \Q & \E пользоваться - в пользовательском вводе надо только `\` эскэйпить.
            Ответить
            • Было бы ближе к хорошему.
              Но я такого в JS не видел, в популярных реализациях тоже не наблюдается.
              Ответить
      • В ноде только есть модуль IsNumber
        полезных модулей та мнет
        Ответить
        • Это всё московитская пропаганда! Порошенко лично видел паспорта полезных модулей в Ноде:
          https://www.npmjs.com/search?q=useable
          Ответить
          • >>http-code-parser mewejo
            >>Parser for HTTP status codes, turning them into something more useable.
            какие-то распятые мальчики же
            Ответить
        • Стоит отметить, что в жс IsNumber вполне полезен.
          Ответить
          • да, именно так

            JS настолько хуевый язык, что в нем реально нужен IsNumber
            Ответить
      • >/./g - неинтересно
        А как же любимый фсеми функцианальный подход:? foreach по строке как-никак.
        Или как это в терминах хацкиля: map filter fold
        с ecma6 питушнёй => даже писать немного.
        Ответить
      • Я б вообще в js не добавлял, а выпиливал функционал. with и for~in, switch сразу нахуй. Прототипы наверное тоже. Классы однозначно нахуй.

        Можно было б даже пойти на радикальные меры и выпилить классическую императивную часть if/for/while, заменив функциями IF(condition() , then(), else()), WHILE (cond,body)
        Тогда сахарок => обоснован.

        WITH(very.very.long_term,(_)=>
           _.foo=bar;
        )
        Ответить
        • > А как же любимый фсеми функцианальный подход
          Решение! Только хотелось бы чего-то стандартного, оптимизированного какими-нибудь экмацарями.

          > Прототипы наверное тоже
          Полезная штука, только для Object сделать методы has, hasnot, get, set, чтоб операции над объектами работали для хэшей. Ну и функцию наследования полей добавить. Если не фичами и сахарком, то хоть функциями у Object это осуществить. Ещё хорошо бы иметь Object.proto(obj) и Object.this(obj), которые возвращают прототип и сам объект без прототипа соответственно.

          > (_)=>
          Эти скобки даже опустить можно было. Любопытное решение получается.
          Правда, для функции с несколькими выражениями придётся {} добавить, в конце будет знаменитое });

          Вообще, что на жс ни пиши, в конце всегда к }); приходишь.
          Ответить
          • >Полезная штука
            Её использование навязывает убогие т.н. js-классы => ООП.
            Язык и без этого очень функциональный и тьюринг полный.

            >Ну и функцию наследования полей добавить.
            Меня уже тошнит при слове "наследование". Реально ведь херовый способ повторного использования.
            И чего все всё норовят в js жабу притащить.

            Плюс эти блядские вечно торчащие поля valueOf и toString. Не раздражают, не?

            JSON.stringify(obj) нормально ведь работает. Без всяких прототипов. Но нет, блядь хочу методы через точку вызывать.
            Ответить
            • > Меня уже тошнит при слове "наследование".

              А расскажите-ка про хорошие способы повторного использования.
              Ответить
              • >А расскажите-ка про хорошие способы повторного использования.
                Анонимные поля в go, трейты/миксины.
                Ответить
              • тащемто красивое делегирование вполне себе замена

                наследовать хорошо интерфейсы (или протоколы или абстрактные классы)

                А когда у тебя 5 уровней наследования то ОЧЕНЬ СЛОЖНО сделать ВНЯТНЫЙ интерфейс и понять что где кого переопределило, особенно когда у тебя жаба и все оверрайдится по умолчанию

                А уж если у тебя есть виртуальные и невиртуальные методы (разные языки со словом Си) то еще круче
                Ответить
                • Замена чему? наследованию?

                  Есть класс Man у которого есть метод go есть класс Woman которому нужно сделать метод goBarbershop
                  Давай делегируй
                  Ответить
                  • Ради бога. Интерфейс HumanWithLegs с методом go(), у него реализация SimpleHuman с методом go(), внутри Man и внутри Woman есть инстанс этого HumanWithLegs.

                    Оба наследуют интерфейс HumanWithLegs и передают туда вызовы.

                    Гугли "замена делегирования наследованием".
                    Ответить
                  • наследование ненужно.
                    Ответить
                    • Есть ли смысл заменять иерархическую структуру полноценным АОП? То есть писать шото типа
                      entity Abstract
                      а потом сверху обмазывать декораторами с готовой реализацией
                      Ответить
                      • будет похоже на миксины тогда
                        Ответить
                        • О чём и речь. Существуют ли в принципе языки/фреймворки исключительно на миксинах?
                          Ответить
                    • Потому что легко заменяется кодогенерацией. Да и вообще копировать код гораздо проще, чем писать универсальный. Даже сопровождение копипасты не такое трудное, как сопровождение кода использующего наследование. Го - наглядное тому доказательство.

                      Пару недель назад меня озадачили приделыванием gometalinter к нашему проекту. В его состав входит линтер который ищет явно скопипащеный код. Я запустил и заплакал. Потом подумал, и решил ему скормить несколько относительно больших сторонних проектов, и тут я понял, что жопа она универсальная. Хваленое отсутствие наследования в Го не оставит копипастеров без работы. Я даже удалил парочку интерфейсов, и заменил их копипастой: всего-то нужно было скопировать раза три или пять - подумаешь, мелочи.
                      Ответить
                      • > линтер который ищет явно скопипащеный код
                        И ругается на остальной?
                        Ответить
                        • Нет, он ищет куски в которых код почти повторяется. Ну там одo-два словах разных на десяток строк. Любой код на Го состоит из такого говна примерно наполовину.
                          Ответить
                          • > состоит из такого говна примерно наполовину
                            А линтер ругается на оставшийся код, чтобы не выябывались, а копипастили, как нормальные люди.
                            Ответить
                            • Линтер, который ругается на любой кусок кода, которого нет на SO.
                              Ответить
                      • >всего-то нужно было скопировать раза три или пять - подумаешь, мелочи

                        Одинаковые куски кода выносятся в функцию, везде торчит ссылка и вуаля!
                        Ответить
                      • [quote]
                        Да и вообще копировать код гораздо проще, чем писать универсальный. Даже сопровождение копипасты не такое трудное, как сопровождение кода использующего наследование
                        [/quote]

                        Сивокобыл конечо запредельный питух, просто шоколадные треды говнокода
                        Ответить
                    • Не нужно в большинстве случаев
                      Ответить
        • Заменяем все виды скобок на круглые. И получаем lispговно
          Ответить
          • Не получим. Но приблизимся :)
            Тела функций ведь не инфиксные.
            Ответить
    • http://acm.timus.ru/problem.aspx?num=1324&locale=ru

      Если и вам мешают пробелы, попробуйте найти свой способ самой быстрой замены. Предположим, что в тексте есть подстроки длиной не более чем в L пробелов (могут встречаться строки пробелов любой длины от 1 до L). Ваша задача — определить минимальное количество замен, исправляющих группы подряд идущих пробелов на один, и составить план проведения таких замен. Если таких планов несколько, то вы должны выбрать среди них оптимальный — такой, который позволяет заменить любую последовательность пробелов длины не более K (K ≥ L) для максимально возможного K. Если есть несколько оптимальных планов замены, можете вывести любой из них.
      Ответить
    • То-ли дело "Python"...
      >>> string = 'hui hui hui'
      >>> string.replace(' ', '')
      'huihuihui'
      Ответить

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