Виталий Ткаченко - Обратные вызовы в C++

Обратные вызовы в C++
Название: Обратные вызовы в C++
Автор:
Жанр: Программирование
Серии: Нет данных
ISBN: Нет данных
Год: 2021
О чем книга "Обратные вызовы в C++"

В практике разработки ПО зачастую встает задача динамической модификации программного кода в зависимости от текущих или настраиваемых значений параметров. Для решения этой задачи широко используются обратные вызовы. В языке C++ обратные вызовы реализуются различными способами, и далеко не всегда очевидно, какой из них лучший для конкретной ситуации. В книге рассмотрены теоретические и практические аспекты организации обратных вызовов, проанализированы достоинства и недостатки различных реализаций, выработаны рекомендации по выбору в зависимости от требований к проектируемому ПО. В первую очередь книга предназначена для программистов среднего (middle) уровня, т.е. тех, кто уже достаточно хорошо знает язык C++, но хотел бы расширить и углубить свои знания в области проектирования и дизайна. В определенной степени она также будет интересна опытным разработчикам, с одной стороны, как систематизация знаний, с другой стороны, как источник идей и методов для решения практических задач.

Бесплатно читать онлайн Обратные вызовы в C++


Введение

Однажды со мной консультировался начинающий разработчик. Не помню точно, о чем шла речь (да это и не важно), но вопрос был в стиле «есть проблема – как ее решить?». Первой моей мыслью, которую я и озвучил, было – «сделай обратный вызов». Следующий, вполне ожидаемый, вопрос был «а как его реализовать?». Почти не думая, я ответил первое, что пришло в голову – «используй указатель на функцию». «Хорошо», сказал разработчик, «я почитаю про эти указатели». Через какое-то время он снова пришел с вопросом – «ну, что такое указатель на функцию, я понял, но как внутри функции узнать, какому классу предназначается вызов?» Так, слово за слово, вопрос за вопросом, и я вдруг начинаю осознавать, что вопросы совсем не такие уж простые, как вначале могло показаться, и что одно понятие тянет за собой другое, что есть множество альтернатив при выборе способа реализации, и что так сразу и не скажешь, какой из них лучше подходит именно для вот этого случая… Так и родилась идея книги, которую вы сейчас держите перед глазами.

Формат представления информации в виде книги имеет одно неоспоримое преимущество: здесь отсутствуют ограничения по объему. Появляется возможность изложить весь материал обстоятельно, подробно, в деталях, охватывая множество аспектов и нюансов. Это выгодно отличает книгу от других форматов, таких, как статьи, лекции, презентации и т. п. В них всегда приходится идти на компромиссы, выделяя главное и отбрасывая детали, которые, на первый взгляд, кажутся несущественными, но их наличие существенно облегчает освоение материала и избавляет читателя от необходимости самостоятельно искать ответы на вопросы, которые неизбежно возникают при изучении незнакомых предметов.

Сами по себе обратные вызовы является узкоспециализированной темой, однако при этом они охватывают ряд смежных концепций как в сфере использования языка программирования, так и в сфере архитектурно-проектных решений. В связи с этим, изучение обратных вызовов значительно повышает компетенции специалиста и обогащает его арсенал приемов и способов решения нетривиальных задач.

В первую очередь книга предназначена для разработчиков среднего (middle) уровня, т. е. тех, кто уже достаточно хорошо знает язык C++, но хотел бы расширить и углубить свои знания в области проектирования и дизайна. Безусловно, не лишней она будет и для начинающих, но нужно быть готовым к тому, что для изучения материала придется приложить значительные усилия: рассматриваемые концепции являются достаточно сложными и предполагают хорошее знание синтаксиса C++, а также некоторый опыт в программировании. Надеюсь, опытные разработчики также найдут книгу полезной как в плане систематизации знаний, так и в плане новых идей и методов, которые можно использовать в практике разработки.

Структурно книга состоит из разделов, глав и параграфов. В первом разделе излагаются теоретические основы, даются определения и термины. Во втором разделе рассматриваются способы реализации обратных вызовов в языке C++. В третьем разделе проводится сравнительный анализ реализаций, вырабатываются рекомендации для выбора в конкретных случаях. В четвертом разделе рассматривается использование шаблонов – пожалуй, наиболее интересной концепции C++, активно развивающейся в новых стандартах. И в заключение, чтобы изложенный материал не показался совсем уж абстрактным и оторванным от жизни, в пятом разделе демонстрируется практическое использование обратных вызовов на примере проектирования программного компонента.

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

• базовый синтаксис C++;

• классы и наследование, перегрузка операторов;

• лямбда-выражения и захват переменных;

• контейнеры стандартной библиотеки;

• семантика шаблонов C++;

• шаблоны с переменным числом параметров, частичная специализация шаблонов.

Теоретические положения проиллюстрированы многочисленными примерами, оформленными в виде листингов. После каждого листинга (за исключением совсем уж тривиальных случаев) идет пояснение, которое облегчает понимание кода. Примеры создавались, ориентируясь на стандарт C++ 17; некоторые из них используют специфические особенности указанного стандарта и не будут компилироваться в более ранних версиях. Исходные тексты всех примеров можно найти в https://github.com/tkachenko-vitaliy/Callbacks, там же указан адрес электронной почты для связи с автором.

Во втором издании исправлены некоторые опечатки, а также переработана глава 5.5, в которой представлены улучшенные технические решения, основываясь на новых возможностях стандарта C++ 17.

