четверг, 15 апреля 2021 г.

Как усложнить код через группировку кода

Например, внутри одного класса можно реализовать логику "preventDefault для события onContextMenu должен случаться только когда есть подписка на onHold" через отдельный обработчик события onContextMenu и расположить его рядом с обработчиком события onHold:

setup: function(element) {
    const $element = $(element);
    eventsEngine.on($element, CONTEXTMENU this._contextMenuHandler.bind(this));

    if(touch || devices.isSimulator()) {
      eventsEngine.on($element, HOLD, this._holdHandler.bind(this));
      eventsEngine.on($element, CONTEXTMENU, (e) => {e.preventDefault();});
    }
},
_contextMenuHandler: function(e) {
      this._fireContextMenu(e);
}, 

На мой взгляд это очень маленькая группировка и я ее не применяю.

Хотя она конечно возможна и это конечно группировка и даже выделение независимого кода в отдельные блоки (один обработчик предназначен для одной логики, а другой обработчик - для другой).

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

Ведь там может быть важный код, влияющий на весь алгоритм работы события: "e.preventDefault()"

Вместо такой группировки я делаю единственный обработчик и добавляю в него код с условиями и коротким комментарием:

setup: function(element) {
    const $element = $(element);
    eventsEngine.on($element, CONTEXTMENU this._contextMenuHandler.bind(this));

    if(touch || devices.isSimulator()) {
        eventsEngine.on($element, HOLD, this._holdHandler.bind(this));
    }
},
_contextMenuHandler: function(e) {
    if(touch || devices.isSimulator()) {
        e.preventDefault(); // prevent for HOLD event
    }
    this._fireContextMenu(e);
}, 

Из такого кода мне проще понять логику всего алгоритма и не выискивать под отладкой какой код сделал "e.preventDefault()".

Комментариев нет:

Отправить комментарий