Простой вопрос, но я часто слышу эти три термина, определенные с такой жестокостью, но которые, как мне было известно, означали разные вещи на протяжении многих лет.
Каковы «правильные» определения «процедур», «методов», «функций», «подпрограмм» и т. Д.?
programming-practices
coding-standards
terminology
Джанго Рейнхардт
источник
источник
Ответы:
Здесь я собираюсь дать другой ответ: практически, на самом деле, нет никакой разницы , за небольшим исключением, что «метод» обычно относится к подпрограмме, связанной с объектом в ОО-языках.
Термины «процедура, функция, подпрограмма, подпрограмма и метод» на самом деле означают одно и то же: вызываемая подпрограмма в более крупной программе. Но трудно придумать определение, которое охватывает все варианты использования этих терминов, потому что они не используются единообразно в разных языках программирования или парадигмах.
Вы могли бы сказать, что функция возвращает значение. Хорошо, следующая функция C не возвращает значение:
... но я сомневаюсь, что вы найдете кого-нибудь, кто назвал бы это процедурой.
Конечно, в Pascal процедуры не возвращают значений, а функции возвращают значения, но это всего лишь отражение того, как был разработан Pascal. В Фортране функция возвращает значение, а подпрограмма возвращает несколько значений. Тем не менее, ничто из этого не позволяет нам придумать «универсальное» определение этих терминов.
Фактически, термин «процедурное программирование» относится к целому классу языков, включая C, Fortran и Pascal, только один из которых фактически использует термин «процедура» для обозначения чего-либо.
Так что ничего из этого не соответствует действительности. Единственным исключением, вероятно, является «метод», который, кажется, почти полностью используется с языками ОО, ссылаясь на функцию, связанную с объектом. Хотя даже это не всегда соответствует. Например, в C ++ обычно используется термин «функция-член», а не метод (даже несмотря на то, что термин «метод» вошел в общеупотребительный язык C ++ среди программистов).
Дело в том, что все это не соответствует действительности. Он просто отражает терминологию, применяемую теми языками, которые популярны в то время.
источник
Функция возвращает значение, но процедура не делает.
Метод похож на функцию, но
внутренней по отношению кчасти класса. Термин метод используется почти исключительно в объектно-ориентированном программировании.источник
function
выполняет обе роли в JS, но все функции JS возвращают. Когда оператор возврата не имеет значения, значение является неявнымundefined
. Когда оператор return отсутствует, интерпретатор добавляет неявный оператор return. Эзотерически, возможно, но это согласуется с определением, данным здесь. Вот почемуvar x = function() {}();
законно в JS; если не для неявных возвратов, это должно быть ошибкой, как это было бы в Паскале.Функция является то , что занимает кучу входов и возвращает одно или несколько значений. Если возвращаемые значения полностью определяются входными данными, и функция не имеет побочных эффектов (возможно, регистрация или изменение состояния вне себя), то она называется чистой функцией.
Процедура представляет собой функцию , которая не возвращает значение. В частности, это означает, что процедура может вызывать только побочные эффекты. (Это может включать изменение входного параметра!)
Метод является функцией , которая закрывает над множеством переменных, то есть замыкание . Он принимает ноль или более входных параметров, имеет доступ к этому набору переменных и возвращает ноль или более значений. В ОО-языках эти методы привязаны к объектам или классам.
В большинстве основных ОО-языков эти закрытые переменные называются полями-членами или переменными экземпляра объекта. Метод может быть чистой функцией, нечистой функцией или процедурой.
Последнее определение приводит к соответствию object = struct + .
источник
foo.doSomething()
не без параметров. У него есть один параметр (объектfoo
) с заданным синтаксическим сахаром. Замыкание сможет ссылаться на свой объект, не нуждаясь в таком параметре. Это не значит, что методы не могут быть замыканиями, просто этого не происходит, а того, что OO недостаточно для того, чтобы язык поддерживал замыкания.foo.doSomething()
закрывает поfoo
переменной. Любое заявление вdoSomething
может получить доступfoo
черезthis
илиself
, в зависимости от вашего языка. Это само определение «близко». Классы закрывают свои переменные-члены, поэтому (игнорируя «что такое OO»), OO достаточно. Это довольно хорошо известно в литературе ...foo.
впередиfoo.doSomething()
? Это вы передаетеdoSomething()
параметр. То, что это не между скобками, не означает, что это не параметр. Метод внутриthis
илиself
внутри является просто синтаксическим сахаром для ссылки на этот параметр.У Брюса хороший ответ . Я бы добавил, семантически:
printf
)источник
A procedure should "do something" to the arguments
- или вызвать другой побочный эффект (напримерprintf
).printf
возвращает значение - количество напечатанных символов - так что это технически функция.printf
это ценность. У него был специфический побочный эффект, выходящий за рамки его вызова: а именно ввод / вывод для любого стандартного вывода, которым он должен быть. Несмотря на то, что Скотт не указал это различие, функции функционального программирования не должны иметь побочных эффектов и должны иметь возможность отвечать на вопросы, как если бы у вас были реальные данные, которые он возвращает.хорошие подробные ответы выше; Короче говоря, все они будут подпрограммами; что подразумевается под каждым термином, будет варьироваться в зависимости от контекста языка программирования
в общем случае функции возвращают значение, но им не нужно
методы являются общими терминами ООП в настоящее время
в SQL хранимые процедуры имеют выходные данные, но обычно возвращают только код ошибки, тогда как пользовательские функции должны возвращать значение (которое может быть набором результатов)
Опять же, точное различие между этими терминами зависит от того, с кем вы разговариваете!
источник
80% владения языком напрямую связаны со знакомством с номенклатурой,
95% производительности - это способность определить, что полезно в данный момент, несмотря на термины, используемые для его описания.
Я предпочитаю вызывать их все методы в c #, за исключением тех случаев, когда я использовал MSSQL, у нас были sproc, но, конечно, теперь мы используем Postgres, и они называются функциями.
источник