Обратные вызовы в C++

Обратные вызовы в C++

Год выхода: 2021
Аннотация
Книга, рассматриваемая в отрывке, посвящена теме обратных вызовов в программировании, особенно на языке C++. Она написана с целью дать разработчикам среднего уровня возможность углубить свои знания в области проектирования и реализации программного обеспечения. Автор начинает с личного опыта общения с начинающим разработчиком, во время которого возникли вопросы по теме обратных вызовов, и это стало основой для написания книги. Основная цель книги — детальное освещение темы обратных вызовов, которое, несмотря на свою узкую специализацию, имеет огромное значение для понимания различных аспектов программирования. Книга структурирована так, чтобы плавно вводить читателя в теорию и практику обратных вызовов, и включает различные разделы, описывающие теоретические основы, методы реализации, сравнительный анализ, использование шаблонов и демонстрацию практического применения обратных вызовов. Книга выделяет две ключевых составляющих модели обратных вызовов: исполнителя и инициатора. Исполнитель — это часть кода, которая будет выполнена в рамках обратного вызова, а инициатор — это та часть системы, которая инициирует выполнение этого кода. Также подчеркивается важность контекста, который влияет на поведение обратных вызовов, на примере реализации сетевого обмена. Читателям предлагается ознакомиться с различиями между синхронными и асинхронными вызовами, а также с архитектурным дизайном интерфейсов API. Далее книга углубляется в механизм обратных вызовов, объясняя, как они функционируют в рамках программирования. Обратные вызовы рассматриваются как паттерн, при котором существует возможность передать исполняемый код в другую функцию, которая запустит его в нужный момент времени. Обсуждается, как синхронные вызовы выполняются до завершения функции инициатора, в то время как асинхронные могут быть выполнены в любой момент, что важно для системного программирования и API C++. Книга также описывает способ реализации обратных вызовов с использованием указателей на функции, где функции могут быть как глобальными, так и членами класса. Контекст в этом случае представляется как дополнительная информация, которая может быть сохранена и использована вызванной функцией. При этом акцентируется внимание на том, как указатели на функции передаются в качестве аргументов, что позволяет сохранять необходимые данные в инициаторе. Далее автор переходит к более сложной концепции — функциональным объектам. Эти объекты представляют собой классы с перегруженным оператором вызова, что позволяет реализовать обратные вызовы с более лаконичным и понятным синтаксисом. Функциональные объекты предоставляют некоторые преимущества, такие как безопасность при удалении объектов после использования, но также имеют и свои недостатки, включая сложность архитектуры и ограничения при реализации API. Для улучшения производительности программы рассматривается использование функциональных объектов в сочетании с оптимизацией, что позволяет встроить код обработчика непосредственно в точку вызова, минуя некоторые издержки, связанные с вызовом функции. Это значительно снижает затраты времени на выполнение вызова функции и уменьшает количество необходимых машинных команд для управления стеком. В заключение, книга представляет собой обширный и информативный ресурс, который может быть полезен разработчикам, стремящимся углубить свои знания в области программного проектирования, особенно в контексте обратных вызовов. Используя множество примеров кода и анализа производительности, автор демонстрирует, как эффективно применять эти концепции в реальных проектах на C++.