В чем разница между «функцией» и «процедурой»? - PullRequest
178 голосов
/ 06 апреля 2009

Вообще говоря, мы все слышим о функциях или процедурах в языках программирования. Однако я только что узнал, что я использую эти термины практически взаимозаменяемо (что, вероятно, очень неправильно).

Итак, мой вопрос:

В чем разница с точки зрения их функциональности, назначения и использования?

Пример был бы оценен.

Ответы [ 17 ]

267 голосов
/ 06 апреля 2009

Функция возвращает значение, а процедура просто выполняет команды.

Название функции происходит от математики. Он используется для расчета значения на основе ввода.

Процедура - это набор команд, которые можно выполнить по порядку.

В большинстве языков программирования даже функции могут иметь набор команд. Следовательно, разница только в возврате части значения.

Но если вы хотите содержать функцию в чистоте (просто посмотрите на функциональные языки), вам нужно убедиться, что функция не имеет побочного эффекта.

37 голосов
/ 06 апреля 2009

Это зависит от контекста.

В языках, подобных Паскалю, функции и процедуры являются различными объектами, различающимися в зависимости от того, возвращают они значение или нет. Они ведут себя по-разному в отношении. синтаксис языка (например, вызовы процедур в операторах формы; вы не можете использовать вызов процедуры внутри выражения, тогда как вызовы функций не создают операторов, вы должны использовать их в других операторах) Поэтому программисты на Паскале различают их.

В С-подобных языках и многих других современных языках это различие исчезло; в статически типизированных языках процедуры - это просто функции с забавным типом возврата. Вероятно, поэтому они используются взаимозаменяемо.

В функциональных языках обычно нет такой вещи как процедура - все является функцией.

15 голосов
/ 06 апреля 2009

Пример в C:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

Хотя вы должны заметить, что в стандарте C речь идет не о процедурах, а только о функциях.

11 голосов
/ 06 апреля 2009

Обычно процедура - это последовательность инструкций.
Функция может быть такой же, но обычно возвращает результат.

10 голосов
/ 06 апреля 2009

Есть термин подпрограмма или подпрограмма , который обозначает параметризованный фрагмент кода, который можно вызывать из разных мест.

Функции и процедуры являются реализациями тех. Обычно функции возвращают значения, а процедуры ничего не возвращают.

6 голосов
/ 18 декабря 2013

Основные отличия

  • Функция должна возвращать значение, но в хранимых процедурах это необязательно: процедура может возвращать значения 0 или n .
  • Функции могут иметь только входные параметры для него, тогда как процедуры могут иметь параметры ввода / вывода.
  • Для функции обязательно принимать один входной параметр, но хранимая процедура может принимать от 0 до n входных параметров.
  • Функции можно вызывать из процедуры, тогда как процедуры нельзя вызывать из функции.

Продвинутые различия

  • Исключения могут обрабатываться блоками try-catch в процедуре, тогда как блок try-catch не может использоваться в функции.
  • Мы можем перейти к управлению транзакциями в процедуре, тогда как в функции мы не можем.

В SQL:

  • Процедура допускает в нем SELECT, а также операторы DML (INSERT, UPDATE, DELETE), тогда как функция допускает только оператор SELECT.
  • Процедуры не могут использоваться в операторе SELECT, тогда как функции могут быть встроены в оператор SELECT.
  • Хранимые процедуры не могут использоваться в инструкциях SQL нигде в блоке WHERE (или HAVING или SELECT), тогда как функции могут.
  • Функции, которые возвращают таблицы, могут рассматриваться как другой набор строк. Это можно использовать в блоке JOIN с другими таблицами.
  • Встроенные функции можно рассматривать как представления, которые принимают параметры и могут использоваться в JOIN блоках и других операциях Rowset.
5 голосов
/ 31 декабря 2013

Внутри процедуры мы можем использовать операторы DML (Вставить / Обновить / Удалить), но внутри функции мы не можем использовать операторы DML.

Процедура может иметь оба входных / выходных параметра, но функция может иметь только входной параметр.

Мы можем использовать блок Try-Catch в хранимой процедуре, но в функции Мы не можем использовать блок Try-Catch.

Мы не можем использовать хранимую процедуру в операторе Select, но в функции мы можем использовать в операторе Select.

Хранимая процедура может возвращать 0 или n значений (максимум 1024), но функция может возвращать только 1 значение, которое является обязательным.

Хранимая процедура не может быть вызвана из функции, но мы можем вызвать функцию из хранимой процедуры.

Мы можем использовать транзакцию в хранимой процедуре, но в функции мы не можем использовать транзакцию.

Мы не можем использовать хранимую процедуру в выражении Sql где-либо в разделе Где / Имеем / выберите, но в функции, которую мы можем использовать.

Мы не можем присоединиться к хранимой процедуре, но мы можем присоединиться к функции.

для получения дополнительной информации .. нажмите здесь ... http://dotnet -developers-cafe.blogspot.in / 2013/08 / разница между хранимой процедурой и.html

5 голосов
/ 06 апреля 2009

Точнее, функция f подчиняется свойству f (x) = f (y), если x = y, т.е. она вычисляет один и тот же результат каждый раз, когда она вызывается с одним и тем же аргументом (и таким образом, это не меняет состояние системы.)

Таким образом, rand () или print ("Hello") и т. Д. Являются не функциями, а процедурами. В то время как sqrt (2.0) должен быть функцией: не наблюдается наблюдаемого эффекта или изменения состояния, независимо от того, как часто он вызывается, и он всегда возвращает 1.41 и некоторые.

3 голосов
/ 06 апреля 2009

Если мы здесь не зависимы от языка, процедура обычно определяет серию действий, необходимых для надежного и идемпотентного достижения определенного результата. То есть процедура - это в основном алгоритм.

Функции, с другой стороны, являются несколько независимым фрагментом кода в более крупной программе. Другими словами, функция - это реализация процедуры.

3 голосов
/ 06 апреля 2009

В большинстве случаев: функция возвращает значение, а процедура - нет. Обе части кода сгруппированы вместе, чтобы сделать одно и то же.

В контексте функционального программирования (где все функции возвращают значения), функция является абстрактным объектом:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Здесь f - та же функция, что и g, но это другая процедура.

...