Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 07.12.2014, 21:03
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

krutoy, не вижу смысла с тобой спорить. Ты уже показал себя на форуме

bes, мой полный ответ был здесь. По сути на этом тема должна быть исчерпана.
Даже если в функцию передается объект с параметрами, то:
1. либо он чистый [new Object()]
2. либо, в большинстве случаев его следует интерпретировать как чистый. Например:
foo({bar: 1});
foo({bar: 1}); // какой смысл от того, что это другой объект, если это всего лишь "объект с параметрами"?
т.е. просто глупо тут разницу показывать или нет смысла хранить в массиве ссылки на объекты (если реализация через массивы)

На все негодования кукарекония krutoy, опять-таки, мой ответ был по ссылке выше - смотрите исходники lowdash, там все есть. Для тех, кто кукарекает и не читает ссылки, а в частности krutoy, напишу примерный код того, как эта функция выглядит в lowdash:

var fn = function() {
    console.log(1);
};
var foo = memoize(fn);

foo({a:1}); // 1
foo({a:1}); //

var bar = memoize(fn, function() {
    return Date.now();
});

bar({a:1}); // 1
bar({a:1}); // 1

/**
 * @param {Function} fn
 * @param {Function} [identify]
 */
function memoize(fn, identify) {
    var cache = {};
    var getKey = identify || JSON.stringify;

    return function() {
        var key = getKey(arguments);
        if (!cache.hasOwnProperty(key)) {
            cache[key] = fn.apply(this, arguments);
        }
        return cache[key];
    };
}
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #32 (permalink)  
Старый 07.12.2014, 21:28
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от nerv_
объект с параметрами
Ты, для начала, осиль значение слова параметр. А говорить, действительно, не о чем. Набор базвордов и отборного бреда.
Ответить с цитированием
  #33 (permalink)  
Старый 07.12.2014, 21:54
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от krutoy
В частности, многие кукарекают о якобы, поддержке JS ФП, чего и близко нет в реальности (и не нужно), если следовать современной трактовке, где во главе угла иммутабельность.
в ФП во главе угла - функция. ну а иммутабельность и остальные плюхи капают с понятия "функция".

в JS с функциями все в порядке, кроме того, что они медленные.

учитывая моду на ФП (баззворд "функциональщина, йо"), в стандарте ES >= 7 я ожидаю появление плюх для комфортного написания кода в этой парадигме.

кстати, если ты так против ФП и иммутабельности - глянь React, Morearty и ClojureScript. это всё не спроста появилось.

... и не спроста оно всё такое "революционное"

лечись от ООП головного мозга

(написано как троллинг, но сим не является)

Сообщение от krutoy
А, если речь только лишь о примитивах, тогда ок, только тогда надо отдельно указывать, что массивы, регекпы, функции, объекты, объекты строк, объекты чисел и прочая и прочая, то есть, пости все, иными словами, запрешены в качестве аргументов.
ага, именно.
Сообщение от nerv_ Посмотреть сообщение
Ну, и, разумеется, такая функция принимает только примитивы + json like objects. Если очень хочется пихать объекты с циклическими ссылками, то массивы.
Sieg Heil, nerv_

Сообщение от bes
хранение информации в ключах объекта - это из области гениального
обычный хешмап. ты походу пропустил тему марума с задачками по JS - там гениальной жары было навалом сейчас эта тема удалена
Ответить с цитированием
  #34 (permalink)  
Старый 07.12.2014, 22:05
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от melky
это всё не спроста появилось.
Не спроста. Любая функциональщина -- это дрочево под оптимизатор. Когда у тебя есть иммутабельность, ты можешь провернуть такой вот трюк, например
(function f(arg){return foo})(function_with_long_calculation())

Если ты знаешь, что функция function_with_long_calculation чистая, ты можешь редуцировать эту строку до foo в компилтайме.
И при таком раскладе, бредореализация кэширования нерва действительно могла бы работать. В JS это все ни к чему, это экстремально динамичный язык, тут делается упор на выразительность и мозги программиста. А то что ты приводишь, правильно, это мода, когда многие недоумки слышали звон, да не знают где он, но зато знают, что это модно, поэтому пишут ахинею.

В принципе, в JS наверняка код, написанный в ФП-стиле оптимизируется лучше, но это не значит, что надо на это дрочить постоянно.
Ответить с цитированием
  #35 (permalink)  
Старый 07.12.2014, 22:46
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от nerv_
Ну, и, разумеется, такая функция принимает только примитивы + json like objects. Если очень хочется пихать объекты с циклическими ссылками, то массивы.
Во первых, покажи мне в стандарте, где есть понятие "json-like-objects", товарищ Петросян.
Про примитивы -- это еще вопрос, поскольку в JS любой примитив может быть вызван в объектном контексте.
Насчет массивов -- не п*ди, массивы -- это 100% объекты.

