Я программирую на Java в очень объектно-ориентированном (ОО) стиле. ООП приходит ко мне очень интуитивно, но я очень мало знаю о других видах программирования.
Что такое процедурное программирование ? Чем именно он отличается от ООП? Это то же самое, что функциональное программирование ?
Раньше я думал, что все программирование, которое не является ОО, является процедурным. Но я начинаю думать, что это неправда.
object-oriented
procedural
Авив Кон
источник
источник
Ответы:
В Википедии есть хорошие объяснения этим терминам. Несмотря на это, вот резюме:
Декларативное программирование является противоположностью императивного программирования - оно определяет, что вычислять, а не как (например, SQL, регулярные выражения).
Вычисление моделей функционального программирования в виде выражений, которые (могут) давать значения. Функции являются значениями и могут быть переданы или возвращены из других функций. Мутация не рекомендуется; все переменные являются неизменяемыми по умолчанию. В результате, это скорее декларативный, чем обязательный, поскольку он подчеркивает то, что вычисляется, а не последовательность изменений состояния, необходимых для его достижения.
Их отношения немного сложны, потому что ООП - довольно загруженный термин. Вы можете использовать объекты как на функциональных, так и на процедурных языках, но языки, которые рекламируют себя как ОО, являются процедурными. Для дальнейшего решения проблемы:
Это заставляет людей думать, что ООП является единственным способом достижения абстракции, и что функциональное программирование и ООП как-то противоположны или взаимоисключающие. Многие люди также думают, что все функциональные языки чистые и не допускают мутации.
Кроме того, люди обычно бросают вызов взаимозаменяемому императивному / процедурному, иногда противопоставляя его ООП (подразумевая код без абстракций, обычно C), а иногда противопоставляя его функциональному программированию. Насколько я могу судить, термин « структурированное программирование » в основном вышел из употребления (вероятно, потому, что на данный момент большинство людей считают само собой разумеющимся, что goto и globals считаются вредными.)
источник
Процедурное программирование - это подход к программированию, который является одним из основных строительных блоков для многих других языковых конструкций (функциональность не одна).
Большинство языков попадают в набор «процедурного программирования», и это, вероятно, самый естественный подход к проектированию для большинства людей (если вы думаете с точки зрения ОО, то я бы сказал, что вы в меньшинстве).
Бейсик процедурный.
Как уже говорили другие, это механизм последовательного структурирования программ.
Требуется механизм для определения «процедур» - блоков именованного кода, аналогичных методам ОО, которые могут принимать от нуля до многих параметров и, необязательно, возвращать значение (которое затем обычно называют функцией - что, вероятно, приводит к путанице с функциональными языками. )
Парадигма не диктует, какими вещами вы будете заниматься, или манерой вещей обойти.
Это просто описывает, что программа будет структурирована как последовательность процедур (или функций), которые работают последовательно. Затем данные определяются независимо от процедур.
Это отличается от объектно-ориентированного программирования, которое структурирует программу вокруг наборов данных и методов (не функций), которые воздействуют на эти данные.
Один из способов думать об этом с точки зрения объема данных.
На процедурном языке определение объема довольно просто. Переменная может находиться в области действия данной процедуры (объявленной локально), вплоть до уровня главной вещи, вызывающей вещи (объявленной глобально), с вложенными областями между ними.
В объектно-ориентированном языке вы добавляете новый контекст контекста, являющийся тем из используемого в данный момент объекта, который ортогонален вышеописанному.
Другой способ думать о процедурном, по сравнению с объектно-ориентированным, - рассмотреть объектно-ориентированный язык, где все методы должны быть объявлены как статические. Результатом является процедурный язык, где классы могут использоваться для группировки процедур вместе.
источник
Процедурное программирование определенно не функциональное программирование.
Процедурное программирование - это когда у вас в голове есть модель компьютера как машины, и вы думаете о том, как она модифицирует данные в памяти. Итак, сначала вы устанавливаете
A
значение 3, затем добавляете 1 иA
снова сохраняете его в ячейке памяти (перезаписывая предыдущее значение).Функциональное программирование будет означать «
A
3», «B
есть»A + 1
, а затем дать компьютеру понять, как рассчитатьB
. Как только вы определились,A
он должен быть неизменным (неизменяемым). Функциональность также позволяет вам выполнять такие функции, как передача функции в качестве первоклассного значения (функция может принимать функцию в качестве аргумента).Объектно-ориентированное программирование часто сочетает в себе оба и является своего рода ортогональным для обоих. Вы можете использовать функциональное программирование и возвращать неизменный объект, и у этого объекта может быть метод, который возвращает некоторое вычисленное значение, и даже делает это лениво - это функциональное объектно-ориентированное программирование. Вы также можете иметь объект, который представляет «хранилище» (абстрактную версию базы данных), и вы можете «сохранять» вещи в хранилище и «извлекать» вещи обратно, и позволить этому объекту обрабатывать все детали того, как это делается , Это в основном объектно-ориентированное процедурное программирование.
источник
ООП - это не более чем утонченная форма процедурного программирования, которая опять-таки принадлежит к большему семейству императивного программирования. Доказательством этого утверждения является то, что многие программисты на C # / Java склонны «что-то делать» и предпочитают такие методы, как:
Итак, программа, которая состоит из нескольких void-методов (ранее называвшихся процедурами (sic!)) И такого кода:
идеальное процедурное программирование.
источник