Ответ 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) и ООП может более эффективно решать многие проблемы, делая классические шаблоны дизайна больше не подходящими для решения.