Чем процедуры отличаются от функций в программировании?

Процедуры и функции — это виды подпрограмм. Они позволяют выделять отдельные действия в именованные блоки. Главное различие обычно связано с возвращаемым результатом.

Функция

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

Например:

function sum(a, b) {
  return a + b;
}

const result = sum(3, 5);
function sum(a: number, b: number): number {
  return a + b;
}

const result = sum(3, 5);
func sum(a int, b int) int {
  result := a + b

  return result
}
public class Example {
  static int sum(int a, int b) {
    return a + b;
  }

  public static void main(String[] args) {
    var result = sum(3, 5);
  }
}
def sum(a, b):
  return a + b

result = sum(3, 5)

Функцию можно использовать внутри выражения:

const total = sum(3, 5) * 2;
const total = sum(3, 5) * 2;
package main
func main() {
  total := sum(3, 5) * 2
}
public class Example {
  public static void main(String[] args) {
    var total = sum(3, 5) * 2;
  }
}
total = sum(3, 5) * 2

Процедура

Процедура выполняет действие, но обычно не возвращает значение.

Например:

function printMessage(message) {
  console.log(message);
}

printMessage("Готово");
function printMessage(message: string): void {
  console.log(message);
}

printMessage("Готово");
package main
import "fmt"
func printMessage(message string) {
  fmt.Println(message)
}

func main() {
  printMessage("Готово")
}
public class Example {
  static void printMessage(String message) {
    System.out.println(message);
  }

  public static void main(String[] args) {
    printMessage("Готово");
  }
}
def print_message(message):
  print(message)

printMessage("Готово")

В TypeScript и C# для отсутствия результата используют тип void.

Отличие по назначению

Функция отвечает на вопрос: какое значение получить.

Процедура отвечает на вопрос: какое действие выполнить.

Примеры функций:

Примеры процедур:

Побочные эффекты

Процедуры часто выполняют действия с побочными эффектами: выводят данные, изменяют переменные, пишут в файл.

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

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

Различия в языках

В Pascal различие явно выражено:

procedure PrintMessage;
function Sum(a, b: Integer): Integer;

В C, Java, C#, TypeScript термин функция или метод часто используется шире, а процедура фактически представляется функцией без возвращаемого значения.

Сравнение

ПризнакФункцияПроцедура
Возвращает значениеДаОбычно нет
Используется в выраженияхДаОбычно нет
Типичная цельВычислить результатВыполнить действие
Примерsum, max, isValidprint, save, reset

Практическое правило

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

Вывод

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

Источники

  • Семакин И.Г. Основы программирования и баз данных. Учебник. - М.: Академия, 2014. - 224 с.
  • Симонова Е.В. Структуры данных в C#. Линейные и нелинейные динамические структуры. - Лань, 2018. - 152 с.
  • Бертран Мейер. Почувствуй класс. Учимся программировать хорошо с объектами и контрактами. - М.: Национальный Открытый Университет "ИНТУИТ": БИНОМ. Лаборатория знаний, 2011. - 775 с.
  • Мэтт Вайсфельд. Объектно-ориентированное мышление. - СПб.: Питер, 2014. - 304 с.
  • Ривест Р., Штайн К., Лейзерсон Ч., Кормен Т. Алгоритмы: построение и анализ. - М.: Вильямс, 2007. - 1296 с.
  • Стивенс Род. Алгоритмы. Теория и практическое применение. - М.: Эксмо, 2017. - 544 с.
  • Рублев В.С. Основы теории алгоритмов. - 2-е издание, исправленное. - М.: Научный мир, 2008. - 128 с.
  • Гольдберг Г.Л. Основы алгоритмизации и программирования. - М.: Академия, 2012. - 384 с.
  • Лаврищева И.В. Технология программирования. - М.: Горячая линия - Телеком, 2011. - 400 с.
  • Сергеев И.С., Сухоруков А.И., Шестаков А.А. Программирование: учебник для вузов. - М.: БИНОМ. Лаборатория знаний, 2013. - 512 с.