Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   callback или delegate: техника разработки (https://javascript.ru/forum/misc/32500-callback-ili-delegate-tekhnika-razrabotki.html)

zoh 18.10.2012 14:02

callback или delegate: техника разработки
 
Всем привет!

В основном разрабатывал на монстрах вида Ext.js ембер, backbone..., и cейчас активно разрабатываю на чистом js.

Возник вопрос в реализации одного и того же кода.

function handler(value) {
    return value * 1000;
}

function a(value, handler) {
   handler(value);
}


$.bind('running', function (value) {
    return value * 1000;
});

......

function a(value) {
   Bind.trigger('running', value);
}


разница - в одного передётся калбек функция, а во втором случае просто подписка.



Я не могу прочуять "соль"!
Как лучше что и где применять?

Спасибо.

tenshi 18.10.2012 19:53

второй вариант лучше как-то так:

var eventRunning= new EventRouter

......

eventRunner.listen( function( value ){
    return value * 1000
} )

......

function a( value ){
   eventRunning( value )
}


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

коллбэки дают более простую логику работы, так что где не требуются события лучше применять их

Livanderiaamarum 18.10.2012 21:06

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

п.с. не понял, при чем тут "делегирование"

zoh 19.10.2012 10:37

tenshi, да думаю это единственное различие.

Я не писал делегирование, я написал delegate по аналогии метода jQuey .delegate()

Дополнение
1) Да, я не понимаю где их юзать и противопоставляю их, так как они выполняют одинаковую функцию (это на мой взгляд)
2) Я не вижу приимущества в архитектурном плане какой вариант предпочительней.

Livanderiaamarum 20.10.2012 10:23

Цитата:

Сообщение от zoh
Я не писал делегирование

делегейт это делегировать! и не кто не говорит что ты писал "делегирование" !

zoh 22.10.2012 09:35

jQuery.delegate() !!!!!!!!!!!!
офф топ!

на вопрос не получил ответа...

zoh 23.10.2012 16:27

Да я не первый день на js программирую.
Я знаю что такое калбеки и тд.

Я привёл вопрос в первом сообщении, можете ещё раз посмотреть.

Отличие в
1) после отработки вызовет просто функцию калбек!

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



вопрос опять (снова), с какой точки зрения правильнее разрабатывать приложения на js?

Или ещё такой: когда использовать то, а когда то? (примерный ответ дал tenshi)

П.С. Без готового фреймворка, так как там всё становится понятнее

zoh 23.10.2012 17:00

Tenshi,

Только сейчас разглядел, то что ты предложил, никак "не лучше, чем 2", это ближе к калбекам, потому что при $.bind() могут быть вызовы вообще из разных контекстов, а тут eventRunning долже быть в замыкании.

Пример:
система авторизации, и модуль пользователя

melky 23.10.2012 17:01

Цитата:

Сообщение от zoh
Как лучше что и где применять?

одно и то же. лучше выбирать то, что больше нравится.

Цитата:

Сообщение от zoh
вопрос опять (снова), с какой точки зрения правильнее разрабатывать приложения на js?

не надо к каждой функции указывать коллбек - скрипт может превратиться в асинхронное чудо, которое похоже на Node.js - кто программировал на нём, не на шутку знает, как задалбливает к каждой функции писать коллбек, и как иногда бывает трудно скомбинировать действия.


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

чем ? да ничем - второе является расширением функциональности первого.

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

tenshi 23.10.2012 21:12

Цитата:

Сообщение от zoh (Сообщение 211806)
Tenshi,

Только сейчас разглядел, то что ты предложил, никак "не лучше, чем 2", это ближе к калбекам, потому что при $.bind() могут быть вызовы вообще из разных контекстов, а тут eventRunning долже быть в замыкании.

Пример:
система авторизации, и модуль пользователя

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

Пример:

MySuperApplication.AuthorizationSystem.eventUserLogged.listen( function( user ){
    if( prompt( 'Добрый день, не хотите ли отведать этих мягких французских булак, да выпить йаду?' ) )
        document.location= '/my/cookies/'
})


Часовой пояс GMT +3, время: 17:00.