Процесс принятия решения о том, как группировать требования в концепции и какие концепции использовать в каждом алгоритме, является, пожалуй, наиболее сложной (но наиболее важной) частью построения общей библиотеки. Руководящим принципом для использования в этом процессе является принцип минимизации требований.
Принцип минимизации требований:Минимизируйте требования к входным параметрам компонента для увеличения его многоразового использования.
В этом утверждении есть естественное напряжение. По определению, входные параметры должны использоваться компонентом для выполнения его задачи (под «компонентом» мы подразумеваем шаблон функции или класса). Тогда задача состоит в том, чтобы реализовать компонент таким образом, чтобы сделать наименьшее количество предположений (минимальные требования) о входах при выполнении задачи.
Традиционные понятияабстракциинапрямую связаны с идеей минимальных требований. Чем абстрактнее вход, тем меньше требований. Таким образом, концепции являются просто воплощением общих абстрактных типов данных в программировании шаблонов C++.
При проектировании концепций для какой-то проблемной области важно учитывать их назначение, а именно выражать требования к входу в компоненты. Что касается принципа минимизации требований, то это означает, что мы хотим минимизировать понятия.[ORIG_END] -->
Минимальность в понятиях — это свойство, связанное с основной семантикой репрезентируемой проблемной области. В проблемной области базовых контейнеров требование прохождения в одном направлении является меньшим требованием, чем требование прохождения в обоих направлениях (отсюда и различие междупередним итераторомидвунаправленным итератором). Семантическая разница может быть легко замечена в разнице между набором конкретных структур данных, которые имеют передние итераторы, и набором, который имеет двунаправленные итераторы. Например, списки, связанные по отдельности, попадают в набор структур данных, имеющих передние итераторы, но не двунаправленные итераторы. Кроме того, набор алгоритмов, которые можно реализовать, используя только передние итераторы, сильно отличается от набора, который может быть реализован с двунаправленными итераторами. Из-за этого важно отнести семейства требований к довольно мелкозернистым понятиям. Например, требования к итераторам учитываются в шести концепциях итератора STL (тривиальный, выходной, входной, прямой, двунаправленный и случайный доступ).
Статья Programming With Concepts раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.