Що саме таке процедурне програмування? Чим саме він відрізняється від ООП? Це те саме, що функціональне програмування?


32

Я програмую на Java в дуже об'єктно-орієнтованому (OO) стилі. OOP приходить до мене дуже інтуїтивно, але я маю дуже мало знань про інші види програмування.

Що саме таке процедурне програмування ? Чим саме він відрізняється від ООП? Це те саме, що і функціональне програмування ?

Раніше я вважав, що все програмування, яке не є документальним, є процедурним. Але я починаю вважати, що це неправда.


9
Обмін дослідженнями допомагає всім. Розкажіть, що ви пробували і чому це не відповідало вашим потребам. Це свідчить про те, що ви знайшли час, щоб спробувати допомогти собі, це позбавляє нас від повторення очевидних відповідей, а найбільше це допомагає вам отримати більш конкретну та релевантну відповідь. Також дивіться Як просити
gnat

2
Процедурне програмування - це не те саме, що функціональне програмування; це фактично те саме, що і об'єктно-орієнтоване програмування, мінус об'єкти та класи.
Мейсон Уілер

1
Імперативним OOP насправді є процедурне програмування, тому це саме те, що ви робите весь час ...
Ingo

Відповіді:


68

У Вікіпедії є хороші пояснення цих термінів. Незалежно, ось короткий виклад:


  • Декларативне програмування - протилежне імперативному програмуванню - воно вказує, що потрібно обчислити, а не як (наприклад, SQL, регулярні вирази).

  • Функціональне програмування моделює обчислення як вирази, які (можуть) давати значення. Функції є значеннями і можуть передаватися або повертатися з інших функцій. Мутація не відлякує; всі змінні за замовчуванням незмінні. Як результат, він є декларативним, ніж імперативним, оскільки він підкреслює те, що обчислюється, а не послідовність змін стану, необхідних для його досягнення.

  • Суто функціональне програмування взагалі відключає мутацію (хоча всупереч поширеній думці все ще є механізми досягнення побічних ефектів).
  • Загальне функціональне програмування додатково забороняє винятки та нескінченне циклічне циклічне програмування. (Загальна функція з математики - це функція, яка повертає значення для всіх її входів.)

