Чем процедуры отличаются от функций в программировании?
Процедуры и функции — это виды подпрограмм. Они позволяют выделять отдельные действия в именованные блоки. Главное различие обычно связано с возвращаемым результатом.
Функция
Функция выполняет вычисление и возвращает значение.
Например:
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, isValid | print, 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 с.