Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.06.2014, 19:48
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Collection v5
Всем здрасти!

Закончил работу над Collection 5.

Для тех, кто не в курсе, то что такое Collection.

И так, что нового:

1) Поддержка всех новых видов коллекций и технологий, а именно: Map, Set, WeakMap, WeakSet, генераторов, итераторов на основе протокола @@iterator.

var foo = new Map([[{}, 1], [null, 2]]);

$C(foo).map(el => el * 2) // new Map([[{}, 2], [null, 4]])

function *i() {
    for (let i = 0; i < 10; i++) {
        yield i;
    }
}

$C(i).get(el => el > 5) // [6, 7, 8, 9]


Работает во всех последних версиях браузеров (включая ИЕ).

2) Новый пласт методов и свойств для работы в контексте конкретного итератора.

$C([1, 2, 3, 4]).forEach(function (el) {
    if (el == 2) {
        this.break();
    }
});

$C([1, 2, 3, 4]).get(function (el) {
    if (el == 2) {
        this.modi(1);
    }

    return true;
}); // [1, 2, 4]


Подробнее в доке.

3) Новый метод filter (частный случай map), in, новые режимы для метода extend.

4) 100% code review который в итоге вылился в значительное улучшение интерфейсов методов (собственно поэтому версия 5, а не 4.3).

Основные изменения по сравнению с 4-й версией:

4.1) Метод remove возвращает массив или объект удалённых элементов;
4.2) Метод set возвращает массив или объект обновлённых элементов;
4.3) Метод add возвращает объект статуса добавления;
4.4) Параметр методов useForIn был заменён на более универсальный use с опциями работы: 'for', 'for in', 'for of'.
4.5) Метод groupKeys был удалён в пользу простого group с параметров saveKeys.

В остальном улучшения интерфейсов не нарушили обратную совместимость.

5) Более 900 новых тестов, а также заменён qUnit на Jasmine 2.
6) Улучшен модуль генерации кода, что дало в некоторых случаях дополнительный прирост производительности.
7) Оптимизация методов search и remove с помощью нового АПИ контекста итераторов позволило увеличить скорость работы в 2 раза.
8) Расширен механизм указателей для работы с новыми видами коллекций.
9) Исправлено множество ошибок, улучшены комментарии, теперь Collection на 100% проходит строгую проверку Closure Lint.
10) Проведена дополнительная оптимизация кода для работы в WebStorm (в результате которого было отправлено более 20-ти багов для JetBrains ) - теперь работает почти идеальный автокомплит и в WebStorm последней версии включены множество исправлений
11) Значительно улучшена документация и перенесена в Wiki.

Собственно, что пишу сейчас: кому не лень, почитайте имеющиеся доку на Wiki и скажите замечания и т.д. т.к. доку для меня писать самое сложное
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 09.06.2014 в 16:13.
Ответить с цитированием
  #2 (permalink)  
Старый 04.06.2014, 19:52
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

Круто)
Сообщение от kobezzza
Собственно, что пишу сейчас: кому не лень, почитайте имеющиеся доку на Wiki и скажите замечания и т.д. т.к. доку для меня писать самое сложное
на выходных по читаю, отпишусь)
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #3 (permalink)  
Старый 04.06.2014, 20:05
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

а как ты реализуешь итератор для браузеров, которые поддерживают Map и Set, но не поддерживают @@iterator?
Ответить с цитированием
  #4 (permalink)  
Старый 04.06.2014, 20:07
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Octane Посмотреть сообщение
а как ты реализуешь итератор для браузеров, которые поддерживают Map и Set, но не поддерживают @@iterator?
Написан полифил, который аккуратно добавляет поддержку без оверхедов, т.е. работает всё также быстро.

PS:

Наглядный пример использования протокола @@iterator в работе:

