Клуб API Карт

Нарушения контрактов функций

Пост в архиве.
Как и обещал вот тут ещё ошибки в свежем API 2.0.13

Рассмотрим код нескольких функций:

    //  ListBox.remove()
    remove: function (listItem) {
        delete this._childWidths[id.get(listItem)];
        this._recalculateSize();
        ListBox.superclass.remove.call(this, listItem);
    },

    //  ToolBar.remove()
    remove: function (button) {
        delete this._childWidths[id.get(button)];
        this._recalculateSize();
        ToolBar.superclass.remove.call(this, button);
    },

CollectionImplementation.prototype = {
    add: function (child) {
        this._parentCollection.add(child);
    },

    remove: function (child) {
        this._parentCollection.remove(child);
    },

    removeAll: function () {
        this._parentCollection.removeAll();
    },

/** @lends LayerCollection.prototype */
imports.util.augment(LayerCollection, imports.Collection, {
    add: function (child) {
        LayerCollection.superclass.add.call(this, child);
        if (typeof child.getZoomRange == 'function') {
            this._zoomRangeObserver.addProvider(child);
        }
        if (typeof child.getCopyrights == 'function') {
            this._copyrightsObserver.addProvider(child);
        }
        if (typeof child.getBrightness == 'function') {
            child.events.add('brightnesschange', this._onChildBrightnessChange, this);
            this._onChildBrightnessChange();
        }
    },

    remove: function (child) {
        LayerCollection.superclass.remove.call(this, child);
        if (typeof child.getZoomRange == 'function') {
            this._zoomRangeObserver.removeProvider(child);
        }
        if (typeof child.getCopyrights == 'function') {
            this._copyrightsObserver.removeProvider(child);
        }
        if (typeof child.getBrightness == 'function') {
            child.events.remove('brightnesschange', this._onChildBrightnessChange, this);
            this._onChildBrightnessChange();
        }
    },

И т.д... Вроде бы всё корректно, что же их объединяет? Читаем пример документации:

remove
{ICollection} remove(object)

Удаляет из коллекции дочерний объект.
Возвращает ссылку на себя.

А на деле получается, что функции ничего не возвращают и вызовы "по цепочке" не срабатывают. Я привёл примеры, которые быстро попались под руку, и всё это реализации ICollection. Для исправления требуется дописать одно-единственное ключевое слово, очень надеюсь на это не уйдёт ещё один месяц :)
9 комментариев

Спасибо за репорт, поправим

в нашем менеджере событий (метод events.remove) обязательно третий this передавать, если он передавался в add?

да, удаляется ровно с тойже сигнатурой что и добавляется.

Ради интереса проверил 2.0.14, так ведь там всё исправили! Всего неделя, фантастика! Спасибо)

П.С. А ведь ни про эту ни про предыдущую ошибку в ченджлоге не написали. Что за скромность? Не проверять же руками каждый раз.

Пожалуйста) Постараемся больше не терять сообщения об исправлениях.

скандалы, интриги, расследования...

главное что бы столь же оперативно отзывались, а то в некоторых направлениях Яндекса "тишь да гладь в ответ".

Все потому что у нас в команде есть редкий зверь (девушка!)

тогда вы ее никому не одавайте, пусть у себя самостоятельно разводят :-)