Различия и сходства между парадигмами программирования

StackOverflow https://stackoverflow.com/questions/2424269

  •  19-09-2019
  •  | 
  •  

Вопрос

Я работаю разработчиком последние 4 года, из которых 4 года до этого изучал разработку программного обеспечения в колледже.За 4 года работы в отрасли я немного поработал на VB6 (это была шутка), но большая часть работы была на C#/ASP.NET.За это время я перешел от «объектно-ориентированной» процедурной парадигмы к объектно-ориентированной парадигме.

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

Это было полезно?

Решение

Безусловно, лучшие объяснения парадигм программирования можно найти в работах Питера ван Роя.Особенно в книге Концепции, методы и модели компьютерного программирования Питер Ван Рой и Сейф Хариди. (Вот сопутствующая вики.) CTM использует мультипарадигмальный язык распределенного программирования Oz познакомить со всеми основными парадигмами программирования.

Питер ван Рой также сделал этот удивительный плакат, показывающий 34 основные парадигмы, их отношения и позиции по различным направлениям.Постер представляет собой невероятно сжатую версию CTM.Более подробное объяснение этого плаката содержится в статье. Парадигмы программирования для чайников:Что должен знать каждый программист который появился как глава в книге Новые вычислительные парадигмы для компьютерной музыки, под редакцией Г.Ассаяг и А.Герцо.

Другой отличная книга, демонстрирующая несколько основных парадигм программирования. Структура и интерпретация компьютерных программ Гарольд Абельсон и Джеральд Джей Сассман.Эта книга была основой CS101 Массачусетского технологического института на протяжении нескольких десятилетий. Курс, который вели сами Абельсон и Сассман, был записан на корпоративном тренинге Hewlett-Packard в 1986 году..

Основное различие между CTM и SICP заключается в том, что CTM демонстрирует большинство основных парадигм, используя язык, который их поддерживает (в основном Distributed Oz, но также и некоторые другие).SICP OTOH демонстрирует их с помощью внедрение их на языке, который делает нет поддерживать их изначально (подмножество Scheme).Видеть, как объектно-ориентированная ориентация реализована в дюжине или около того строк кода, чертовски здорово.

Ты можешь найти видеозаписи и материалы курса весны 2005 г. на веб-сайте OpenCourseWare Массачусетского технологического института.. Еще одна запись курса недолговечного проекта MIT ArsDigita University..Фактически, SICP преподают и в других университетах. сейчас этому учат в Беркли.

Лично мой опыт показал, что Действительно понимание парадигмы программирования возможно только

  • одна парадигма за раз и
  • на языках, которые сила ты в парадигме

В идеале вы должны использовать язык, который доводит парадигму до крайности.В мультипарадигмальных языках слишком легко «обмануть» и вернуться к парадигме, которая вам более удобна.А использование парадигмы в качестве библиотеки действительно возможно только в таких языках, как Scheme, которые специально разработаны для такого рода программирования.Например, изучение ленивого функционального программирования на Java — не лучшая идея, хотя для этого существуют библиотеки.

Вот некоторые из моих любимых:

  • объектно-ориентированность в целом: Себя
    • объектно-ориентированная ориентация на основе прототипов:Себя
    • объектно-ориентированная классовая ориентация: Новояз
      • статическая объектная ориентация на основе классов: Эйфелева
    • OO на основе множественной отправки: Дилан
    • функционал + объектно-ориентированность: Скала
  • функциональное программирование: Хаскелл
    • чисто функциональное программирование:Хаскелл
      • ленивое чисто функциональное программирование:Хаскелл
    • статическое функциональное программирование:Хаскелл
    • динамическое функциональное программирование: Кложур
  • императивное программирование: Луа
  • параллельное программирование:Кложур
    • параллельное программирование с передачей сообщений: Эрланг
  • метапрограммирование: Схема
  • языково-ориентированное программирование: Рабочая среда намеренного домена

Другие советы

Вот мое мнение:

  • Функциональное программирование означает написание функций, которые принимают данные и работают с ними.Вы создаете большие приложения путем сборки функций.
  • Объектно-ориентированное программирование инкапсулировало данные и их операторы в единый компонент, который хорошо отображает ментальные модели.Вы создаете большие приложения из взаимодействующих объектов.
  • Декларативное программирование (например, SQL) отделяет то, что делается, от того, как это делается.Вы сообщаете реляционной базе данных, что вы от нее хотите, и оставляете управление механизму запросов.

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

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

Исходя из этого, вы выбираете или разрабатываете предметно-ориентированный язык (DSL) и формулируете свою проблему на этом языке.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top