Какая парадигма языка программирования подходит для какой работы?

насколько я знаю (не так много, я признаю), в настоящее время популярные парадигмы программирования являются объектно-ориентированными (Java, C#, Ruby) vs функциональными (F#). Как человек, который в основном знаком с первой парадигмой, у меня есть несколько вопросов:

  • может ли программист просто придерживаться одной парадигмы всю свою жизнь? Или, другими словами, все проблемы можно свести к гвоздям для одного молотка?
  • Если нет, то какой инструмент подходит для какого типа задач? Например: web-based vs desktop, создавая красивые и отзывчивые интерфейсы, способные быстро хрустеть данными и т. д.
  • людям когда-нибудь нужно было изучать новую парадигму? Для моих прошлых двух заданий моим рабочим местам требовались Java и C#. Существуют ли рабочие места, которые специально используют языки, отличные от OO?

очевидно, что нет" лучших " языков, но мне интересно, Стоит ли тратить время и энергию на изучение новой парадигмы. Заранее спасибо!

8 ответов


" или другими словами, все проблемы могут быть сведены к гвоздям для одного молотка?" Утвердительный ответ. Период. Любой язык программирования, вы, вероятно, столкнетесь будет как все остальные. На самом деле существует формальное определение "полноты" для языка программирования.

" приходилось ли людям когда-либо изучать новую парадигму?" Всегда.

на самом деле есть трюк, чтобы следить за взлетами и падениями "сдвигов парадигмы". За последние 30 лет моей карьеры, я видел, что Программирование переросло из относительно упрощенной императивной / процедурной модели в ряд гораздо более богатых моделей, которые включают в себя лучший баланс между процессом и данными.

Я заметил следующее...

часть движущей силы-сообщество искусственного интеллекта. Многие из этих "новых моделей" начинались как схемы представления знаний ИИ. Они получили тягу там, затем они просочились в более основные приложения.

Отношение Сущности первоначально модель предназначалась для представления знаний, а не для деловых операций. Объектная модель также предназначалась для представления знаний. Потом ребята из симуляции нашли его. Теперь она есть у всех нас.

вот мое заключение.

программное обеспечение-это представление знаний.

ваш выбор парадигмы или модели или подхода или стиля основан на ответе на следующий вопрос:

" Как Я Могу Лучше Всего Представить Это Проблема?"

Если проблема имеет объекты и отношения, OO. Если проблема имеет алгоритмы и преобразования, карты, фильтры и уменьшает, функциональный. Если проблема динамична, изменчива и гибка, динамична. Если проблема статична и будет быстро масштабироваться, статична.


стоит изучить альтернативные парадигмы (OO, функциональные, процедурные, динамические и т. д.), Потому что это поможет вам думать о проблемах по-разному.

например, подумайте о разнице в решении обхода дерева линейным способом (первый способ, которым я это сделал) по сравнению с использованием рекурсии. Или комбинация Google Map и Reduce, чтобы помочь им индексировать интернет.

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


парадигма не зависит от языка. Вы можете развиваться в стиле OO в C (взгляните на GTK). Когда я программирую на Java, я использую в основном функциональный стиль.

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

в качестве (тривиального) примера сравните реализации quicksort в Java и Ocaml или, еще лучше, Haskell на этой странице: http://www.rosettacode.org/rosettacode/w/index.php?title=Quicksort

(Это не означает, что функционал лучше. Есть проблемы, которые лучше решить с помощью OO).


можно все проблемы уменьшить к ногтям для одного молотка?

Err да. Проблемы можно решить одним молотком. Его просто распиливание этой двери пополам занимает гораздо больше времени.

людям когда-нибудь нужно было изучать новую парадигму? Для моих прошлых двух заданий моим рабочим местам требовались Java и C#. Существуют ли рабочие места, которые специально используют языки, отличные от OO?

разработчики должны делать это каждые 15-20 лет или так.

существует, безусловно, целая индустрия небольших компаний с системами, основанными на доступе, написанными с процедурным VBA. (и я думаю, что работал на большинство из них). Классические разработчики ASP должны учиться ASP.NET - ... Разработчики Perl изучают Python. Партия развития сменился событиями развития.


Я думаю, что вы найдете ответы на все доски. Чем больше я работаю, тем больше я нахожу, что "полезно" знать некоторых других. как разработчик C#/VB/SQL Server, я считаю более полезным для меня узнать немного о F# и некоторых других языках, чтобы просто получить широкую экспозицию, чтобы действительно выяснить, какой инструмент является правильным...


динамический материал пугает меня до чертиков, но Ruby on Rails-лучшая система разработки, которую я видел для веб-материалов. Я не чувствую себя комфортно с использованием его для действительно большого, тяжелого проекта обслуживания, хотя, потому что слишком легко изменить смысл существующего, скомпилированного, готового кода. Также слишком легко для стиля кодирования одного человека, чтобы превратить его в новый язык.

Dynamic / scripting также полезно знать для системных администраторов и всех, кто работает в системе Linux. Написание быстрого скрипта в BASH или Ruby бьет по аду, пытаясь реализовать ту же функциональность в Java или c++.

OO упрощает понимание больших объемов кода. Если у вас есть большая команда или несколько больших команд и вам нужно быстро дать обзор, OO значительно упрощает описание и изоляцию данной части функциональности. Я должен сказать правильно закодированный OO!

Я понимаю, что функционал хорош для многопоточного программирования, так как все, как правило, неизменны.


развитие навыков проектирования и архитектуры с учетом ООП является наиболее желательным набором навыков для большой языковой агностической карьеры.

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


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

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

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

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