Просте запитання, але я часто чую ці три терміни, визначені такою жорстокістю, але які, як відомо, означають різні речі протягом багатьох років.
Які "правильні" визначення "процедури", "методи", "функції", "підпрограми" тощо?
Просте запитання, але я часто чую ці три терміни, визначені такою жорстокістю, але які, як відомо, означають різні речі протягом багатьох років.
Які "правильні" визначення "процедури", "методи", "функції", "підпрограми" тощо?
Відповіді:
Тут я йду з іншою відповіддю: практично кажучи, різниці насправді немає , за тим невеликим винятком, що "метод" зазвичай посилається на підпрограму, пов'язану з об'єктом в мовах ОО.
Усі терміни "процедура, функція, підпрограма, підпрограма та метод" означають одне і те ж: підпрограма, яку можна викликати у межах більшої програми. Але важко придумати визначення, яке фіксує всі варіанти використання цих термінів, оскільки вони не використовуються послідовно в мовах програмування чи парадигмах.
Можна сказати, що функція повертає значення. Ну, наступна функція C не повертає значення:
void f() { return; }
... але я сумніваюся, що ви знайдете когось, хто назвав би це процедурою.
Звичайно, у Pascal процедури не повертають значення, а функції повертають значення, але це лише відображення того, як Pascal був розроблений. У Fortran функція повертає значення, а підпрограма повертає кілька значень. І все ж ніщо з цього насправді не дозволяє нам придумати «універсальне» визначення для цих термінів.
Насправді, термін "процедурне програмування" відноситься до цілого класу мов, включаючи C, Fortran і Pascal, лише одна з яких насправді використовує термін "процедура", щоб означати що-небудь.
Отже, нічого з цього насправді не відповідає. Винятком є, ймовірно, "метод", який, здається, використовується майже повністю з мовами OO, посилаючись на функцію, пов'язану з об'єктом. Хоча, навіть це не завжди відповідає. Наприклад, C ++ зазвичай використовує термін "членська функція", а не метод, (хоча термін "метод" проник в просторічку C ++ серед програмістів.)
Справа в тому, що нічого з цього насправді не відповідає. Він просто відображає термінологію, якою користуються будь-які мови в той час.
Функція повертає значення, але процедура не робить.
Метод схожий на функцію, але внутрішньої по відношенню до частини класу. Термін метод використовується майже виключно в об'єктно-орієнтованому програмуванні.
function
виконує обидві ролі в JS, але функції JS все повертаються. Коли оператор return не має значення, це значення неявно undefined
. Коли твердження про повернення відсутнє, інтерпретатор додає неявну заяву повернення. Езотерика, можливо, але це відповідає визначенню, даному тут. Саме тому var x = function() {}();
є законним в JS; якби не неявна віддача, це могло б бути помилкою, як це було б у Паскалі.
Функція є те , що займає купу входів і повертає одне або кілька значень. Якщо повернені значення повністю визначаються вхідними даними, а функція не має жодних побічних ефектів (реєстрація, можливо, або викликає зміни стану поза собою), то це називається чистою функцією.
Процедура представляє собою функцію , яка не повертає значення. Зокрема, це означає, що процедура може викликати лише побічні ефекти. (Це може включати мутацію вхідного параметра!)
Метод є функцією , яка закриває над безліччю змінних, тобто замикання . Він приймає нульові або більше вхідних параметрів, має доступ до цього набору змінних і повертає нульове або більше значень. У мовах ОО цих методів додаються до об'єктів або класів.
У більшості основних мов OO ці змінні, що закриваються, називаються полями-членами або змінними екземпляра об'єкта. Метод може бути чистою функцією, нечистою функцією або процедурою.
Останнє визначення призводить до відповідності об'єкта = структура + закриття .
foo.doSomething()
не є параметричним. Він має один параметр (об'єкт foo
) із заданим із деяким синтаксичним цукром. Закриття могло б посилатися на свій об'єкт, не потребуючи такого параметра. Це не означає, що методи не можуть бути закритими, просто, що більшість ні, і що бути OO недостатньо для мови для підтримки закриття.
foo.doSomething()
закривається над foo
змінною. Будь-який виступ у програмі doSomething
може отримати доступ foo
через this
або self
, залежно від вашої мови. Це саме визначення "близького". Класи близькі до змінних своїх членів, тому (ігноруючи "що таке ОО"), OO є достатнім. Це досить добре відомо в літературі ...
foo.
на передній частині foo.doSomething()
? Ось ти передаєш doSomething()
параметр. Тільки тому, що він не знаходиться між круглими дужками, не означає, що це не параметр. Метод this
або self
всередині є просто синтаксичним цукром для посилання на цей параметр.
Брюс має хорошу відповідь . Я б додав, семантично:
printf
)A procedure should "do something" to the arguments
- або спричинить якийсь інший побічний ефект (наприклад printf
).
printf
повертає значення - кількість надрукованих символів - тому технічно це функція.
printf
це цінність. Це мало специфічний побічний ефект поза сферою його виклику: а саме вводу / виводу до того, яким стандартним висновком він повинен бути. Незважаючи на те, що у Скотта це розрізнення не було явним, у функціональних функціях програмування не повинно бути побічних ефектів, і він повинен мати можливість відповідати на запитання так, ніби у вас є фактичні дані, які він повертає.
хороші детальні відповіді вище; коротка історія полягає в тому, що вони будуть усіма смаками підпрограм; що розуміється під кожним терміном, буде залежати від контексту мови програмування
загалом, функції повертають значення, але цього не потрібно
методи є загальними термінами OOP на даний момент
у SQL зберігаються процедури мають виходи, але зазвичай повертають лише код помилки, тоді як визначені користувачем функції повинні повертати значення (яке може бути набором результатів)
знову ж таки, точна різниця між цими термінами залежить від того, з ким ви говорите!
80% кваліфікації безпосередньо пов'язані з ознайомленням з номенклатурою,
95% продуктивності - це здатність визначити, що корисно на даний момент, незважаючи на терміни, які використовуються для його опису
Я дуже вважаю за краще називати їх усіма методами в c #, крім тому, коли я використовував MSSQL, у нас були sproc's, але, звичайно, зараз ми використовуємо Postgres, і вони називаються функціями.