• Именование переменных: "removeSmth" vs "deleteSmth"?

    @xpostman Автор вопроса
    Про аналогию с find/search я раскрыл тему в комментарии выше.

    Ещё я знаю как минимум один кейс, когда использование delete в названии метода выглядит логичным — если этот метод приводит к sql-вызову delete. Но тут уже мы просто переложили всю ответственность об именовании действия на разработчиков sql :)
  • Именование переменных: "removeSmth" vs "deleteSmth"?

    @xpostman Автор вопроса
    Я имел в виду вот что. Хорошее название для метода становится в некотором смысле дополнительной документацией.

    Например:

    Про функцию findSmth( what ) я предполагаю, что она вернёт мне найденный объект. Возможно, только первый найденный. Ещё я думаю, что в случае неудачи, она вернёт null или false.

    От функции searchForSmth( criteria ) я буду ожидать массив (список) с результатом поиска. В случае если ничего не найдено, я думаю, такая функция должна будет вернуть пустой массив. Но не false.

    Это первый шаг. Когда я вижу метод объекта с некоторым названием — даже не читая коммента (не говоря уже о документации) я могу очень быстро этот объект затестить. Если мои ожидания совпадают с действительностью — это значительно ускорит разработку.

    В общем, идея состоит в том, чтоб именовать объект (функцию) так, чтоб разработчик мог получить полезную информацию. Наиболее полно мой вопрос, наверное, звучит как «Можно ли выбирая между remove… и delete… повлиять на количество полезной информации, сообщаемой потенциальному будущему хакеру моего кода, как это есть в случае с find и search?» :)
  • Именование переменных: "removeSmth" vs "deleteSmth"?

    @xpostman Автор вопроса
    > Скорее всего вы имели ввиду имена методов.

    Да, про это я написал чуть выше.

    Вообще, здесь, похоже, очень размытая грань между remove и delete :) (что если элемент списка — цельный объект? ;) )
  • Именование переменных: "removeSmth" vs "deleteSmth"?

    @xpostman Автор вопроса
    Здесь, конечно, да, имеются в виду функции. «Именование переменных» — это я так подумал что логично было бы назвать общий вопрос, что ли :)

    PS кроме того, во многих языках переменная может быть и функцией. В частности, JS, на котором я обычно пишу. Видимо, сказалась привычка :)
  • PHP: Как отличить черно-белое изображение от цветного?

    @xpostman
    имхо блюр займёт больше времени, чем обход каждого пиксела :)
  • чем тестировать верстку в ie6?

    @xpostman
    У меня были случаи, когда IE6 portable рендерит лэйаут иначе, нежели чем обычный IE6. Пример, к сожалению, вспомнить не могу, т.к. было давно.

    Поэтому я тестирую на виртуальной машине с IE6 созданной специально для этой цели.
  • Удобный трединг в Javascript?

    @xpostman Автор вопроса
    Ага, теперь я вроде бы понял идею, спасибо.

    Подведу итог. Это я для себя резюмирую, чтоб порядок навести в голове :)

    Во-первых, я тут вдруг осознал, что вопрос никак не относится к postMessage, и может быть точно также поставлен и для setTimeout. В общем виде задача звучала бы так:

    Есть некая функция thread(), которая принимает в общем случае три аргумента — собственно функцию, которую нужно выполнить в «трэде», объект, в контексте которого будет выполняться эта функция, и набор аргументов, передаваемых функции (для простоты, пусть это будет тупо массив). Она может быть реализована например так:

    var thread = function( func, obj, args ) {
        setTimeout(
            function() {
                func.apply( obj, args );
            }, 10
        );
    }
    


    Я хотел придать ей человеческий вид, оформив в виде метода для типа Function. И вроде как вызываться она должна была бы так, как я описал выше:

    (myObject.myMethod).thread( arguments );
    


    Здесь я вставил первые скобки для наглядности, потому что интерпретатор будет в таком порядке их обрабатывать. Итак, выражение в первых скобках возвращает нам [«указатель на» — в сишных терминах] саму функцию. Здесь я говорю о функции, объявленной обычном способом в прототипе, без хаков mootools. Объект myObject уже потерян, и если бы я эту функцию получал из другого объекта того же типа — результат был бы таким же. Контекст сохранился бы только в том случае, если бы я вызывал эту функцию как метод, а здесь я её не вызываю как метод, а оперирую с ней, как с самостоятельным объектом. Поэтому контекст потерян.

    Предложенные воркэраунды такие:

    Первый — аналог bind из mootools. Код не читал, но на вскидку bind должен быть реализован примерно так:

    Function.prototype.bind = function( obj ) {
        var me = this; // сорри за этот приём ;)
        return function() {
            me.apply( obj, arguments );
        }
    }
    


    Это привяжет функцию к контексту и позволить делать с ней всё, что угодно.

    Так я понял предложенное вами решение.

    Почему оно мне не нравится. По двум причинам. Во-первых, каждый такой метод нужно создавать неким «специальным образом». Получается, что мы съедаем память для каждого «экземпляра» такого метода, вместо того, чтобы хранить их в прототипе. Такой же грубый приём, как имитация приватных методов с помощью создания их заново в скопе конструктора для каждого нового экземпляра объекта. Во-вторых, это делает код более запутанным и фреймворко-ориентированным (если есть такое слово :) ). А именно, видя запись

    myObject.myMethod();
    


    я, будучи не знаком с mootools предполагаю, что myMethod взят из прототипа, хотя на самом деле это личный экземпляр объекта myObject.

    Второй воркэраунд — это по сути просто переписанный метод thread, который дополнительно принимает объект. Если я правильно понял, так работает delay в mootools:

    Function.prototype.delay = function( obj, args ) {
        // thread я определил в начале
        thread( this, obj, args );
    }
    


    Это ненамного упрощает код (по сравнению с использованием просто функции thread с явной передачей ей объекта, метода и аргументов). Преимущество здесь — код не запутан, и я не зная хитростей фреймворка могу догадаться, что тут происходит.

    В результате, я бы остановился на явном использовании thread(). Мне кажется, так проще и лучше.
  • Удобный трединг в Javascript?

    @xpostman Автор вопроса
    Спасибо за ваш комментарий. Но:

    > mootools.net/docs/core/Native/Function — Function Method: pass

    — не совсем то, что нужно — аргументы я могу передать и так, у меня проблема с объектом

    > habrahabr.ru/blogs/javascript/103760/

    — это немножко другой вопрос, на мой взгляд даже немного религиозный. Я не разделяю вашу точку зрения по этому вопросу ;), но даже если бы и разделял — здесь мне это не поможет.

    > mootools.net/docs/more/Class/Class.Binds
    — это уже теплее, но вроде бы оно служит для другого. Я не могу сходу придумать, как это может помочь реализовать описанную мной конструкцию. Возможно, это оттого, что я не знаком с mootools, а указанный вами референс просмотрел бегло. Кстати, вроде бы это воркэраунд для какого-то другого воркэраунда из mootools («It saves you the trouble of typing '.bind(this)' when you pass that method as an argument»).

    Вообще, подумав вчера ещё немного над вопросом я стал склоняться к мысли, что это невозможно. Но только я пока не смог строго обосновать почему :)
  • Удобный трединг в Javascript?

    @xpostman Автор вопроса
    да, или ещё такой вариант:

    myObject.myMethod.thread( myObject, arg1, arg2 );
    


    хотя, ваш вариант лаконичнее :) но это всё — воркэраунды :(
  • Необычное использование побитового XOR в Javascript?

    @xpostman Автор вопроса
    добавил комментарии в уточнении к вопросу
  • Необычное использование побитового XOR в Javascript?

    @xpostman Автор вопроса
    На самом деле, помимо бессонной ночи и потраченного времени, я ещё получил кучу удовольствия :)

    Нечасто возвращаясь домой я весь вечер думаю о чём-то с работы.
  • Необычное использование побитового XOR в Javascript?

    @xpostman Автор вопроса
    У меня NDA, так что сорри :(

    Но в этом и нет необходимости.

    Код, который был в окрестности манипулирует элементами нескольких массивов побитово. Мы обсуждали вчера с коллегами, появилась гипотеза, что писать этот код посадили какого-нибудь олдскульного сишника или ассемблерщика. Вроде как, такие выкрутасы для них являются нормальными и не требуют дополнительных комментариев.

    Возможно, побитовый XOR в этом случае всегда приводит к экономии памяти и времени, и чувак написал его не задумываясь безо всякой задней мысли. А мы тут гадаем :)
  • Необычное использование побитового XOR в Javascript?

    @xpostman Автор вопроса
    про погрешность — добавил выше в вопросе.

    а у вас тоже интересный вариант, приму на заметку, спасибо :)
  • Необычное использование побитового XOR в Javascript?

    @xpostman Автор вопроса
    код рукописный, минимайзерами не ужимался.
  • Необычное использование побитового XOR в Javascript?

    @xpostman Автор вопроса
    UPD:

    Как я мерял время?

    Время я мерял так: написал два одинаковых цикла которые проверяли это условие одинаковое «большое число» раз. «Большое число» было достаточно большим, чтобы условие проверялось несколько секунд, но достаточно малым, чтобы броузер не успел пожаловаться на зависший скрипт.

    Затем я прогнал скрипт несколько раз и смотрел результаты.

    После этого для симметричности я поменял циклы местами. И всегда оказывалось что XOR считает чуть-чуть быстрее. Так что, это не похоже на «выброс в пределах погрешности».