LINUX.ORG.RU

[любознательности-тред] Чем так плохи callback-функции?


0

4

Доброго времени суток! В процессе поглощения умных (и не очень) книг возникло недопонимание, связанное вот с чем: многие авторы неприязненно относятся к обработке событий через вызовы callback-функций. Надо обязательно ткнуть пальцем в какой-нибудь другой тулкит, сказав, что там для обработки событий используются callback'и, поругать разработчиков этого тулкита, а разработчиков сабжа похвалить, потому что они не стали использовать callback'и, а написали свой велосипед, который самый лучший и впереди планеты всей. Встречал подобное в книгах по Qt и Swing.

Погуглив, нашел по теме не так уж и много, единственное, что нашел - это лишний оверхед на вызовы функций (имхо, притянуто за уши, разве такой уж он большой?), и ухудшение читаемости кода, поскольку приходится лазить по всему дереву вызовов, чтобы разобраться в коде. Кто что может рассказать по теме? И какие есть альтернативы callback-функциям, чем они лучше или хуже?

★★★★★

в каком языке? В любом случае в callback'ах плохого не больше, чем в динамическом выделении памяти.

anonymous
()

В C++ в коллебках, по причинам отсутствия GC, замыканий и first-class функций, хорошего мало, и ими неудобно пользоваться.

В нормальных языках коллбэки это благо.

anonymous
()
Ответ на: комментарий от anonymous

Как пример я привел Qt и Swing (C++ и Java, соответственно), с другой стороны в Gtk+/C callback'и - основной способ обработки событий (может и другие есть, но мне про них ничего не известно).

hippi90 ★★★★★
() автор топика
Ответ на: комментарий от hippi90

других дофига. В POSIX API сигналы и aio, как минимум.

anonymous
()

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

Оверхед на вызов функций — это вообще смешно. Ну да, он есть. Но надо же сравнивать с каким-то альтернативным методом решения той же задачи.

const86 ★★★★★
()
Ответ на: комментарий от const86

Ну, вот, как пример:

Макс Шлее - Qt4. Профессиональное программирование на C++, стр. 37-38

Старая концепция функции обратного вызова (callback functions), лежащая в основе X Window, основана на использовании обычных функций, которые должны вызваться в результате действий пользователя. Применение такой концепции значительно усложняет исходный код программы, делая его менее понятным. Кроме того, отсутствует возможность производить проверку типов возвращаемых значений, потому что во всех случаях возвращается указатель на void. Например, для того чтобы сопоставить код с кнопкой, необходимо передать в функцию указатель на кнопку. В случае если кнопка нажата, функция будет вызвана. Сами библиотеки не проверяют, были ли аргументы, переданные в функцию, требуемого типа, а это часто является причиной сбоев. Другой недостаток функций обратного вызова заключается в том, что элементы графического интерфейса пользователя тесно связаны с функциональными частями программы и это, в свою очередь, заметно усложняет разработку классов независимо друг от друга. Одним из ярких представителей этой концепции является Motif.

hippi90 ★★★★★
() автор топика
Ответ на: комментарий от hippi90

ну вот ты сам (вернее, Макс Шлее, но твоим сообщением) и ответил на свой вопрос

jtootf ★★★★★
()

Похоже на какие-то байтопроблемы.

power
()
Ответ на: комментарий от schizoid

goto для функций, посему considered harmful

‘goto considered harmful’ considered harmful

kim-roader ★★
()

аффтары книжек неосиляторы просто, понимание работы коллбэков требует больших мозговых усилий, чем для обычных функций :)

Harald ★★★★★
()
Ответ на: комментарий от const86

Оверхед на вызов функций — это вообще смешно. Ну да, он есть. Но надо же сравнивать с каким-то альтернативным методом решения той же задачи.

Если речь о гуях и приложение крутиться не на какой нить шелесяке с частотой 10МГц, то это просто смешно, даже без рассмотрения альтернативных решений;-)

AIv ★★★★★
()

Встречал подобное в книгах по Qt и Swing.

Потому что в Java нельзя реализовать callback-функции.

Amp ★★★
()

callback - частный случай модели subscriber. Коллбэк ничем не плох, просто в некоторых случаях он бывает неудобен.

no-dashi ★★★★★
()
Ответ на: комментарий от tensai_cirno

С такими допущениями всё что угодно можно рассматривать как goto.

Неприлично в крайности вдаваться.

schizoid ★★★
()
Ответ на: комментарий от hippi90

Макс Шлее - Qt4. Профессиональное программирование на C++, стр. 37-38

Про отсутствие проверки аргументов (типов и вообще их наличия) согласен, но это проблемы конкретных реализаций. В плюсах решается универсально с помощью std::function и определением отдельных коллбеков для событий, требующих передачи разных параметров.

элементы графического интерфейса пользователя тесно связаны с функциональными частями программы

Не знаю, как это в мотифе, не заглядывал туда. Но коллбеки сами по себе не обязывают делать из кода кашу.

const86 ★★★★★
()

Между прочим, в ФП любая функции, которая принимает в качестве параметру функцию, уже работает с callback'ом. Думаешь, их мало и их избегают?

O02eg ★★★★★
()

а чем они хороши? Только как средство реализации чего-то если только

namezys ★★★★
()

В общем случае, рассматривая C или C++, callback-функция может представлять собой простой указатель на метод какого-нить объекта. Если вызывающий будет дёргать этот callback без проверки, жив-ли ещё его объект (а для простых указателей на функцию это, в общем случае, проверить невозможно), возможна ситуация «вызова» произвольного кода, оказавшегося на месте давным-давно удалённого объекта, который когда-то отдавал callback.

one_more_hokum ★★★
()
Ответ на: комментарий от anonymous

В C++ в коллебках, по причинам отсутствия GC, замыканий и first-class функций, хорошего мало

boost::signals2 хоть и довольно толстый, но очень многофункциональный. Давно им пользуюсь, весьма доволен.

one_more_hokum ★★★
()
Ответ на: комментарий от hippi90

imho это вырванная из контекста цитата. Далее по логике должны следовать недостатки event-диспетчеров, ограничение при использовании виртуальных методов и заявление что механизм signal&slots на сей день наиболее удобен, гибок и прогрессивен.

MKuznetsov ★★★★★
()
Ответ на: комментарий от stevejobs

можно сделать класс Function

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

Amp ★★★
()
Ответ на: комментарий от schizoid

классику ничего не стыдно. Я, Линус и Дон Кнут считаем это все глупостью.

nokachi
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.