На этом вступительную часть можно считать оконченной, приступим теперь непосредственно к изучению обратных вызовов.

1. Теоретические основы обратных вызовов

1.1. Концепция обратных вызовов

1.1.1. Интуитивное определение

Представьте следующую ситуацию. Вам нужно совершить платеж в банке. Вы идете в банк, берете талон, дожидаетесь, пока вас пригласят, и совершаете платеж. Но ведь столько времени придется потратить, в банке всегда такие очереди… Есть вариант получше: попросить свою маму (или бабушку) зайти в банк и занять очередь. Когда очередь подойдет, мама (или бабушка) позвонит, и вам остается только прийти и сделать платеж. Если же вы в этот день сильно заняты, тогда можно оставить телефон друга, и он сделает платеж вместо вас.

Итак, результат один и тот же, но последовательность действий различная. В первом случае вы сами идете в банк, отстаиваете очередь и совершаете платеж, т. е. выполняете все необходимые операции. Во втором случае вы сидите и ожидаете, когда вам позвонят, т. е. сделают вызов, и делаете только одно действие, а именно – совершаете платеж. Либо это делает ваш друг, если маме (или бабушке) дали его, а не ваши контакты. Можно утверждать, что ваша мама (или бабушка) инициировала, а вы выполнили обратный вызов.

1.1.2. Обратный вызов как паттерн

Перейдем теперь на язык программирования и дадим формальное определение.

Обратный вызов – это паттерн, в котором какой-либо исполняемый код как аргумент передается в другой код, при этом ожидается, что через сохраненный аргумент исполняемый код будет запущен в требуемый момент времени.

Возвращаясь к неформальному примеру: здесь выполнение платежа можно считать исполняемым кодом, номер телефона – аргументом, телефонный звонок – запуском кода на выполнение.

Графически описанную концепцию можно проиллюстрировать следующим образом (Рис. 1). В программе существует код, выполняющий какие-либо операции, или исполняемый код. Когда программа запускается, исполняемый код как аргумент передается в другой код, или вызывающий код. Вызывающий код сохраняет переданный аргумент и начинает работу. В нужный момент времени, используя сохраненный аргумент, вызывающий код запускает исполняемый код, т. е. осуществляет обратный вызов.


С этой книгой читают
«PowerShell на максималках: Автоматизируй или умри» – это книга, которая поможет вам превратить рутинные задачи администрирования и DevOps в простые, но мощные автоматизированные процессы. Вас ждет глубокое погружение в мир PowerShell – от основных командлетов и работы с файлами до сложных сценариев интеграции с веб-сервисами, API и DevOps-инструментами. Автор последовательно раскрывает темы, начиная с базовых принципов и заканчивая созданием соб
«Кошмар разработчика: Ошибки, которые должен найти тестировщик» – это практическое руководство для программистов, тестировщиков и всех, кто вовлечён в создание программного обеспечения. Книга погружает читателя в мир ошибок, которые способны разрушить любой проект: от банальных проблем с вводом данных до сложных уязвимостей безопасности. Каждая глава раскрывает реальный пример, последствия и стратегии поиска и предотвращения таких ошибок.Вы узнае
Случайный лес – один из самых мощных и универсальных методов машинного обучения, способный решать задачи классификации и регрессии с поразительной точностью. Эта книга – ваш проводник в захватывающий мир случайных лесов. Пошагово вы погрузитесь в тайны построения деревьев принятия решений, освоите ансамблевый подход, откроете техники настройки гиперпараметров и поймете, как избежать переобучения. Автор подробно объясняет, как использовать случайн
От анализа больших данных и машинного обучения до автоматизации рутинных процессов и создания интерактивных визуализаций – эта часть станет вашим практическим путеводителем.Вы узнаете, как распределенно обрабатывать данные с помощью Dask и PySpark, строить динамические дашборды с Plotly и Dash, оптимизировать производительность моделей с Cython, и разрабатывать высоконагруженные приложения с использованием Asyncio и CUDA.Кроме того, особое вниман
Два года прошло с тех пор, как Джек Эрджайл, осужденный за убийство матери, умер в заключении – умер, нося на себе клеймо самого страшного преступника, какое только можно себе вообразить. И никто не прислушивался к его словам о том, что он невиновен. Но вдруг ситуация меняется – из антарктической экспедиции возвращается полярный исследователь доктор Калгари. Он точно знает, что у Джека было алиби, и полон решимости отыскать настоящего преступника
Итак, приступим к приготовлению.Девушку замариновать в мечте, очистить от серых будней и поместить в дивный новый мир. Добавить щепотку жгучих и пряных родственников, друзей и врагов – по вкусу. Ошпарить все Академией магии. Тушить в котле интриг и противостояний на огне магических поединков до полной готовности. Подавать под легким романтическим соусом.Приятного аппетита!
Обыкновенный город. Обыкновенные наши дни. Обыкновенный молодой человек снимает обыкновенную квартиру, в которой начинают происходить необыкновенные вещи.
Многие века между людьми и эльфами шла непримиримая борьба. И всякий остроухий, оказавшийся среди людей, неизбежно привлекал внимание Охотников. Почти пятнадцать лет полукровке Эриал Найт удавалось жить в неведении, пока смерть приемной матери и предательство друга не вынудили ее покинуть убежище и выйти в неспокойный мир. Но даже скрываясь от Охотников, Эри надеется на счастье. На пути к нему ей предстоит пережить немало приключений, влюбиться и