В какой мере современные C++ устраняют потребность в шаблонах проектирования?
Книга Design Patterns от GoF, вышедшая в 1994 году, была написана с учетом C++, как и языков, и многие примеры кода были приведены в C++. Программисты других языков считали, что их языкам не нужны эти 23 шаблона проектирования, поскольку эти языки имеют функции, которые сделали многие из шаблонов излишними.
Из Википедии:
Основная критика шаблонов проектирования заключается в том, что его шаблоны являются обходными решениями для недостающих функций в C++, заменяя элегантные абстрактные функции длинными конкретными шаблонами, по существу становясь "человеческим компилятором" или "генерируя вручную расширения какого-то макроса". Питер Норвиг демонстрирует, что 16 из 23 шаблонов в Design Patterns упрощены или устранены (через прямую поддержку языков) в Lisp или Dylan.
C++ претерпел пять изменений с момента выпуска книги "Образцы дизайна" (в 98, 03, 11, 14, 17). Поэтому вопрос в том, насколько современный C++ упрощает или устраняет необходимость в этих 23 шаблонах проектирования?
Было бы неплохо перечислить шаблон проектирования вместе с языком C++, который устраняет или упрощает необходимость в этом шаблоне.
Ответы
Ответ 1
Вы правы, что сейчас не требуется ряд шаблонов. Однако некоторые архитектурные шаблоны, такие как адаптер, "нечувствительны к языку" и широко используются в корпоративном программировании для развязки слоев. Некоторые шаблоны, такие как посетитель, более читабельны и лучше контролируются, чем альтернативы, основанные на новых языковых функциях. Поэтому я думаю, что шаблоны проектирования должны быть пересмотрены, но не отброшены.
Ответ 2
Я бы сказал, что шаблоны проектирования - это концепции, которые моделируются на определенном языке с использованием языковых функций.
Например, как указано в комментариях, шаблон Command может быть смоделирован с помощью std::function
или любого другого вызываемого.
Но модели не делают понятия ненужными. Концепции - очень полезный инструмент для мышления и проектирования, тогда как модели при внедрении.