// Для более сахарного вида используем итератор на основе генератора
$C(function *() {
    var str = '1-2 4-5 6-7';
    var rgxp = /(\d+)-(\d+)/g;

    var tmp;
    while ((tmp = rgxp.exec(str))) {
        yield tmp;
    }
}).get() // [["1-2", "1", "2"], ["4-5", "4", "5"], ["6-7", "6", "7"]]

// Можно любому объекту или классу определить свойство @@iterator и Collection это поймёт
$C({'@@iterator': function *() {
    for (let i = 0; i < 10; i++) {
        yield i;
    }
}}).get() // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 04.06.2014 в 20:19.
Ответить с цитированием
  #5 (permalink)  
Старый 04.06.2014, 20:22
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

kobezzza, ты в полифили Map юзаешь let, на сколько я помню он поддерживается только лисой , как тогда работает в других браузерах ?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #6 (permalink)  
Старый 04.06.2014, 20:25
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от cyber Посмотреть сообщение
kobezzza, ты в полифили Map юзаешь let, на сколько я помню он поддерживается только лисой , как тогда работает в других браузерах ?
Я использую транслятор ECMAScript6 в ECMAScript3. Тут об этом написано.

Сама либа работает в ИЕ6+, но кстати let и const работают уже во всех последних версиях браузеров.

PS:

Пример написания фильтра который отбирает только уникальные / не уникальные значения на основе нового АПИ контекста forEach.

$C().addFilter('unique', function (el, key, data, i, length) {
    if (!this.$.init) {
        let cache = this.$.cache = this.$.cache || new Set();
        let final = this.$.final = this.$.final || new Set();

        if (cache.has(el)) {
            final.delete(el);
        
        } else {
            final.add(el);
            cache.add(el);
        }

        if (i === (this._.endIndex || (length() - 1))) {
            this.jump(0);
            this.$.init = true;
        }

        return this.FALSE;
    }
    
    return this.$.final.has(el);
});

$C([1, 2, 3, 2, 3, 9]).get('unique') // [1, 9]
$C([1, 2, 3, 2, 3, 9]).get('!unique') // [2, 3, 2, 3]
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 04.06.2014 в 20:37.
Ответить с цитированием
  #7 (permalink)  
Старый 09.06.2014, 16:14
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Юху! Я сделал это Collection 5 доведён до релиза

PS:
Как же приятно доводить дело до конца
Сейчас смотрю:

*) 9.5+к строк кода
*) 1000+ тестов
*) Вики по 100% функционалу



PSPS:
Таки решил выделить день на написание статьи на Хабр, надеюсь завтра к вечеру закончу.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 09.06.2014 в 18:56.
Ответить с цитированием
  #8 (permalink)  
Старый 09.06.2014, 21:57
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от kobezzza
*) 9.5+к строк кода
Извини за нескромный вопрос, но зачем это все нужно?

Последний раз редактировалось monolithed, 09.06.2014 в 22:01.
Ответить с цитированием
  #9 (permalink)  
Старый 09.06.2014, 23:10
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от monolithed Посмотреть сообщение
Извини за нескромный вопрос, но зачем это все нужно?
тут же написано

Ну а вообще чтобы иметь единый и мощный интерфейс для всех видов коллекций и чтобы работало так же быстро как на простых циклах.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 09.06.2014 в 23:23.
Ответить с цитированием
  #10 (permalink)  
Старый 09.06.2014, 23:37
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от kobezzza
Ну а вообще чтобы иметь единый и мощный интерфейс для всех видов коллекций и чтобы работало так же быстро как на простых циклах.
А как же принцип "Не плати за то что не используешь"?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие и открытие дива по клику OLDBOY Общие вопросы Javascript 30 28.09.2016 20:41
Collection v4 kobezzza Ваши сайты и скрипты 50 13.02.2014 19:10
как обновлять collection каждые 5 секунд sergey_magic Backbone.js 1 29.07.2013 14:31
Collection – фреймворк для управления данными kobezzza Ваши сайты и скрипты 155 10.05.2013 08:59
Удаление всех options в select Ceргей Элементы интерфейса 9 28.11.2012 07:36