Які конкретні значення термінів: функції, методи, процедури та підпрограми?


11

Мені цікаво, які конкретні відмінності в термінології, яку ми використовуємо для групування пов'язаних частин коду. Я іноді бачив терміни, що вживаються взаємозамінно: багато мов OO навіть використовують ключове слово "функція" для визначення методу. (Чому?)

Якщо ви хотіли бути точними, які конкретні значення кожного? Або це все, що обирає кожна мова, щоб назвати її?


Єдині дві мови, які я знаю, що використовують functionдля методів, - це JavaScript та PHP. Обидва використовують одне і те ж ключове слово для неметодів (безкоштовних функцій), а у випадку JavaScript насправді не існує різниці між функціями та методами, принаймні, не на мовному рівні.

Приклади: у VB.Net Sub- це значення Functionбез повернення. У Pythonвас може бути функція, яка не входить до жодного класу, тому це не метод. Ви також можете оголосити функції в межах функцій, і це можна зробити і в C #. Іноді вони мають різні назви з тієї ж причини, що і яблука та ананаси: тому що вони різні.
робота

Що ви знайшли поки що, що змушує вас думати, що є розбіжність?
JeffO

Відповіді:


20
  • підпрограма, підпрограма
    "підпрограма", ймовірно, походить з мови складання. Деякі процесори містять інструкції щодо підтримки підпрограм як способу організації коду та повторного використання загальних розділів коду. Наприклад, процесор 6502 мав інструкції JSR (перехід до підпрограми) та RTS (повернення з підпрограми). Я пам’ятаю, що він також багато використовувався в структурованому програмуванні, в якому програма є ієрархією одиниць коду, які іноді називали підпрограмами або підпрограмами. ІМО, це найзагальніші терміни для деякої одиниці коду, до якої управління тимчасово передається з метою виконання заданого завдання.

  • функція, процедура
    Вони часто використовуються як взаємозамінні, але в деяких мовах існує відмінність. У Паскалі функція - це підпрограма, яка повертає значення, тоді як процедура - це підпрограма, яка цього не робить. У мовах C та суміжних мовах кожна підпрограма має тип повернення (навіть якщо він є void), тому різниці немає.

  • метод, функція члена
    Це два імені для однієї і тієї ж речі - по суті це функція, пов'язана з даним класом або об'єктом.

  • оператор
    Кожна мова має набір вбудованих операторів. У деяких мовах, таких як C ++, оператори - це функції, які можна перекрити (тобто замінити) та / або перевантажити (тобто визначено для нових типів).

  • анонімна функція
    Це стосується функції без імені. Анонімні функції - це по суті блоки коду, які можуть бути присвоєні змінним або передані як параметри для подальшого використання, наприклад, як підпрограми завершення.

  • закриття, лямбда-вираз, блок
    Закриття - це фрагмент коду, який пов'язаний з набором змінних. Я думаю про закриття як анонімні функції плюс контекст.


4
Не всі мови мають вбудовані оператори. Деякі, як-от Scheme та Haskell, просто дозволяють вам визначати функції з іменами типу "+" або ">> =". Крім того, вам, мабуть, слід додати, що в деяких мовах (наприклад, схема) "функція" передбачає референтну прозорість (наприклад, вона завжди повертає те саме значення для одного і того ж вводу без побічних ефектів), поки процедура не робить. Інакше чудова відповідь.
Тихон Єлвіс

Поки що я пам'ятаю, "оператори" використовувалися здебільшого для функцій з 2 аргументами. Вони були infix (оператор між аргументами:) 2 + 2. Є невеликі винятки, такі як 1-arg типу ++arg(префікс) або arg++(постфікс). Хоча, я не бачив багатьох операторів постфіксу ..
Дарек

-1

Це залежить від мов, що ви можете зробити з ними

  • вам потрібна відзнака
  • чи є різниця в синтаксисі, чи це просто зручність, коли йдеться про код

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

Якщо він щось повертає, його називали функцією.

У мові OOP, як Java, я рідко зустрічав термін "функція", але "метод", і вчили, що функції - це речі, які є глобальними, і їх може назвати кожен.

У масштабі функціональної та OOP-мови, метод не називається функцією, але ви можете передати таку річ іншому методу, і тоді вона стає функцією.

Підпрограма - це рутина, яку, як я розумію, викликає інша рутина.

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


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.