08.12.2014, 01:09
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от krutoy
|
Любая функциональщина -- это дрочево под оптимизатор
|
похоже , что у нас тут типичное неприятие нового
Сообщение от bes
|
сколько у вас часов в сутках?
|
раньше было около тысячи , сейчас - такое чувство, что в сутках 6 часов, не больше
но раньше сутки были длиннее, да
|
|
08.12.2014, 03:31
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от nerv_
|
мой полный ответ был здесь.
|
И заметь, что так называемый "твой ответ" появился уже после того, как я тебя ткнул лицом в это говно. А ты должен был не отвечать бесу, а в первом же посте указать на эти ограничения ТСу. Но ты этого не сделал по той причине, что пока я тебя не ткнул в твое говно, ты об этом и не думал и не знал. А вместо спасибо, ты начал борзеть, и именно по этой причине окончательно был слит в гавно.
Последний раз редактировалось krutoy, 08.12.2014 в 03:36.
|
|
08.12.2014, 10:12
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
krutoy, припекло тебя
Сообщение от krutoy
|
А ты должен был
|
я никому ничего не должен
Я показал свою реализацию, которой мне хватает более чем. Да, у нее есть ограничения. Если тот, кто ее использует не способен их увидеть - это его проблемы)
Сообщение от krutoy
|
как я тебя ткнул лицом в это говно
|
Пожалуйста, не тяни меня в свое говно, в кот. ты плаваешь постоянно. Ты сделан из него, им пропитан, плохо воспитан и, вообще, говорить с тобой мне не о чем. Не сейчас, не в будущем.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
08.12.2014, 10:26
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Цитата:
|
Не сейчас, не в будущем.
|
Ни.
|
|
08.12.2014, 10:35
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
вот оно че, Михалыч
комментарии излишни)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
08.12.2014, 19:51
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от krutoy
|
Слушай, честно, мне лень разбирать примеры "вечного двигателя". Понять бессмысленность данной затеи легко. Смотри. В JS объект получается по ссылке. Легко понять, что закэшировать его можно только одним способом -- сохранив ссылку на него в кэше. Естественно, если объект меняется, то из кэша ты получаешь неактуальные значения. Этого понимания достаточно, чтобы прекратить эти нелепые попытки
Но это не значит, что мы не можем кэшировать какие то частные случаи. Например, можно часть объектов сделать неизмняемыми. чтоб они работали как простые хэши, можно работать с примитивами, не вызывая их в объектном контексте, и т.п. Это сделать легко.
|
смотри: есть объект, есть его состояние, кешируем ссылку на объект и его состояние, если ни ссылка, ни состояние не изменилось, можно обращаться к кешу
в моём последнем примере как раз так и делается, с учётом того, что ссылку сохранить не проблема, а сохранение состояния можно реализовывать с различной степенью сложности
|
|
08.12.2014, 20:33
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
bes,
Не взрывай мне мозг
function f(obj) {
return obj.a + obj.b;
}
function isSame(args1, args2) {
var len1 = args1.length;
var len2 = args2.length;
if ( len1 != len2 ) return false;
for (var i = 0; i < len1; i++) {
if ( args1[i] === args2[i] ) continue;
return false;
}
return true;
}
function cacheFn(fn) {
var cache = [];
return function () {
var len = cache.length;
for (var i = 0; i < len; i++) {
if ( isSame(cache[i].args, arguments) && JSON.stringify(arguments) == cache[i].strArg) {
console.log("cache: " + cache[i].res + "\n\n");
return cache[i].res;
}
}
cache.push( {args: arguments, strArg: JSON.stringify(arguments), res: fn.apply(this, arguments)} );
console.log("call: " + cache[len].res + "\n\n")
return cache[len].res;
}
}
var cacheF = cacheFn(f);
o={b: 2}
var o1 = Object.create(o)
o1.a = 1
cacheF(o1);
o.b=10
console.log("----");
cacheF(o1);
console.log("****");
cacheF(o1);
// call: 3
//
//
// ----
// cache: 3
//
//
// ****
// cache: 3
|
|
08.12.2014, 22:43
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от krutoy
|
bes,
Не взрывай мне мозг
|
лови fuel injection, possibly with slices of shit
ещё куча непокрытого, но твой случай покрывает
function type(el) {
var type = typeof el;
if ( type != "object" ) return type;
if ( el == null ) return "null";
if ( el.length || el.length >= 0 ) return "array";
return "object";
}
function len(obj) {
var n = 0;
for (var key in obj) {
n++;
}
return n;
}
function isEqual(obj1, obj2) {
if ( type(obj1) != "object" && type(obj2) != "object" ) return obj1 == obj2;
if ( len(obj1) != len(obj2) ) return false;
for (var key in obj1) {
if (obj1[key] === obj2[key]) {
continue;
}
return false;
}
return true;
}
function cloneObject(obj) {
var clone = {};
for (var key in obj) {
clone[key] = obj[key];
}
return clone;
}
function isSame(args1, args2) {
var len1 = args1.length;
var len2 = args2.length;
if ( len1 != len2 ) return false;
for (var i = 0; i < len1; i++) {
if ( isEqual(args1[i], args2[i]) ) continue;
return false;
}
return true;
}
function giblets(args) {
var giblet = [];
var length = args.length;
for ( var i = 0; i < length; i++ ) {
if ( type(args[i]) != "object" ) {
giblet.push(args[i]);
} else {
giblet.push( cloneObject(args[i]) );
}
}
return giblet;
}
function cacheFn(fn) {
var cache = [];
return function () {
var len = cache.length;
for (var i = 0; i < len; i++) {
if ( isSame(cache[i].args, giblets(arguments)) ) {
console.log("cache: " + cache[i].res + "\n\n");
return cache[i].res;
}
}
cache.push( {args: giblets(arguments), res: fn.apply(this, arguments)} );
console.log("call: " + cache[len].res + "\n\n")
return cache[len].res;
}
}
function f(obj) {
return obj.a + obj.b;
}
var cacheF = cacheFn(f);
o={b: 2}
var o1 = Object.create(o)
o1.a = 1
cacheF(o1);
cacheF(o1);
o.b=10
console.log("----");
cacheF(o1);
cacheF(o1);
|
|
09.12.2014, 00:03
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
krutoy,
function isSame(args1, args2) {
var len1 = args1.length;
var len2 = args2.length;
if ( len1 != len2 ) return false;
for (var i = 0; i < len1; i++) {
if ( args1[i] === args2[i] ) continue;
return false;
}
return true;
}
и
function isSame(args1, args2) {
return args1 === args2;
}
Это напомнило мне прошлую неделю. Задание было переписать самописный ACl в самописном движке.
Час я смотрел на этот код и не мог понять, что здесь было написано. Я хотел понять мысль того разработчика который это написал. Это был запрос на пол-страницы , пришлось и по гуглить так как некоторые операторы я встретил впервые, а также много рекурсивных функций. Копаться в этом дерьме не было особого интереса. Решение было интересное. Пару проведенных тестов подача одних параметров на вход привело к очевидности к замене 300 строк кода 3 строками. Тестировщик позже подтвердил правильность решения.
В общем к чему я. Приведенный в начале топика код напоминает напоминает шаблон Реестр (Registry)
|
|
09.12.2014, 07:30
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Poznakomlus,
Да, но ваша ассоциация, кстати, не совсем к месту . Все таки "выяснить, указывают ли 2 ссылки на один и тот же объект(массив)" и "имеют ли 2 объекта (массива) идентичную структуру" это далеко не одно и то же.
|
|
|
|