|
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
|
|
Для чего нужны callback-функции10.04.2009, 17:55. Показов 87568. Ответов 103
Метки нет (Все метки)
0
|
|
| 10.04.2009, 17:55 | |
|
Ответы с готовыми решениями:
103
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 03.06.2020, 13:34 | ||
|
предположим, ты - разработчик GUI библиотеки. и ты сделал класс кнопок. на дисплее твоя кнопка будет отображаться, как... обычная кнопка. на которую можно кликнуть мышкой. твою библиотека будет использоваться в различных проектах. людям нужно отобразить на экране кнопку, на которую можно будет нажать. что произойдёт если нажать на кнопку? это зависит от логики самого проекта. например, в одном случае, нажатие на кнопку будет означать "подтвердить свои данные". а в другом - выход из программы. в разных ситуациях реакция на нажатие кнопки может быть разной. и вот как ты, разработчик GUI библиотеки, сможешь реализовать такую кнопку, которая в каждом конкретном случае будет делать что-то своё?
1
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 03.06.2020, 13:39 | ||
|
Святогор, теперь ваш вопрос
И ответ уже не так уж и непонятен, да ведь? Например, мама может быть на работе или заниматься другими делами, и у нее не будет возможности самой купить хлеб. Так и в программировании. Вызывающая функция может не обладать необходимыми данными или не располагать временем для выполнения этой операции, а вот вызываемая - может. В частности, в примере с сортировкой - передаваемая callback-операция - это компаратор, т.е. метод сравнения двух элементов. Естественно на вызывающей стороне его нельзя выполнить не перетащив к себе заодно и весь алгоритм сортировки. Сортируемые элементы ведь сравниваются по ходу дела. Вот и получается, что вызывающая функция может через передачу компаратора указать в каком порядке сортировать, а вот выполнять компаратор нужно уже вызываемой функции, т.е. самой сортировке.
2
|
||
|
Комп_Оратор)
|
|
| 03.06.2020, 14:25 | |
|
Святогор, поведение любого кода имеет точки ветвления. Это логические узлы, которые изменяют поведение выбирая ту или иную ветвь в потоке выполнения, в зависимости от вычисленного результата условного выражения или какого-то ещё события. Когда результат известен на стадии компиляции, программист может менять его перед сборкой программы как настроечный параметр. Если результат вычисляется во время выполнения, то код проявляет изменчивость времени выполнения.
Коллбэк это способ ветвления. Бывает, что в области данной функции нет информации о исполняемом коде, о котором известно лишь, что ему нужно и что он вернёт. В этом случае применяется вызов в котором вызывающая сторона предоставляет код, который ей нужен как клиенту. И это имеет значение. Скажите, у вас будут разные ощущения на фразу "I'll be back" сказанную Николь Кидман в пушистом халатике или Арнольдом Шварценегером с пулеметами в каждой руке? Программа тоже самое чувствует.
1
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
||
| 03.06.2020, 18:38 | ||
|
В-третьих, не надо рассматривать эти запутанные термины как объяснение. Это лишь названия. А объяснение заключается именно в приведенных примерах. Я привел вам пример qsort. А ISergey расписал вам свой, аналогичный пример с использованием callback. Из этих примеров должно быть хорошо понятно, о чем идет речь. Вы пробовали рассматривать эти примеры?
1
|
||
|
"C with Classes"
|
|
| 03.06.2020, 22:44 | |
|
0
|
|
|
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
||||
| 04.06.2020, 21:01 | ||||
|
Я прекрасно понимаю как работает вышеприведенный код.
Знаете как выглядят ваши обьяснеия для человека не знакомого с этой темой? Вот так: а вот представь себе что ты после интегррования стал параметрической функцией четырёх измерений на гомоморфной поверхности и что ты тогда будешь делать в неизотропном пространстве а? Вот и подумай прежде чем вопросы задавать. Добавлено через 18 минут О чём вы говорите? Вызывающая функция замирает в ожидании пока вызываемая работает, по факту времени вызываемая находится внутри вызывающей, что в данном случае может означать что вызывающая функция не имеет времени а у вызываемой его сколько хочешь? У нас один поток выполнения программы пока вызываемая не сделает свои дела вызывающая будет на паузе. Я встречал в интернете такие обьяснения что мол колбэк функция это такая функция которой сказал иди жди пакеты и она ушла и ждёт а когда появился пакет то возвращает значения а в это время спокойно работает основной код программы. Это получается что то вроде прерывания . Но такое возможно если у вас несколько потоков один поток циклически опрашиват наличие пакетов а другой в это время работает исполняя основной код программы.
0
|
||||
| 04.06.2020, 21:01 | |
|
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 04.06.2020, 21:04 | |||
|
Впрочем сама концепция "обратный вызов", может использовать и в многопоточной среде, тогда время тоже становится актуальным. Добавлено через 1 минуту
0
|
|||
| 04.06.2020, 21:07 | |
|
0
|
|
|
Комп_Оратор)
|
||
| 04.06.2020, 21:13 | ||
|
Святогор, ещё раз. У вас в коде есть необходимость сделать вычисления. Есть данные - параметры будущего вызова и объект для получения результата вы тоже соорудить можете (if any). Но ваша задача сделать код независимым от конкретного имени функции. Библиотеку вы пишете и хотите, чтобы юзер расширял - как ему угодно. Откуда вам знать что и как он хочет сортировать. По возрастающей, по убывающей... У строк - несколько вариантов сравнения (с учётом, регистра, без учёта регистра, по длине...). Тут дело не в выгоде. Тут дело в реализации возможности, в принципе. И если вы загнаны в угол и не можете использовать полиморфизм другого вида, то если поскрести по сусекам и прочим местам то мышь - хороший вариант. На без рабье и A4tech - станет подспорьем.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 04.06.2020, 21:33 | ||||||||||||
|
вот только штука в том, что это ничем не отличается от callback подхода. в варианте с наследованием, тебе нужно создать наследника, и переопределить виртуальный метод. в варианте с callback, кол-во буковок меньше: можно сразу указать конкретную функцию, или метод, который нужно дёрнуть по событию "на кнопку нажали" таким образом, вся разница только в количестве текста, который нужно написать программисту. кроме того, вариант с наследованием возможен только в языках, которые поддерживают ООП. callback же можно организовать практически на любом языке. например: на языке си, где нет никаких классов, и виртуальных функций. вот теперь сам по суди, что удобнее и проще: 1. вариант с наследованием:
когда вас учили программировать на с++, вас не забыли обучить одному важному правилу: "не плоди сущности без необходимости" ?
0
|
||||||||||||
|
Комп_Оратор)
|
|
| 04.06.2020, 21:40 | |
|
Святогор, наследование иногда не катит. В колбэк можно лямбду передать захватив из контекста то, что нужно и так, как нужно. При наследовании, это затруднительно может оказаться. Не всегда заранее известно, сколько и каких параметров нужно определить для конструктора наследника. Можно локальным функтором обойтись, но с наследованием будут проблемы) Хотя, зголиться всегда можно, но колбэк, это удобно иногда. Хотя С-стиль, хуже контроль типов, всё так. qsort отличный пример - пир указателей
void *. Но если применять там, где нужно и как нужно, - будет профит.
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||||||||||||
| 04.06.2020, 21:44 | ||||||||||||
|
Добавлю чуть чуть.
Вот этот код,
ее на сторону С++, а тот даже и разницы не заметит.
0
|
||||||||||||
|
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
||
| 04.06.2020, 22:15 | ||
|
Прикольно. Вы в качестве примера привели лямбда функции из с++ 11 кажется так да? Ну ну. Всё яснее и яснее.
Обычно обЪясняют сложное через простое :-) но не тут то было. Я помню как на 1 курсе мне в соседней ветке объясяняли что такое конструктор.... чего только не наплели каких только терминов не выгрузили тонну... А всего одно предложение: конструктор это кусок кода выполняемый при создании обЪекта, что то вроде автозапуска в виндовс. Всё.. Не нужен ни параграф ни абзац. У меня есть смутное ощущение что под термином collback понимаются как минимум две разные вещи, это асинхронное программирование и тот самый полиморфизм который тут сказали. Это в русском языке практикуется такое безобразие когда уважаемые в узких кругах специалисты берут англоязычыне термины или просто слова и дают им наполнение весьма отдалённое от значения самих слов. Главное "ярлык" есть а по нему найдёте что такое колоноскопия в физике плазмы.
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 04.06.2020, 22:23 | ||
|
callback - это способ сообщить постороннему коду что надо делать. Этот посторонний код может выполняться и асинхронно, и\или синхронно, для понимания концепции это не важно.
0
|
||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
||
| 04.06.2020, 22:25 | ||
|
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 04.06.2020, 22:30 | |
|
В случае сортировки мы говорим:
"сортировка - сортируй по возрастанию. Вот тебе функция, которая сравнивает элементы таким образом, чтобы у тебя это получилось." - это пример использования с параметрическими алгоритмами В случае пула потоков мы говорим: "пул потоков, вот тебе функция-задача, выполняй ее когда будешь свободен" - это пример использования с многопоточностью В случае обработчика событий сокета, например, мы говорим: "обработчик, вот тебе функция, которую ты должен выполнить, когда сокет перейдет в состояние "подключен"" - это пример использования с асинхронностью Все это примеры использования callback`ов.
1
|
|
|
Комп_Оратор)
|
|||
| 04.06.2020, 22:42 | |||
![]() Удачи.
1
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 04.06.2020, 22:49 | |
|
IGPIGP, да, пожалуй вы правы. Такое ощущение, что на приемке у комиссии, которая всеми силами пытается найти недостатки. Цели конструктивной работы, естественно, не преследуются. "Работать не надо, надо закрыть".
Если кто-то действительно хочет что-то понять, даже если первоначальное объяснение не совсем удачное, он задает уточняющие вопросы и, в итоге, понимает. А тут этого нет вообще. Пожалуй тоже от темы отпишусь, т.к. все это похоже на троллинг.
1
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||
| 04.06.2020, 23:07 | |||||||||||||||||
|
callback - это паттерн. то есть, это приём программирования, который позволяет независимым механизмам делать свою работу, и уведомлять о статусе её исполнения заинтересованным лицами. ключевое слово: независимым вот например, есть функция копирования файлов и каталогов:
однако копирование больших папок - дело не быстрое. и хочется как то отобразить на экране прогресс-бар для пользователей. причем мы не хотим, что бы наша функция копирования была прибита гвоздями к какому то одному проекту. мы хотим использовать её повторно в самых разных проектах. например, в одном проекте нужно рисовать кирпичики в окошке. а в другом - просто печатать процентики в консоли. я просто добавляю коллбек:
в котором она сообщает, сколько процентов уже скопировалось. ей все равно, как именно каллбек поступит с полученной информацией. в каком то конкретном проекте я просто печатаю проценты в консольку:
функция copy не зависит ни от консольки, ни от виндузятных окон, ни от проекта вообще. а как бы ты реализовал такую вот независимую от остального проекта функцию копирования?
0
|
|||||||||||||||||
| 04.06.2020, 23:07 | |
|
приведите пожалуйста реальный прмиер: для чего нужны дружественные функции?
callback функции не для кнопок на экране, а для клавиш на клав. и мышке. Как? Для чего нужны интерфейсы? Для чего нужны указатели? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|