|
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
|
|
Для чего нужны callback-функции10.04.2009, 17:55. Показов 86866. Ответов 103
Метки нет (Все метки)
0
|
|
| 10.04.2009, 17:55 | |
|
Ответы с готовыми решениями:
103
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 03.06.2020, 13:34 | ||
|
предположим, ты - разработчик GUI библиотеки. и ты сделал класс кнопок. на дисплее твоя кнопка будет отображаться, как... обычная кнопка. на которую можно кликнуть мышкой. твою библиотека будет использоваться в различных проектах. людям нужно отобразить на экране кнопку, на которую можно будет нажать. что произойдёт если нажать на кнопку? это зависит от логики самого проекта. например, в одном случае, нажатие на кнопку будет означать "подтвердить свои данные". а в другом - выход из программы. в разных ситуациях реакция на нажатие кнопки может быть разной. и вот как ты, разработчик GUI библиотеки, сможешь реализовать такую кнопку, которая в каждом конкретном случае будет делать что-то своё?
1
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 03.06.2020, 13:39 | ||
|
Святогор, теперь ваш вопрос
И ответ уже не так уж и непонятен, да ведь? Например, мама может быть на работе или заниматься другими делами, и у нее не будет возможности самой купить хлеб. Так и в программировании. Вызывающая функция может не обладать необходимыми данными или не располагать временем для выполнения этой операции, а вот вызываемая - может. В частности, в примере с сортировкой - передаваемая callback-операция - это компаратор, т.е. метод сравнения двух элементов. Естественно на вызывающей стороне его нельзя выполнить не перетащив к себе заодно и весь алгоритм сортировки. Сортируемые элементы ведь сравниваются по ходу дела. Вот и получается, что вызывающая функция может через передачу компаратора указать в каком порядке сортировать, а вот выполнять компаратор нужно уже вызываемой функции, т.е. самой сортировке.
2
|
||
|
Комп_Оратор)
|
|
| 03.06.2020, 14:25 | |
|
Святогор, поведение любого кода имеет точки ветвления. Это логические узлы, которые изменяют поведение выбирая ту или иную ветвь в потоке выполнения, в зависимости от вычисленного результата условного выражения или какого-то ещё события. Когда результат известен на стадии компиляции, программист может менять его перед сборкой программы как настроечный параметр. Если результат вычисляется во время выполнения, то код проявляет изменчивость времени выполнения.
Коллбэк это способ ветвления. Бывает, что в области данной функции нет информации о исполняемом коде, о котором известно лишь, что ему нужно и что он вернёт. В этом случае применяется вызов в котором вызывающая сторона предоставляет код, который ей нужен как клиенту. И это имеет значение. Скажите, у вас будут разные ощущения на фразу "I'll be back" сказанную Николь Кидман в пушистом халатике или Арнольдом Шварценегером с пулеметами в каждой руке? Программа тоже самое чувствует.
1
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 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
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||
| 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
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||||||
| 04.06.2020, 21:44 | ||||||||||||
|
Добавлю чуть чуть.
Вот этот код,
ее на сторону С++, а тот даже и разницы не заметит.
0
|
||||||||||||
|
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
||
| 04.06.2020, 22:15 | ||
|
Прикольно. Вы в качестве примера привели лямбда функции из с++ 11 кажется так да? Ну ну. Всё яснее и яснее.
Обычно обЪясняют сложное через простое :-) но не тут то было. Я помню как на 1 курсе мне в соседней ветке объясяняли что такое конструктор.... чего только не наплели каких только терминов не выгрузили тонну... А всего одно предложение: конструктор это кусок кода выполняемый при создании обЪекта, что то вроде автозапуска в виндовс. Всё.. Не нужен ни параграф ни абзац. У меня есть смутное ощущение что под термином collback понимаются как минимум две разные вещи, это асинхронное программирование и тот самый полиморфизм который тут сказали. Это в русском языке практикуется такое безобразие когда уважаемые в узких кругах специалисты берут англоязычыне термины или просто слова и дают им наполнение весьма отдалённое от значения самих слов. Главное "ярлык" есть а по нему найдёте что такое колоноскопия в физике плазмы.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 04.06.2020, 22:23 | ||
|
callback - это способ сообщить постороннему коду что надо делать. Этот посторонний код может выполняться и асинхронно, и\или синхронно, для понимания концепции это не важно.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 04.06.2020, 22:25 | ||
|
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 04.06.2020, 22:30 | |
|
В случае сортировки мы говорим:
"сортировка - сортируй по возрастанию. Вот тебе функция, которая сравнивает элементы таким образом, чтобы у тебя это получилось." - это пример использования с параметрическими алгоритмами В случае пула потоков мы говорим: "пул потоков, вот тебе функция-задача, выполняй ее когда будешь свободен" - это пример использования с многопоточностью В случае обработчика событий сокета, например, мы говорим: "обработчик, вот тебе функция, которую ты должен выполнить, когда сокет перейдет в состояние "подключен"" - это пример использования с асинхронностью Все это примеры использования callback`ов.
1
|
|
|
Комп_Оратор)
|
|||
| 04.06.2020, 22:42 | |||
![]() Удачи.
1
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 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 функции не для кнопок на экране, а для клавиш на клав. и мышке. Как? Для чего нужны интерфейсы? Для чего нужны указатели? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|