И наконец, 3-й раз спрашиваю, при чем тут циклические ссылки?
Ответить с цитированием
  #36 (permalink)  
Старый 07.12.2014, 22:49
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от nerv_
bes, мой полный ответ был здесь. По сути на этом тема должна быть исчерпана.
Сообщение от nerv_
Ну, и, разумеется, такая функция принимает только примитивы + json like objects. Если очень хочется пихать объекты с циклическими ссылками, то массивы.
возможно не заметил/не обратил внимания

Сообщение от nerv_
Для тех, кто кукарекает и не читает ссылки
Сообщение от melky
обычный хешмап. ты походу пропустил тему марума с задачками по JS - там гениальной жары было навалом сейчас эта тема удалена
сколько у вас часов в сутках?

Сообщение от nerv_
Если очень хочется пихать объекты с циклическими ссылками, то массивы.
пойдёт?

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) ) {
				console.log("cache: " + cache[i].res + "\n\n");
				return cache[i].res;
			}
		}
		cache.push( {args: arguments, res: fn.apply(this, arguments)} );
		console.log("call: " + cache[len].res + "\n\n")
		return cache[len].res;
	}
}

var cacheF = cacheFn(f);
var o1 = Object.create({b: 2})
var o2 = Object.create({b: 3})
o1.a = 1
o2.a = 1
cacheF(o1);
cacheF(o1);
cacheF(o2);
cacheF(o2);
Ответить с цитированием
  #37 (permalink)  
Старый 07.12.2014, 22:53
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от bes
возможно не заметил/не обратил внимания
bes,
А ты и дальше не обращай, поскольку это тоже полуп*больство, см мой пост выше.
Function Cache
Ответить с цитированием
  #38 (permalink)  
Старый 07.12.2014, 22:58
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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) ) {
                console.log("cache: " + cache[i].res + "\n\n");
                return cache[i].res;
            }
        }
        cache.push( {args: arguments, res: fn.apply(this, arguments)} );
        console.log("call: " + cache[len].res + "\n\n")
        return cache[len].res;
    }
}
 
var cacheF = cacheFn(f);
var o1 = Object.create({b: 2})
var o2 = Object.create({b: 3})
o1.a = 1
o2.a = 1
cacheF(o1);
cacheF(o1);
cacheF(o2);
cacheF(o2);

o2.a = 10
cacheF(o2);
//  call: 3
//  
//  
//  cache: 3
//  
//  
//  call: 4
//  
//  
//  cache: 4
//  
//  
//  cache: 4

И не мучайся. В JS в общем случае, кэширование невозможно.
Ответить с цитированием
  #39 (permalink)  
Старый 08.12.2014, 00:23
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от krutoy
И не мучайся. В JS в общем случае, кэширование невозможно.
хорошо, но давай двинемся на шаг дальше

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);
var o1 = Object.create({b: 2})
var o2 = Object.create({b: 3})
o1.a = 1
o2.a = 1
//cacheF(o1);
//cacheF(o1);
cacheF(o2);
cacheF(o2);

console.log("----");
o2.a = 10
cacheF(o2);
cacheF(o2);

console.log("****");
o2.b = 10;
cacheF(o2);
cacheF(o2);


есть ещё примеры?

Последний раз редактировалось bes, 08.12.2014 в 00:26.
Ответить с цитированием
  #40 (permalink)  
Старый 08.12.2014, 00:42
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от bes
хорошо, но давай двинемся на шаг дальше
Слушай, честно, мне лень разбирать примеры "вечного двигателя". Понять бессмысленность данной затеи легко. Смотри. В JS объект получается по ссылке. Легко понять, что закэшировать его можно только одним способом -- сохранив ссылку на него в кэше. Естественно, если объект меняется, то из кэша ты получаешь неактуальные значения. Этого понимания достаточно, чтобы прекратить эти нелепые попытки
Но это не значит, что мы не можем кэшировать какие то частные случаи. Например, можно часть объектов сделать неизмняемыми. чтоб они работали как простые хэши, можно работать с примитивами, не вызывая их в объектном контексте, и т.п. Это сделать легко.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сабытие Onchange serrrgggeee Javascript под браузер 1 25.09.2014 10:11
jQuery научите пользоваться. Станислав89 Общие вопросы Javascript 10 19.12.2013 23:01
вопрос про кнопку javascript Ruxx Общие вопросы Javascript 9 22.01.2013 21:01
Свойства посредством полиморфных функций tenshi Ваши сайты и скрипты 0 18.03.2010 17:12
Модуль для работы с геометрией окна JSprog Библиотеки/Тулкиты/Фреймворки 25 31.08.2009 12:54