Мне грустно видеть, что они выпадают из списка.
Лично мне нравятся типы, которые я использую для подчинения известному интерфейсу, будь то примитивы, структуры или классы. Таким образом, я знаю, как я могу использовать тип и что я должен реализовать для предоставления типа.
Этого легко достичь с помощью стандартного объектно-ориентированного программирования. Однако, по моему мнению, хотя технически универсальное программирование строго типизировано, оно теряет концепцию интерфейса, которую обеспечивает типизация ОО. На самом деле универсальное программирование похоже на динамическую типизацию, но разрешается при компиляции с точки зрения интерфейса.
Например, я передаю итератор в алгоритм, который он должен предоставить некоторым операторам, но нет интерфейса для указания того, что эти операторы должны делать или каковы их контракты (только документация). Если у вас есть operator++()
и operator*()
, он будет скомпилирован, но он не даст вам таких же гарантий типа, которые интерфейсы дают вам в OO.
Для меня концепции приносят типы в общее программирование, а интерфейсы определенности приносят в ОО, лучшая компиляция - это просто бонус.
Я знаю, что мы все программисты на С ++, и мы очень умны, мы читаем документацию и понимаем перегрузку операторов и тонкости общего программирования. Но когда язык обеспечивает гарантии, на которые я могу положиться, и компилятор может тестировать, я могу тратить больше сил на решение проблем, за которые мне платят.