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

    +149

    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
    Wreqr.Commands = (function(Wreqr){
      "use strict";
    
      return Wreqr.Handlers.extend({
        execute: function(){
          var name = arguments[0];
          var args = Array.prototype.slice.call(arguments, 1);
    
          this.getHandler(name).apply(this, args);
        }
      });
    
    })(Wreqr);

    из библиотеки которая претендует на популярность, шаблонность (в модном нынче смысле слова) и стэйт-оф-зэ-артность
    вопрос - НАХ8Я СТРОКА 6???????

    Запостил: dimalev, 29 Января 2013

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

    • > НАХ8Я СТРОКА 6
      Как нахуя? Чтобы пояснить что лежит в arguments[0]. Не заменять же код на вот такое:
      var args = Array.prototype.slice.call(arguments, 1);
      this.getHandler(arguments[0]).apply(this, args);
      А то еще седьмую строку захочется убрать:
      this.getHandler(arguments[0]).apply(this, Array.prototype.slice.call(arguments, 1));
      Ответить
      • Твой текст у меня светло-зелёным отображается. Вроде монитор новый... Видимо, сказывается мой дальтонизм. Поясню мысль топикстартера: первый аргумент можно было забиндить через список формальных аргументов. Но с arguments выглядит немного однородней.
        И вообще, в этом коде явно не хватает функций car и cdr
        Ответить
        • А, вот оно что. Ну имхо странно будет смотреться код. Если в тех же плюсах я вижу многоточие, и понимаю, что функция принимает 1+ аргумент. То здесь function(name) { ... } будет смущать читателя, намекая ему о том, что она принимает один аргумент. Хотя с другой стороны комментарий решил бы эту проблему.
          Ответить
        • именно это я и имел ввиду
          но однородность внешнего вида мне кажется слабым аргументом против использования нормального подхода в выкавыривании аргументов фции
          car/cdr это ты жжешь конечно.
          Ответить
          • Жаль, что в жс нет нормального синтаксиса для переменного количества аргументов. Вот например питон:
            def test(name, *args):
                pass
            Или даже сишка (хоть в ней работа с этими аргументами через жопу, но описание функции хотя бы намекает о том, что они могут быть):
            void test(const char *name, ...) {
            }
            Ответить
            • И даже в крестах:
              template<class... A>
              void test(A&&...) {
              }
              Ответить
            • Почему нет? Есть, но пока не везде. Как обычно, ждем es6.
              https://developer.mozilla.org/en-US/docs/JavaScript/Reference/rest_parameters
              http://wiki.ecmascript.org/doku.php?id=harmony:rest_parameters
              Ответить
    • Похоже на лисп, после православного флеша вывернуло моск наизнанку.
      И вот 6 строка меня тут меньше всего смущает )
      Ответить
      • жабоскрипт это scheme в сишном платье
        Ответить
      • > И вот 6 строка меня тут меньше всего смущает )
        согласен, таки строка 7 шикарна
        Ответить
    • Да тут проблема в другом: Wreqr.Handlers.extend уже и так возвращает функцию (это ж бэкбон, не?) - нафиг было ее в еще одну функцию оборачивать? А переменная Wreqr уже захвачена в этой функции, ее туда не нужно передавать вообще, ну и аргумент назвать так же, как и переменную снаружи, и ее же назначить этому аргументу - вот это мозговыносящая конструкция достойная новых веяний жабоскрипта.
      Ответить
      • > Wreqr уже захвачена в этой функции, ее туда не нужно передавать вообще
        А вот здесь я бы поспорил:
        for (var i=0; i<10; i++) {
            register(function () { doSomething(i); });
        }
        Так что, есть вероятность, что таким образом они отвязываются от переприсваиваний Wreqr извне.
        Ответить
        • Так создавать Х одинаковых функций в цикле - не меньшее зло. Но тут вообще смысл самой внешней функции от меня ускользает. Не удивлюсь, если ее сразу же где-то после этого кода один раз вызывают и никогда больше не используют, т.как не могу придумать ситуацию, когда ее можно было бы осмысленно использовать много раз.
          Ответить
        • Такой код обычно контринтуитивен для людей, знакомых с JS поверхностно. Приводит к баттхёрту "Почему у всех коллбеков один и тот же i?".
          Ответить
          • Ну я его для того и привел - код, который приходится заворачивать в еще одну функцию, чтобы он работал так как положено. Вот есть вероятность, что код ОП'а тоже завернули в лямбду, чтобы он не реагировал на переприсваивания Wreqr извне.
            Ответить
            • Да не нужно его заворачивать, ни в этом случае, да и вообще никогда. Если кто-то так делает - то и есть говнокод. Никогда не нужно создавать надцать одинаковых функций, это всегда можно переписать используя одну функцию и цикл / условие / хеш-таблицу.
              Но в этом конкретном случае - попробуйте представить какую-нибудь ситуацию, когда такая функция должна будет вернуть разные результаты и зачем такое может понадобиться? Это как создавать множество функций умножения или сложения.

              Wreqr.Commands = Wreqr.Handlers.extend({
                  execute: function(){
                    var name = arguments[0];
                    var args = Array.prototype.slice.call(arguments, 1);
              
                    this.getHandler(name).apply(this, args);
                  }
                };


              Код должен был выглядеть так, скорее всего, вся внешняя функция вообще не нужна.
              Ответить
              • > Никогда не нужно создавать надцать одинаковых функций, это всегда можно переписать используя одну функцию и цикл / условие / хеш-таблицу.
                А кто тут создает одинаковые функции? Создается всего лишь замыкание - небольшая структурка, хранящая ссылки на захваченные переменные, да ссылку на код функции, который один на всю толпу. Даже несмотря на черезжопный скопинг жса, замыкания во многих случаях удобней одной функции и цикла/хеша в ней.
                Ответить
                • Так если Wreqr никогда не изменяется - то нафига это замыкание? А в этом конкретном случае, это вообще была фабрика фабрик фабрик - в какой ситуации такое может понадобиться?

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

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