Подтвердить что ты не робот

С++ Design Pattern library?

Каковы наиболее распространенные библиотеки шаблонов проектирования С++?

Я прочитал о библиотеке Loki в книге Александреску, но теперь выглядит несколько мертвой. Есть ли что-то подобное?

4b9b3361

Ответ 1

"Шаблоны проектирования - это отчеты об ошибках в отношении вашего языка программирования" - Питер Норвиг

Чтобы ответить на вопрос, почему не так много библиотек шаблонов проектирования С++, полезно знать, какие шаблоны проектирования должны были решить в первую очередь. Классическая книга GoF в предисловии

Шаблоны проектирования описывают простые и элегантные решения для конкретных проблемы в объектно-ориентированном программном обеспечении.

Стиль объектно-ориентированного программирования 90-х годов в значительной степени основывался на использовании абстрактных классов в качестве интерфейсов, с конкретными классами реализации, полученными из этих интерфейсов. Шаблоны GoF описывают творческие, структурные и поведенческие отношения между объектами разных типов классов. Они были ключевым элементом: инкапсулировать и параметризовать то, что часто меняет. Многие шаблоны GoF также могут быть переформулированы с использованием шаблонов, но тогда гибкость ограничена временем компиляции, а не временем выполнения.

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

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

Полиморфизм стиля ООП в значительной степени основан на внутреннем полиморфизме: динамическая отправка функций основана на типе объекта. Современный С++ также использует внешний полиморфизм, где методы, такие как тип erasure, позволяют гибкость во время выполнения со статическим интерфейсом. Новые классы std::shared_ptr и boost::any или adobe::poly являются ярким примером этих методов.

Недавняя презентация ACCU от Tobias Darm показала множество примеров преобразования старых внутриполиморфных шаблонов GoF в этот новый стиль внешнеполиморфных шаблонов. Грубая идея состоит в том, чтобы заменить абстрактные классы аргументом функции, который может принимать std::function в качестве параметра. Затем std::function управляет полиморфной гибкостью снаружи. Многие из шаблонов GoF могут быть значительно улучшены с точки зрения шаблона таким образом.

TL; DR. Классические шаблоны GoF были адаптированы для устранения недостатков ООП. Но ООП больше не является доминирующим стилем C++. Комбинация общего программирования (Стандартная библиотека, Boost) и ООП может более эффективно решать многие проблемы, делая классические шаблоны дизайна больше не подходящими для решения.

Ответ 2

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

Ive никогда не пытался использовать Loki, но, читая книгу Alexandrescus, я не убеждал, что основанный на библиотеке подход действительно может многое предложить для многих моделей.

Ответ 3

Может показаться тавтологией, но наиболее распространенной является... сама стандартная библиотека!

Он не является, строго говоря, "библиотекой шаблонов", а представляет собой папку для ряда инструментов, предназначенных для реализации общей схемы.

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

Шаблоны имеют более высокий уровень абстракции, чем кодирование.

Ответ 4

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

Как вы можете видеть, испытать созданные шаблоны проектирования. Поэтому использование шаблонов проектирования кодируется как специалист. И для этого нет серебряной пули.

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

Библиотеки помогут вам понять, как шаблоны проектирования, используемые в этой библиотеке, облегчат вашу реализацию. Это даже не даст вам выбора, чтобы изменить дизайн.