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

    +159

    1. 1
    2. 2
    3. 3
    if (($("#menu-main").find("li span").is(".active")) && ($("#nav-wrapper").find("nav").is("#children_for_" + $("#menu-main").find("li span.active").parent("li").attr("id")))) {
        ...
    }

    ...

    Запостил: tir, 02 Июля 2012

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

    • LINQ!
      Ответить
    • Ну я не раз видел ситуацию типа:
      $('#something').parent().parent().parent().parent().parent().last();
      Ответить
      • Да она и на гкоде много раз была.
        Кто-то тут даже предлагал: нужен parent(N), оно конечно полезно, но думаю children и has на них нету.
        Ответить
        • Ну да, ещё и child(N).
          А вообще, подавляющее большинство такого кода заменяется чем-то вроде closest() или find().
          Ответить
      • In a far far far far far far far far galaxy...
        Ответить
        • long().long().long().long().long().time( ).ago();
          Ответить
          • I.like().fluent().api();
            Ответить
            • а в groovy 2.0 можно написать
              I like fluent api
              Ответить
              • Попробовал запилить такое в Scala: она упорно отказывается кушать такие конструкции. Собственно, правильно делает: пойми тут, как это должно правильно интерпретироваться (пусть I - инстанс):
                I.like().fluent().api()
                I.like(fluent, api)
                I.like(fluent).api()
                Ответить
                • груви скорее всего воспримет так:
                  I.like(fluent).getApi()
                  Ответить
                  • Вот-вот: Scala тоже хочет fluent в качестве аргумента like и ругается на слишком большое количество аргументов.
                    Ответить
      • В Лиспе для таких вещей придуманы: caar, cadr, cddr, caadr, caddr, cdddr, cdadr, cdaar и т.д. В Й-квери можно было бы тоже что-нибудь такое добавить, например:
        $("element").pparent();
        $("element").ppparent();
        . . .
        $("element").pppppppparent();

        Просто раньше моя идея про то, чтобы передавать параметр в parent(x) не прижилась :(
        Ответить
        • зато можно указать селектор парента
          Ответить
        • И как это будет на уровне либы? Генерировать код для ста функций
          (вплоть до paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaarent) и проставлять их прототипы в цикле?
          > моя идея про то, чтобы передавать параметр в parent(x) не прижилась
          Ну она хоть звучит здраво и вполне вменяемо.
          Ответить
          • Ну почему, можно весь код завернуть в try-catch, если ловим ошибку о попытке доступа к неизвестному свойству, парсим сообщение об ошибке, и создаем свойство.

            Хотя, конечно, с идеей я сплоховал, копировать, так уж полностью:
            $("element").papaparent(); // эквивалентно parentNode().firstChild.parentNode().firstChild.parentNode();
            $("element").ppparent(); // эквивалентно parentNode().parentNode().parentNode()
            :)
            Ответить
            • па-па-па па!
              Ответить
              • Нужно было ещё добавить методы
                $("element").mother().father().sister().brother();
                // ppparnet is not readable enough!!!
                $("element").grandgrandgrandmother()
                Ответить
                • Кстати, python способен на такое
                  http://ideone.com/vwUwo
                  а вот на JS, уверен, такое запилить не получится :)
                  Ответить
                  • Только если свой интерпретатор запилить. Можно, как я уже говорил, ловить ошибку вызова несуществующей функции, но только внутри своей функции. С другой стороны - так многие и пишут, т.е. заворачивают весь код в одну функцию. Так что...
                    (function () {
                        "use strict";
                        try {
                            var o = { toString : function () { return "[Object o]"; } };
                            o.parent();
                        } catch (e) {
                            // called parent on [Object o]
                            console.log("called " + e.arguments[0] + " on " + e.arguments[1]);
                        }
                    })();
                    Ответить
                    • Да, но это только в V8, в Симанки можно получить имя неправильной функции, а вот объект - не, только его "название". Но через eval() и до него добраться можно будет.
                      (function () {
                          "use strict";
                          var caller, method, o = { toString : function () { return "[Object o]"; } };
                          try {
                              o.parent();
                          } catch (e) {
                              // called parent on [Object o]
                              caller = e.message.substring(0, e.message.indexOf("."));
                              method = e.message.substring(caller.length + 1, e.message.indexOf(" "));
                              console.log("called " + method + " on " + eval(caller));
                          }
                      })();

                      Версия для Мозилы.
                      Ответить
                    • Это совсем не то: клиент такого API должен сам заботиться о перехвате исключений и парсинге имён вызванных функций, что совершенно бесполезно. В python эта логика инкапсулирована в классе и прозрачна для пользователя API (пользователь не знает, реализован ли метод явно или генерируется налету, но в теории может узнать, если очень захочет).
                      Ответить
                      • /совсем не/не совсем/s
                        и все становится на свои места.
                        Ответить
                        • Сфера - не совсем куб: есть гомеоморфизм, преобразующий одну поверхность в другую.
                          Сфера - совсем не "сфера с дыркой" - гомеоморфизма нет.
                          Ответить
                • Загадка:
                  "Кем элементу приходится брат сестры отца его матери?"
                  Ответить
            • >если ловим ошибку о попытке доступа к неизвестному свойству, парсим сообщение об ошибке, и создаем свойство
              адЪ. если бы такая фича появилась - я бы немедленно запостил на этот сайт.
              Ответить
              • По мотивам:
                http://stackoverflow.com/questions/6240033/mutable-versions-of-cadr-caddr-etc
                Ответить

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