Страницы

Поиск по вопросам

четверг, 25 октября 2018 г.

В чем разница между шаблонами, паттернами и дженериками?

В чем разница между шаблонами, паттернами и дженериками? Являются ли все три понятия одинаковыми по смыслу и разница в переводе? Или разница заключается в том как реализуются в разных языках одинаковый по смыслу функционал типа List?
В частности вопрос возник во время прочтения сравнений языков программирования и частого тезиса "В C++ есть шаблоны и нигде больше таких нет"


Ответ

Шаблоны (templates) в Си++ это частный случай обобщённых типов (generic types). Обобщённые типы в Си++ очень мощные, Тьюринг-полные. Вы, например, можете вычислять числа Фибоначчи во время компиляции с помощью шаблонов Си++.
В других языках (Java, C#) обобщённые типы гораздо проще. Соответственно, проще и компилятор, и отлов странных труднопонимаемых ошибок (см. Александреску головного мозга).
Обобщённые типы — довольно старая концепция, придуманная в одной из первых реализаций ML. Она позволяет избежать дублирования кода, не зависящего от конкретного типа, либо накладывающего на тип не очень строгие ограничения.
Например, обобщённый алгоритм, считающий среднее арифметическое коллекции объектов, накладывает на тип элементов два ограничения: элемент можно сложить с элементом и элемент можно разделить на целое число (такой тип ограничений реализован далеко не во всех языках программирования).
Обобщённая структура данных "список" не накладывает на тип элементов никаких ограничений, кроме тех, которые и так присущи любым объектам. В старых версиях таких языков, как C++, Java, C# без поддержки обобщённых типов, приходилось писать отдельную реализацию списка для каждой иерархии, либо постоянно приводить типы вверх и вниз
Что касается паттернов (patterns) то обычно под ними понимают крупные единицы проектирования объектно-ориентированных программ. Например, такие решения доступа к базам данных, как repository, unit of work, active record являются паттернами (они, описаны, в частности, в книгах Фаулера). DDD описывает паттерны aggregate root и value-object, Dependency Injection реализуется с помощью паттернов composite root, constructor injection и т.д.
Есть так же главная книга по паттернам, которая называется — Паттерны объектно-ориентированного проектирования.

Комментариев нет:

Отправить комментарий