Comments 35
лет 5 назад писал более продвинутый язык запросов)
forum.vingrad.ru/forum/topic-182406.html
forum.vingrad.ru/forum/topic-182406.html
0
Хорошая вещь. Но не стоило называть это произвольным именем — «steelToe». Ведь на самом деле это у вас только 2е функции. И сходу взглянув на код не понятно, что происходит — не было бы органичней статично расширить объект
И тогда думаю всем понятно, что конкретно происходит —
Object
?! копипаст с проекта
Object.getProperty = function(o, chain) {
if (typeof o !== 'object' || chain == null) return o;
if (typeof chain === 'string') chain = chain.split('.');
if (chain.length === 1) return o[chain[0]];
return Object.getProperty(o[chain.shift()], chain);
}
Object.setProperty = function(o, xpath, value) {
var arr = xpath.split('.'),
obj = o,
key = arr[arr.length - 1];
while (arr.length > 1) {
var prop = arr.shift();
obj = obj[prop] || (obj[prop] = {});
}
obj[key] = value;
}
И тогда думаю всем понятно, что конкретно происходит —
Object.getProperty(obj,'car.model.year'); Object.setProperty(obj,'car.model.year',2012);
0
Поддерживаю. В AtomJS так и реализовано и на практике бывает удобно:
atom.object.path.get( sourceObject, 'car.model.year' );
atom.object.path.set( targetObject, 'car.model.year', 2012 );
+1
Object.getProperty = function(o, chain) — это же отсюда github.com/tenbits/RuqqJS/blob/master/lib/utils.js
0
Всё верно, поэтому так и написал — «копипаст с проекта» ;)
0
ну судя по jsperf.com/steeltoe-vs-try/4 это и самый шустрый способ
0
«Эй, ямщик объект, поворачивай к чёрту не стреляй мне в ногу»…
-1
Библиотека из 45 строк?!
Что дальше? 10 строк? Библиотеки-ванлайнеры?
Сниппет это.
Что дальше? 10 строк? Библиотеки-ванлайнеры?
Сниппет это.
+1
UFO just landed and posted this here
Ваш вариант хорош и даже быстрее, НО что мы получаем данным решением —
- Reflection — иногда мы не знаем цепочки ключей изначально
- + setter — ведь ваше решение это не предусматривает
0
UFO just landed and posted this here
Try/catch никогда не будет быстрее — отлов ошибок всегда ресурсоемкая и медленная операция.
0
Магия. Оказывается, не всегда (:
0
Ого, а ведь на самом деле. Никогда try..catch не использую, но по другим соображениям — и поэтому не сталкивался с его производительностью.
0
UFO just landed and posted this here
UFO just landed and posted this here
На самом деле намного важнее семантическая составляющая и читабельность кода. Куда лучше писать
чем
Первое просто более логичное.
value = path.get( object, 'father.info.name' )
чем
try {
value = object.father.info.name;
} catch (e) {
value = null;
}
Первое просто более логичное.
0
Собственно try..catch — это неконтролируемое поведение приложения — а это уже, что-то не так. Посмотрим на С# — там исключения использую часто, но желательно «контролируемые» исключения:
В принципе, мы и generic исключения ловим, но желательно, что бы в последний catch не заходили.
Так и с javascript, там где мы думаем, что может быть ошибка — проверяем данные на валидность, а если код с валидными данными не справляется — это бага. А что бы быть уверенным, что все хорошо на клиенте работает, есть небольшой ExcpetionHandler класс, который слушает window.onerror и «говорит» пользователю, что «что то пошло не так». И по желанию отсылает на сервер stack trace, script url и lineNumber.
try { /* .. */ }
catch(IOException e){ /* .. */ }
catch(SecurityException e) { /* .. */ }
...
catch(Exception e) { /* .. */ }
В принципе, мы и generic исключения ловим, но желательно, что бы в последний catch не заходили.
Так и с javascript, там где мы думаем, что может быть ошибка — проверяем данные на валидность, а если код с валидными данными не справляется — это бага. А что бы быть уверенным, что все хорошо на клиенте работает, есть небольшой ExcpetionHandler класс, который слушает window.onerror и «говорит» пользователю, что «что то пошло не так». И по желанию отсылает на сервер stack trace, script url и lineNumber.
0
И ещё что забыл добавить — у данных бывают разные проценты риска. Поэтому не каждая функция проверяет данные. Здесь подробнее уже было на хабре — Концепция Баррикады
0
CoffeeScript:
father.info?.name?.first
0
а что на выходе? в js?
0
Можете сами попробовать — coffescript. Жмите «Try Coffeescript» и вставляйте эту строчку: «temp = father.info?.name?.first»
Будет —
Будет —
var temp, _ref, _ref1;
temp = (_ref = father.info) != null ? (_ref1 = _ref.name) != null ? _ref1.first : void 0 : void 0;
0
Очень бы помогла реализация этих функций, как часть какого-либо фрейма. Было бы удобно их использовать, как коробочные варианты js-фреймворка.
0
Сам по себе уровень вложенности подразумевает некую абстракцию, не обязательно количество уровней вложенности один к одному равно уровням абстракции, но если у вас на один уровень абстракции приходится объект с 3+ сложениями — у вас что-то не так с архитектурой. Стоит подумать что не так и решить проблему, а не заливать всё «сахаром»
0
Тест писать лень, но судя по сырцу оно покалечит изначальный объект при аутовивификации, вот в таком случае
Причем молча, что очень плохо. Тут блин, много всякой фигни такой…
original_obj =
foo :
bar : [10,20]
steelToe(original_obj).set 'foo.bar.baz', 'test'
Причем молча, что очень плохо. Тут блин, много всякой фигни такой…
0
Sign up to leave a comment.
SteelToe — object, не стреляй мне в ногу!