Їхні стосунки трохи складні, тому що OOP - досить навантажений термін. Ви можете використовувати об'єкти як у функціональних мовах, так і в процедурних мовах, але мови, які рекламують себе як ОО є процедурними. Щоб ще більше заплутати проблему:

  • Більшість людей не знає різниці між об'єктом та абстрактним типом даних
  • Основні мови OOP не згадують ADT, надають їм дуже погану підтримку та рекламують об'єкти як Єдиний вірний шлях.
  • Ніхто не каже, що абстрактне програмування, орієнтоване на типи даних (адже це було б дурною справою; вам потрібні і ADT, і об'єкти.)

Це змушує людей думати, що ООП - єдиний спосіб досягти абстракції, і що функціональне програмування та ООП якимось чином протилежні або взаємовиключні. Багато людей також вважають, що всі функціональні мови є чистими і забороняють мутацію.

Крім того, люди, як правило, кидаються навколо імперативного / процедурного взаємозамінного характеру, іноді протиставляючи його OOP (маючи на увазі код без абстракції, як правило, C), а іноді протиставляючи його функціональному програмуванню. Наскільки я можу сказати, термін структуроване програмування здебільшого вийшов з ужитку (можливо, тому, що на даний момент більшість людей сприймають як належне, що гото та глобальні точки зору вважаються шкідливими.)


3
"забороняє стрибки" досить загальне; що включає if / while / etc .. можливо "забороняє довільні стрибки"?
Ізката

@Izkata Добрий момент, змінено.
Довал

1
Можливо, варто насправді посилатися на записи вікіпедії.
хайлем

І тому його називають Об'єктом "орієнтованим", а не "Об'єктом лише".
JeffO

1
@OrangeDog Чим це відрізняється від абстрактного типу даних, який також визначає інкапсульований набір даних та функції, які можуть на нього діяти? Більше того, у вас можуть бути непорушні об’єкти, тож у такому випадку в якому стані ?
Doval

12

Процедурне програмування - це підхід до програмування, який є однією з основних складових частин для багатьох інших мовних конструкцій (функціональних не є).

Більшість мов потрапляє до набору «Процедурного програмування», і це, мабуть, найбільш природний підхід до дизайну для більшості людей (якщо ви думаєте з точки зору ОО, то я б сказав, що ви меншість).

ОСНОВА є процедурною.

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

  • Спочатку роблю х
  • Другий я роблю y
  • По-третє, я роблю Z

Він вимагає механізму визначення "процедур" - блоків з іменованим кодом, аналогічним методам OO, який може приймати нуль до багатьох параметрів, а також необов'язково повертати значення (яке тоді зазвичай називатиметься функцією - ймовірно, що призводить до вашої плутанини з функціональними мовами )

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

Він просто описує, що програма буде структурована у вигляді серії процедур (або функцій), які працюють послідовно. Дані визначаються незалежно від процедур.

Це відрізняється від об'єктно-орієнтованого програмування, яке структурує програму навколо колекцій даних і методів (а не функцій), які діють на ці дані.

Один із способів подумати над цим - з точки зору обсягу даних.

У процедурній мові масштабування досить просте. Змінна може бути в межах даної процедури (оголошена локально), аж до рівня найголовнішого виклику, що викликає (оголошеного в усьому світі), з вкладеними діапазонами між ними.

В об'єктно-орієнтованій мові ви додаєте новий контекст масштабування, який є об'єктом, який зараз використовується, який є ортогональним вище.

Іншим способом мислити процедурне, порівняно з об'єктно-орієнтованим, є розгляд об'єктно-орієнтованої мови, де всі методи повинні бути оголошені статичними. Результат - це процедурна мова, де класи можуть використовуватися для групування процедур разом.


5

Процедурне програмування , безумовно, не є функціональним програмуванням.

Процедурне програмування - це коли у вас в голові модель комп'ютера як машини, і ви думаєте про те, як це змінити дані в пам'яті. Отже, спочатку ви встановлюєте Aзначення 3, потім додаєте 1 і зберігаєте це Aзнову в пам'яті (перезаписуючи попереднє значення).

Функціональне програмування могло б сказати, що Aце 3, і Bє A + 1, а потім дозволяти комп'ютеру зрозуміти, як обчислити B. Після того, як ви визначили, Aвін повинен бути незмінним (не змінюється). Функціонал також дозволяє робити такі речі, як передача функції навколо як значення першого класу (функція може приймати функцію як аргумент).

Об'єктно-орієнтоване програмування часто поєднує в собі обоє і є ортогональним для обох. Ви можете використовувати функціональне програмування і повертати незмінний об'єкт, і цей об'єкт може мати метод, який повертає деяке обчислене значення, і навіть робити це ліниво - це функціональне об'єктно-орієнтоване програмування. Ви також можете мати об’єкт, який представляє "сховище" (абстрактна версія бази даних), і ви можете "зберегти" речі в сховищі та "дістати" речі назад, і дозволити цьому об'єкту обробляти всі деталі того, як це робиться . Це в основному об'єктно-орієнтоване процедурне програмування.


0

OOP - це не що інше, як дещо вдосконалена форма процедурного програмування, яка знову ж таки належить до більшої родини імперативних програмувань. Доказом цього є те, що багато програмістів на C # / Java прагнуть "щось робити" і віддають перевагу таким методам:

void doThisAndThat(....) { ... do something ... }

Отже, програма, що складається з купки методів void (раніше відомих як процедури (sic!)) Та коду типу:

doThis();
if (state is that) doSomethingElse();
doThat();

є ідеальним процедурним програмуванням.


doThisAndThat (....) означає, що метод виконає більше ніж одне, що взагалі не є хорошою практикою. Розробники Java та C # переважно дотримуються єдиного принципу відповідальності. Я думаю, що ваша аналогія є хибною. objectmentor.com/resources/articles/srp.pdf
JohnK

@JohnK Я знаю, що це не найкраща практика. І все-таки загальна. Особливо серед розробників Java, якщо можна судити по тому, що кожен бачить на SO.
Інго

@JohnK Розробники Java та C # переважно дотримуються принципу єдиної відповідальності - послуги Lip?
Інго

Розробники Java в основному дотримуються єдиної відповідальності? Якби тільки це було правдою в реальному житті ...
Шрідхар Сарнобат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.