В чем разница между методом и функцией?
В чем разница между методом и функцией? Это значит, что метод возвращает значение, а функция не работает?
Amol 30 янв. 2011, в 08:30
Поделиться
Там действительно нет технической разницы в php. Но, на мой взгляд, функция — это более математическая вещь; он не меняет состояние, а только возвращает значение (например, f (x) = 2x). Метод изменяет состояние (например, вывод «hello world») и может возвращать значение. Это в основном обман: stackoverflow.com/questions/43777/… Надеюсь, что это ответ на ваш вопрос, хотя.
Tyler 30 янв. 2011, в 06:58
Функция имеет значение в большинстве языков программирования, не связанных с ее значением в математике.
Marc Rochkind 16 май 2013, в 17:56
Поделиться:
7 ответов
Лучший ответ
Метод — фактически функция, используемая в контексте класса/объекта.
Когда вы создаете функцию вне класса/объекта, вы можете называть ее функцией, но когда вы создаете функцию внутри класса, вы можете назвать ее методом.
class foo < public function bar() < // a method . >>
function bar() < // a function not part of an object >
Таким образом, объект может иметь методы (функции) и свойства (переменные).
Sarfraz 30 янв. 2011, в 07:02
Поделиться
это очень хороший ответ, очень ясно. Благодарю.
Ben 23 июль 2012, в 02:40
Методы должны вызываться примерно так: $this->bar() если внутри этого класса, в противном случае вы должны сначала создать экземпляр класса, а затем вызвать его, используя экземпляр класса (объект), например: $foo->bar() . Для функций это просто bar() .
knownasilya 03 нояб. 2012, в 20:51
Ты узнаешь что-то новое каждый день.
Erik Thiart 15 дек. 2016, в 19:26
Показать ещё 1 комментарий
Слова не противоречат друг другу, а скорее описывают два возможных аспекта подпрограммы. Попытка определить слова следует:
Подпрограмма: Набор инструкций, которые можно использовать несколько раз в одной программе.
Функция: Подпрограмма, которая возвращает значение. Производится из функций в математике (wikipedia).
Метод:. Подпрограмма, принадлежащая объекту или классу. Может быть функцией.
Я обычно использую слово «функция» для каждой подпрограммы, которая не имеет побочных эффектов, но возвращает одно четкое значение и слово «метод» для каждой подпрограммы, которая имеет побочный эффект.
Jonatan 03 апр. 2012, в 09:34
Поделиться
Это определения подпрограммы и функции, используемые в Fortran, одном из первых языков высокого уровня. Это было очень давно. Я не могу думать о современном языке, который использует «подпрограмму» в качестве ключевого слова. Язык Си использовал «функцию» для обоих, и именно так большинство других языков используют это слово. (Вы в порядке для метода.)
Marc Rochkind 16 май 2013, в 17:58
Но вопрос ничего не говорит о ключевых словах. Это вопрос терминологии о том, как описать код на разговорном языке. Я могу рекомендовать статью в Википедии en.wikipedia.org/wiki/Subroutine
Разница между функцией и методом
Функция: Функция — это многократно используемый фрагмент кода. У него могут быть входные данные, с которыми он может работать (например, аргументы), а также он может возвращать данные, имея тип возвращаемого значения. Это концепция процедурных и функциональных языков программирования.
Метод: работа метода аналогична функции, т. е. он также может иметь входные параметры/аргументы, а также может возвращать данные, имея тип возвращаемого значения, но имеет два важных отличия по сравнению с функцией.
- Метод связан или связан с экземпляром объекта, с помощью которого он вызывается.
- Метод ограничен операцией с данными внутри класса, в котором содержится метод.
- Это концепция объектно-ориентированного языка программирования.
Проще говоря, если функция является частью экземпляра класса, т.е. (объекта), то она называется методом, иначе она называется функцией.
В чем разница между методом и функцией?
Может ли кто-нибудь дать простое объяснение методов и функций в контексте ООП?
Когда значением свойства является функция, мы называем это методом
Что является противоположностью метода? Это мой вопрос. «Функция» является родительским понятием. Метод — это тип функции. Как называется тип функции, которая не является методом, но может вызываться напрямую по имени?
Было бы интересно увидеть другое объяснение, описывающее разницу между методами и функциями в r . Это интересно, так как метод обычно содержит функцию . Если метод является объектно-зависимой функцией, то проверка функции для класса объекта if(class(object)) < . >else будет концептуально эквивалентна методу?
Правильная терминология действительно может зависеть от языка, поэтому она может означать немного разные вещи в разных контекстах. Тем не менее, поскольку программисты, работающие с одним языком над другим, более привыкли к определенной терминологии. Программисты также находятся под влиянием использования их коллегами терминов (правильных или неправильных). Эти термины часто используются взаимозаменяемо. Посмотрите некоторые комментарии ниже, например.
Функция представляет собой фрагмент кода , который называется по имени. Это может быть передано данные для работы (т.е. параметры) и может дополнительно возвращать данные (возвращаемое значение). Все данные, которые передаются в функцию, передаются явно.
Метод представляет собой фрагмент кода , который называется по имени, связанное с объектом. В большинстве случаев она идентична функции, за исключением двух ключевых отличий:
- Метод неявно передается объект, на котором он был вызван.
- Метод может работать с данными, содержащимися в классе (помня, что объект является экземпляром класса — класс является определением, объект является экземпляром этих данных).
(это упрощенное объяснение, игнорирующее вопросы объема и т. д.)
Для 1) вы также должны добавить, что методы в C ++ называются функциями- членами . Таким образом, разница между функциями и методами в этом контексте аналогична разнице между функциями и функциями-членами в C ++. Кроме того, языки, подобные Java, имеют только методы. В этом случае функции будут аналогичны статическим методам, а методы будут иметь одинаковое значение. Для пункта 2) следует добавить, что метод может работать с данными частного экземпляра (члена), объявленными как часть класса. Любой код может получить доступ к общедоступным данным экземпляра.
функция — это математическая конструкция. Я бы сказал, что все методы являются функциями, но не все функции являются методами
Исходя из опыта функционального программирования, я чувствую глубокое различие между функцией и методом. В основном методы имеют побочные эффекты, и эти функции должны быть чистыми, что дает довольно приятное свойство ссылочной прозрачности
@TylerGillies и HHC, я согласен, было бы неплохо, если бы «функция» и «метод» означали то, что вы хотели, но ваши определения не отражают очень распространенное использование этих терминов.
По этому определению разве статический метод не будет считаться методом, потому что он не имеет ничего общего с конкретным экземпляром?
Метод на объекте.
Функция не зависит от объекта.
Для Java и C # есть только методы.
Для C есть только функции.
Для C ++ и Python это будет зависеть от того, находитесь ли вы в классе.
Настало время добавить C #.
@RosdiKasim Для C # есть только методы. (поскольку даже статические методы должны быть связаны с объектом)
Как насчет статических методов в классе? Они будут независимы от объекта (в Java). Разве это не было бы функцией тогда?
@Squeazer Есть вопрос о том, что в последнее время stackoverflow.com/questions/30402169/… Спецификация языка Java просто различает их как «метод класса» (статический) и «метод экземпляра». Так что они все еще методы.
У Java есть лямбда-выражения, которые являются функциями, которые не являются методами
‘method’ — это объектно-ориентированное слово для ‘function’ . Это в значительной степени все, что есть (т.е. никакой реальной разницы).
К сожалению, я думаю, что многие ответы здесь увековечивают или продвигают идею о том, что есть какое-то сложное, значимое различие.
На самом деле — здесь не так уж много, просто разные слова для одного и того же.
Фактически, как отметил Брайан Нил в комментарии к этому вопросу , стандарт C ++ никогда не использует термин «метод» при обращении к функциям-членам. Некоторые люди могут принять это как признак того, что C ++ на самом деле не является объектно-ориентированным языком; однако я предпочитаю воспринимать это как признак того, что довольно умная группа людей не думала, что есть особенно веская причина использовать другой термин.
Метод — это особый тип функции с передаваемым неявным аргументом (экземпляр класса, для которого определен метод). Это важно, так как функция, строго говоря, не должна использовать или изменять что-либо, отсутствующее в списке аргументов.
@ ty1824 это не всегда так, что методы передают неявные аргументы. В Python self аргумент является явным. И во многих языках есть статические методы, которым не передается экземпляр.
@ Mheiber это некоторые действительные точки. Что касается себя, вы правы, это явно определено . Ключ в том, что вызов неявный, основанный на исходной ссылке на объект. Существуют языки, которые поддерживают переопределение this или self , но тогда эти конструкции обычно называют функциями, а не методами.
@mheiber Что касается статических методов — java реализовал их как обходной путь, чтобы функции могли быть реализованы без контекста. Я бы сказал, что «статический метод» является вводящим в заблуждение термином и должен быть заменен . в идеальном теоретическом мире 🙂
@ ty1824 C ++, Scala, Python, Ruby, JavaScript и Scala имеют статические методы, поэтому я не думаю, что это просто Java. Мне они тоже не нравятся: они равносильны использованию объектов (связок состояния), как если бы они были пространствами имен.
В общем: методы — это функции, принадлежащие классу, функции могут быть в любой другой области кода, поэтому вы можете утверждать, что все методы являются функциями, но не все функции являются методами:
Возьмите следующий пример с python:
class Door: def open(self): print 'hello stranger' def knock_door: a_door = Door() Door.open(a_door) knock_door()
В приведенном примере показан класс с именем «Дверь», в котором есть метод или действие с именем «open», он называется методом, потому что он был объявлен внутри класса. Ниже есть еще одна часть кода с «def», которая определяет функцию, это функция, потому что она не объявлена внутри класса, эта функция вызывает метод, который мы определили внутри нашего класса, как вы можете видеть, и, наконец, функция работает называется само по себе.
Как вы можете видеть, вы можете вызывать функцию где угодно, но если вы хотите вызвать метод, либо вы должны передать новый объект того же типа, что и класс, метод объявлен (Class.method (object)), либо вы должны вызвать метод внутри объекта (object.Method ()), по крайней мере, в Python.
Думайте о методах как о вещах, которые может выполнять только одна сущность, поэтому, если у вас есть класс Dog, имеет смысл иметь функцию лая только внутри этого класса, и это будет метод, если у вас есть также класс Person, он может иметь смысл написать функцию «feed», поскольку она не принадлежит ни одному классу, так как можно кормить как людей, так и собак, и вы можете вызывать эту функцию, поскольку она не принадлежит ни к какому классу в частности.
Этот ответ — в основном его первое предложение — безусловно, самый краткий и в целом лучший ответ на вопрос.
Простой способ запомнить:
- F unction → F ree (Свободный означает, что не принадлежит объекту или классу)
- M ethod → M ember (член объекта или класса)
поскольку обычно они взаимозаменяемы, зачем вам мнемоника?
Очень общее определение основного различия между функцией и методом :
Функции определяются вне классов, а методы — внутри и внутри классов.
Если вы чувствуете, что читаете здесь, это «Мое введение в ОО методы»
Идея, лежащая в основе объектно-ориентированной парадигмы, состоит в том, чтобы «угрожать» программному обеспечению, состоящему из… хорошо «объектов». Объекты в реальном мире имеют свойства, например, если у вас есть Сотрудник, у сотрудника есть имя, идентификатор сотрудника, должность, он принадлежит отделу и т. Д. И т. Д.
Объект также знает, как обращаться со своими атрибутами и выполнять с ними некоторые операции. Допустим, если мы хотим знать, что сотрудник делает прямо сейчас, мы спросим его.
employe whatAreYouDoing.
То, что whatAreYouDoing — это «сообщение», отправленное объекту. Объект знает, как ответить на эти вопросы, говорят, что у него есть «метод» для решения вопроса.
Таким образом, способ, которым объекты должны демонстрировать свое поведение, называется методами. Методы, таким образом, являются объектом артефакта, который должен что-то «делать».
Другие возможные методы
employee whatIsYourName employee whatIsYourDepartmentsName
Функции с другой стороны — это способы, которыми язык программирования должен вычислять некоторые данные, например, у вас может быть функция addValues (8, 8), которая возвращает 16
// pseudo-code function addValues( int x, int y ) return x + y // call it result = addValues( 8,8 ) print result // output is 16.
Поскольку первые популярные языки программирования (такие как fortran, c, pascal) не охватывали парадигму ОО, они только называют эти артефакты «функциями».
например, предыдущая функция в C будет:
int addValues( int x, int y )
Не естественно говорить, что у объекта есть «функция» для выполнения какого-либо действия, потому что функции в большей степени связаны с математическими вещами, в то время как у сотрудника мало математики, но у вас могут быть методы, которые выполняют те же функции, что и функции, например, в Java это будет эквивалентная функция addValues.
public static int addValues( int x, int y )
Выглядит знакомо? Это потому, что Java имеет свои корни на C ++ и C ++ на C.
В конце концов это просто концепция, в реализации они могут выглядеть одинаково, но в документации ОО это называется методом.
Вот пример ранее работающего объекта в Java.
public class Employee < Department department; String name; public String whatsYourName()< return this.name; >public String whatsYourDeparmentsName() < return this.department.name(); >public String whatAreYouDoing() < return "nothing"; >// Ignore the following, only set here for completness public Employee( String name ) < this.name = name; >> // Usage sample. Employee employee = new Employee( "John" ); // Creates an employee called John // If I want to display what is this employee doing I could use its methods. // to know it. String name = employee.whatIsYourName(): String doingWhat = employee.whatAreYouDoint(); // Print the info to the console. System.out.printf("Employee %s is doing: %s", name, doingWhat ); Output: Employee John is doing nothing.
Разница тогда в том, что «домен», где он применяется.
У AppleScript есть идея «естественного языка», которая в какой-то момент была у ОО. Например, Smalltalk. Я надеюсь, что после прочтения вам, возможно, будет легче понять методы объектов.
ПРИМЕЧАНИЕ: код не должен быть скомпилирован, просто для примера. Не стесняйтесь изменить пост и добавить пример Python.
Браво! Блестящее изложение того, как методы являются командами для объектов. Это является ключом к пониманию ОО, а отсутствие риторики, которую вы демонстрируете в этом ответе, является причиной того, что ОО так злоупотребляют в отрасли сегодня. Отличный пост.
В мире ОО эти два понятия обычно означают одно и то же.
С точки зрения чистой математики и CS, функция всегда будет возвращать один и тот же результат при вызове с одинаковыми аргументами (f (x, y) = (x + y)). С другой стороны, метод, как правило, связан с экземпляром класса. Тем не менее, большинство современных ОО-языков больше не используют термин «функция» по большей части. Многие статические методы могут быть очень похожи на функции, так как они обычно не имеют состояния (не всегда true).
Скажем, функция — это блок кода (обычно со своей областью действия, а иногда со своим собственным замыканием), который может принимать некоторые аргументы и также может возвращать результат.
Метод — это функция, которой владеет объект (в некоторых объектно-ориентированных системах правильнее будет сказать, что он принадлежит классу). «Владение» объектом / классом означает, что вы обращаетесь к методу через объект / класс; например, в Java, если вы хотите вызвать метод «open ()», принадлежащий объекту «door», вам нужно написать «door.open ()».
Обычно методы также получают некоторые дополнительные атрибуты, описывающие их поведение в объекте / классе, например: видимость (связанная с объектно-ориентированной концепцией инкапсуляции), которая определяет, из каких объектов (или классов) метод может быть вызван.
Во многих объектно-ориентированных языках все «функции» принадлежат некоторому объекту (или классу), поэтому в этих языках нет функций, которые не являются методами.
Я считал, что методы могут принадлежать объекту или классу, поскольку Javascript (который вы упомянули в своем вопросе) является одним из языков, который отражает общую тенденцию объектно-ориентированных языков, поскольку методы принадлежат объектам, а не классам (хотя структуры похожи на классы существуют).
Методы являются функциями классов. В обычном жаргоне люди обмениваются методами и функционируют повсюду. По сути, вы можете думать о них как об одном и том же (не уверен, что глобальные функции называются методами).
Функция — это математическое понятие. Например:
f(x,y) = sin(x) + cos(y)
говорит, что функция f () вернет грех первого параметра, добавленного к косинусу второго параметра. Это просто математика. Случается, что sin () и cos () также являются функциями. Функция имеет другое свойство: все вызовы функции с одинаковыми параметрами должны возвращать один и тот же результат.
Метод, с другой стороны, является функцией, которая связана с объектом на объектно-ориентированном языке. У него есть один неявный параметр: объект, на который воздействуют (и это состояние).
Итак, если у вас есть объект Z с методом g (x), вы можете увидеть следующее:
Z.g(x) = sin(x) + cos(Z.y)
В этом случае передается параметр x, такой же, как в предыдущем примере функции. Однако параметр cos () — это значение, которое живет внутри объекта Z. Z, а данные, которые живут внутри него (Zy), являются неявными параметрами для метода g ().
Функция или метод — это именованный вызываемый фрагмент кода, который выполняет некоторые операции и при необходимости возвращает значение.
В языке Си используется термин функция. Java & C # люди сказали бы, что это метод (и функция в этом случае определяется внутри класса / объекта).
Программист C ++ может назвать это функцией или иногда методом (в зависимости от того, пишут ли они код на языке C ++ процедурного стиля или делают объектно-ориентированный способ на C ++, программист, работающий только на C / C ++, скорее всего назовет его функцией, потому что термин «метод» реже используется в литературе C / C ++).
Вы используете функцию, просто вызывая ее имя, как,
result = mySum(num1, num2);
Вы бы вызвали метод, ссылаясь сначала на его объект, как,
result = MyCalc.mySum(num1,num2);
Исторически сложилось так, что между «методом» было нечто, что не возвращает значения, и «функцией», которая делает это. В каждом языке есть свой собственный словарь терминов со специальным значением.
В «С» слово «функция» означает подпрограмму программы .
В Java термин «функция» не имеет особого значения. Принимая во внимание, что «метод» означает одну из подпрограмм, которая формирует реализацию класса.
В C # это будет переводиться как:
public void DoSomething() <> // method public int DoSomethingAndReturnMeANumber()<> // function
Но на самом деле, я повторяю, что на самом деле нет никакой разницы в двух концепциях. Если вы будете использовать термин «функция» в неформальных дискуссиях о Java, люди подумают, что вы имели в виду «метод», и продолжите. Не используйте его в надлежащих документах или презентациях о Java, иначе вы будете выглядеть глупо.
На самом деле, в вашем примере оба method . или я бы назвал это procedure и function .
Функция — это набор логики, которую можно использовать для манипулирования данными.
В то время как метод — это функция, которая используется для манипулирования данными объекта, которому он принадлежит. Технически, если у вас есть функция, которая не полностью связана с вашим классом, но была объявлена в классе, это не метод; Это называется плохой дизайн.
Методы класса действуют на экземпляр класса, называемый объектом.
class Example < public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable". public void UpdateData() // .. and manipulates it (This is a method by the way) < data = data + 1; >public void PrintData() // This is also a method < Console.WriteLine(data); >> class Program < public static void Main() < Example exampleObject1 = new Example(); Example exampleObject2 = new Example(); exampleObject1.UpdateData(); exampleObject1.UpdateData(); exampleObject2.UpdateData(); exampleObject1.PrintData(); // Prints "2" exampleObject2.PrintData(); // Prints "1" >>
В ОО-языках, таких как Object Pascal или C ++, «метод» — это функция, связанная с объектом. Так, например, объект «Собака» может иметь функцию «кора», и это будет считаться «Методом». Напротив, функция «StrLen» стоит отдельно (она предоставляет длину строки, предоставленной в качестве аргумента). Таким образом, это просто «функция». Javascript также технически объектно-ориентирован, но сталкивается со многими ограничениями по сравнению с полноценным языком, таким как C ++, C # или Pascal. Тем не менее, это различие должно сохраняться.
Пара дополнительных фактов: C # полностью объектно-ориентирован, поэтому вы не можете создавать автономные «функции». В C # каждая функция связана с объектом и, таким образом, технически является «методом». Главное, что в C # мало кто называет их «методами» — они просто используют термин «функции», потому что не нужно проводить никаких различий.
Наконец — точно так же, как любые гуру Паскаля не прыгнут на меня здесь — Паскаль также различает «функции» (которые возвращают значение) и «процедуры», которые этого не делают. C # не делает это различие явно, хотя вы, конечно, можете выбрать, возвращать значение или нет.
Поскольку вы упомянули Python, следующее может быть полезной иллюстрацией связи между методами и объектами в большинстве современных объектно-ориентированных языков. В двух словах, то, что они называют «методом», — это просто функция, которой передается дополнительный аргумент (как указали другие ответы), но Python делает это более явным, чем большинство языков.
# perfectly normal function def hello(greetee): print "Hello", greetee # generalise a bit (still a function though) def greet(greeting, greetee): print greeting, greetee # hide the greeting behind a layer of abstraction (still a function!) def greet_with_greeter(greeter, greetee): print greeter.greeting, greetee # very simple class we can pass to greet_with_greeter class Greeter(object): def __init__(self, greeting): self.greeting = greeting # while we're at it, here's a method that uses self.greeting. def greet(self, greetee): print self.greeting, greetee # save an object of class Greeter for later hello_greeter = Greeter("Hello") # now all of the following print the same message hello("World") greet("Hello", "World") greet_with_greeter(hello_greeter, "World") hello_greeter.greet("World")
Теперь сравните функцию greet_with_greeter и метод greet : единственное отличие — это имя первого параметра (в функции, которую я назвал «приветствующий», в методе, которую я назвал «self»). Таким образом, я могу использовать greet метод точно так же, как я использую greet_with_greeter функцию (используя синтаксис «точка», так как я определил его внутри класса):
Greeter.greet(hello_greeter, "World")
Итак, я эффективно превратил метод в функцию. Могу ли я превратить функцию в метод? Итак, поскольку Python позволяет вам связываться с классами после их определения, давайте попробуем:
Greeter.greet2 = greet_with_greeter hello_greeter.greet2("World")
Да, функция greet_with_greeter теперь также называется методом greet2 . Это показывает единственное реальное различие между методом и функцией: когда вы вызываете метод «на» объекте путем вызова object.method(args) , язык волшебным образом превращает его в method(object, args) .
(ОО-пуристы могут утверждать, что метод является чем-то отличным от функции, и если вы попадаете в продвинутый Python или Ruby — или Smalltalk! — вы начнете понимать их точку зрения. Также некоторые языки предоставляют методам специальный доступ к битам объекта. основным концептуальным отличием остается скрытый дополнительный параметр.)
Методы, функции, процедуры
Как минимум нужно синонимизировать единственное и множественное число. Что касается самих определений: видел различные, в том числе по критерию принимаемых параметров и возвращаемого значения. А ещё критерий «в Java — методы, а в JS – функции».
Может ли кто-нибудь компетентный сделать описания для этих меток, чтобы их можно было различать?
Отслеживать
122k 7 7 золотых знаков 42 42 серебряных знака 141 141 бронзовый знак
задан 17 июл 2015 в 0:36
Nick Volynkin Мод Nick Volynkin
33.9k 8 8 золотых знаков 78 78 серебряных знаков 216 216 бронзовых знаков
Еще замыкание и замыкания. Вообще, я всеми руками за унификацию этого термина, но поскольку каждый язык пропагандирует свое именование, то, как говорится, не в этой жизни. У англичан есть понятие callable unit, но я не думаю, что все теги нужно приводить к нему, потому что это может дизориентировать пользователя. Также есть понятие «хранимая процедура», а «функция» — это вообще математический термин.
17 июл 2015 в 3:09
На SO, кстати, тоже бардак с ними, но там хотя бы есть нормальное описание для метки «methods». Меня только смущает Block в FOTRAN — всегда думал, что там Subroutine , но я не работал с ним.
17 июл 2015 в 3:11
Про единственное/множественное число — это отдельный глобальный вопрос, по которому пока нет общего мнения: meta.ru.stackoverflow.com/questions/327
17 июл 2015 в 19:42
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Если правильно помню, различие есть между этими понятиями:
- метод: функция или процедура, принадлежащая классу.
- функция: возвращает результат
- процедура: не возвращает результат
Но в разных языках бывает по-другому. В Pascal, например, есть ситаксическое различие между функциями и процедурами, и методов нет. В JavaScript, все называются функции, хотя функции в prototype тоже называются методы. В SQL, «хранимые процедуры» иногда могут возвращать результаты. В матемаике, функция имеет формальное определение, отдельно от значения в мире программирования.
Я за синонимизацию (?) этих меток, потому что нет универсальных определений этих понятий, и они все таки довольно близкие. Я не вижу, в чем здесь может быть выгода их различать.
