общее программирование, как часто оно используется в промышленности

11

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

Мне любопытно - универсальное программирование (GP) широко используется в промышленности? Я предполагаю, что большинству программистов гораздо удобнее с ООП или они используют языки, которые не подчеркивают и не поддерживают GP, поэтому вне вызова структур / функций данных STL в C ++ у меня сложилось впечатление, что GP не так часто используется. на практике. Но, будучи на данный момент вне отрасли, было бы приятно услышать об этом от практикующих.

(когда я пишу это, я вижу, что универсальное программирование даже не является допустимым тегом!)

BD1
источник
Распределение тегов в StackOverflow, вероятно, гораздо более полезно в качестве статистического доказательства, чем приведенное здесь. См. Stackoverflow.com/questions/tagged/generic-programming , stackoverflow.com/questions/tagged/generics
Петер Тёрёк

Ответы:

7

Мне любопытно - универсальное программирование (GP) широко используется в промышленности?

Это действительно широко зависит от контекста команды и проекта.

Например, в видеоиграх часто код является «самым простым» возможным (и даже иногда слишком простым), но в больших архитектурах. Это потому, что разработчики игр имеют много проблем, которые нужно решить, и не хотят беспокоиться о метапрограммировании (это отдельный, очень абстрактный и сложный для понимания язык внутри C ++).

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

Но в игровой разработке большинство людей просто избегают метапрограммирования.

Теперь, с другой стороны, некоторые действительно сложные или тяжелые приложения обработки, которые не являются распространенными, требуют некоторого тяжелого метапрограммирования из-за требований к производительности и гибкости (во время компиляции), которые не являются общими. Я работаю в одном прямо сейчас.

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

В середине большинство людей будут просто использовать метапрограммирование как «клиент», а не как «дизайнер». Большая часть кода метапрограммирования объединена в библиотеки, потому что библиотеки являются инструментами для кода, и что может быть лучше библиотеки, которая может адаптироваться к пользовательским типам, с которыми вы работали до сих пор?

Boost (http://boost.org) - это набор библиотек, некоторые из которых сделаны из тяжелой метапрограммирующей черной магии и используются во многих магазинах C ++ как «STL ++», расширение STL (и так оно и есть). Не каждый магазин использует его по нескольким причинам, например, совместимость с компилятором (некоторые библиотеки надстроек могут заставить ваш компилятор извиняться за каждый раз, когда он причиняет вам боль ...) и чаще, потому что некоторым разработчикам не нравится неспособность понять как работает инструмент внутри (попытайтесь понять Boost.Spirit ...)

В каких бы компаниях вы ни работали, некоторые будут использовать эту парадигму, некоторые - меньше или не будут вообще или даже запретят их.

Нет единого мнения, потому что ни у кого нет одинаковых потребностей, контекста или команды.

Но все же, очевидно, он используется. Может быть, спросите, кто использует boost в своем списке рассылки, чтобы иметь больше примеров из реальной жизни?

Klaim
источник
1
+1 за клиента против дизайнера. По моему опыту, немногие разработчики понимают их реализацию, так что нет смысла создавать новый универсальный код в приложении, если это не приводит к значительному улучшению удобства сопровождения. Библиотеки, предназначенные для широкого повторного использования, подпадают под это условие гораздо чаще, чем отдельные приложения.
Карл Билефельдт
Спасибо за подробный ответ. Я сам поклонник Boost, и я решил спросить об этом, и подумал, стоит ли копаться в BGL, который требует значительно больше знаний о GP, чем другие библиотеки Boost. Ваш комментарий о мире разработки игр довольно интригующий. Я поражен навыками разработки современных игр, и интересно услышать, что они, вероятно, изолированы от более новых методологий программирования, а не на переднем крае их.
bd1
Что ж, разработчики игр управляют высоким уровнем сложности только благодаря архитектуре игровых концепций. Добавление мета-инструкций просто все усложняет, поэтому оно должно быть действительно хорошо обосновано. Другое дело, что многие разработчики игр работают на консолях, которые представляют собой очень специфическое оборудование с очень специфическими компиляторами, которые не позволяют выполнять все попытки boost (например, без исключений, множественного наследования или некорректной работы из документа компилятор (правдивая история)). Итак, есть веские причины.
Klaim
5

Мне любопытно - универсальное программирование (GP) широко используется в промышленности?

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

Я предполагаю, что большинству программистов гораздо удобнее с ООП или они используют языки, которые не подчеркивают и не поддерживают GP, поэтому вне вызова структур / функций данных STL в C ++ у меня сложилось впечатление, что GP не так часто используется. на практике.

По крайней мере, по моему опыту, ваша точка зрения неверна. ООП и общее программирование не являются взаимоисключающими. На самом деле, вы должны использовать синергетические эффекты их объединения. Как я уже говорил ранее, причина, по которой вы не видите его так часто, как другие методы, заключается в том, что вам это не нужно так часто. Но это очень полезная функция, которая очень помогает вам сохранять ваш код СУХИМЫМ . Какие языки на самом деле не подчеркивают поддержку GP в высокоуровневом программировании? 3 из 5 языков Tiobe Top 5 поддерживают шаблоны / шаблоны. А PHP динамически типизирован, поэтому он действительно не нужен. Ну и что?

сокол
источник
Принимая во внимание, я не имел в виду, что ООП и ГП - это выбор. Тем не менее, многие из проектов, которые я видел, выглядят строго ООП в Java. Я думаю, что более поздние версии Java поддерживают GP, но какая часть Java-программистов действительно использует эту функциональность? Как я уже сказал, я не работаю в промышленности, и моя точка зрения может быть искажена, поэтому я и задал вопрос.
bd1
@ bd1: более старые приложения, написанные до того, как Java поддерживал дженерики, или до того, как конкретный набор инструментов поддерживал эту версию Java, не будут иметь дженерики, и разработчики могут продолжать избегать дженериков в этом конкретном проекте, чтобы сохранить согласованность кода. Я видел это, и это зависит от проекта и разработчиков. Любые проекты, которые я видел, были начаты после того, как поддержка дженериков Java была широко распространена, как правило, часто используют их, когда это необходимо.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner: Обобщения в Java полностью отличаются от шаблонов C ++. Обобщения Java являются на 100% чистым синтаксическим сахаром и не поддерживают метапрограммирование.
Кевин Клайн
«ООП и универсальное программирование не являются взаимоисключающими». Действительно, обе являются формами полиморфизма, соответственно, специального и параметрического полиморфизма. Таким образом, это два разных инструмента для разных видов полиморфизма.
Джорджио
4

Шаблоны C ++ широко используются для вещей, отличных от контейнеров - по крайней мере, в моей проблемной области (количественные финансы). Я бы даже рискнул сказать, что он иногда используется слишком часто, для целей, где было бы достаточно простых старых виртуальных функций (и не увеличивало бы время компиляции так сильно).

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

quant_dev
источник