Просте запитання, але я часто чую ці три терміни, визначені такою жорстокістю, але які, як відомо, означають різні речі протягом багатьох років.
Які "правильні" визначення "процедури", "методи", "функції", "підпрограми" тощо?
Просте запитання, але я часто чую ці три терміни, визначені такою жорстокістю, але які, як відомо, означають різні речі протягом багатьох років.
Які "правильні" визначення "процедури", "методи", "функції", "підпрограми" тощо?
Відповіді:
Тут я йду з іншою відповіддю: практично кажучи, різниці насправді немає , за тим невеликим винятком, що "метод" зазвичай посилається на підпрограму, пов'язану з об'єктом в мовах ОО.
Усі терміни "процедура, функція, підпрограма, підпрограма та метод" означають одне і те ж: підпрограма, яку можна викликати у межах більшої програми. Але важко придумати визначення, яке фіксує всі варіанти використання цих термінів, оскільки вони не використовуються послідовно в мовах програмування чи парадигмах.
Можна сказати, що функція повертає значення. Ну, наступна функція 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, і вони називаються функціями.