it-roy-ru.com

В чем разница между методом и функцией?

Может ли кто-нибудь предоставить простое объяснение методов vs. функций в контексте OOP?

1546
willc2

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

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

  1. Метод неявно передается объект, на котором он был вызван.
  2. Метод может работать с данными, содержащимися в классе (помня, что объект является экземпляром класса - класс является определением, объект является экземпляром этих данных).

(это упрощенное объяснение, игнорирующее вопросы объем и т. д.)

1619
Andrew Edgecombe

Метод на объекте.
Функция не зависит от объекта. 

Для Java есть только методы.
Для C есть только функции.

Для C++ это будет зависеть от того, находитесь ли вы в классе.

899
Aaron

'method' - это объектно-ориентированное слово для 'function'. Это в значительной степени все, что есть (т.е. никакой реальной разницы).

К сожалению, я думаю, что многие ответы здесь увековечивают или продвигают идею, что есть какое-то сложное, значимое различие.

На самом деле - здесь не так уж много, просто разные слова для одного и того же.

[позднее добавление]


Фактически, как Брайан Нил указал в комментарии к этот вопрос , стандарт C++ никогда не использует термин «метод» при обращении к функциям-членам. Некоторые люди могут воспринимать это как признак того, что C++ на самом деле не является объектно-ориентированным языком; однако я предпочитаю воспринимать это как указание на то, что довольно умная группа людей не думала, что есть особенно веская причина использовать другой термин.

190
Michael Burr

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

Возьмите следующий пример с 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», поскольку она не принадлежит ни одному классу, так как можно кормить как людей, так и собак, и вы можете вызывать эту функцию, поскольку она не принадлежит ни к какому классу в частности.

88
Gustavo Rubio

Очень общее определение основного различия между функцией и методом :

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

39
Elenasys

Простой способ запомнить:

  • Function →Free (Свободный означает, что не принадлежит объекту или классу)
  • Method → ​​Member (член объекта или класса)
37
Duc Filan

Если вы чувствуете, что читаете здесь, это «Мое введение в OO методы»

Идея, лежащая в основе объектно-ориентированной парадигмы, состоит в том, чтобы «угрожать» программному обеспечению, состоящему из… хорошо «объектов». Объекты в реальном мире имеют свойства, например, если у вас есть Сотрудник, у сотрудника есть имя, идентификатор сотрудника, должность, он принадлежит отделу и т.д. И т.д. 

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

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) не охватывали парадигму OO, они называют эти артефакты только «функциями».

например, предыдущая функция в C будет:

int addValues( int x, int y ) 
{
   return x + y;
}

Не естественно говорить, что объект имеет «функцию» для выполнения какого-либо действия, потому что функции в большей степени связаны с математическими вещами, в то время как у сотрудника мало математики, но у вас могут быть методы, которые выполняют те же функции, что и функции, например, в Java это будет эквивалентная функция addValues.

public static int addValues( int x, int y ) {
    return x + y;
}

Выглядит знакомо? Это потому, что Java имеет свои корни на C++ и C++ на C.

В конце концов это просто концепция, в реализации они могут выглядеть одинаково, но в документации OO это называется методом.

Вот пример ранее работающего объекта в 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 есть идея «естественного языка», что в какой-то момент было OO. Например, Smalltalk. Я надеюсь, что после прочтения вам, возможно, будет легче понять методы объектов.

ПРИМЕЧАНИЕ: код не должен быть скомпилирован, просто для примера. Не стесняйтесь изменять пост и добавлять пример Python.

27
OscarRyz

В мире OO эти два понятия обычно означают одно и то же. 

С точки зрения чистой математики и CS, функция всегда будет возвращать один и тот же результат при вызове с одинаковыми аргументами (f (x, y) = (x + y)). С другой стороны, метод, как правило, связан с экземпляром класса. Тем не менее, большинство современных OO языков больше не используют термин «функция» по большей части. Многие статические методы могут быть очень похожи на функции, так как они обычно не имеют состояния (не всегда true).

17
TheSoftwareJedi

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

Метод - это функция, которой владеет объект (в некоторых объектно-ориентированных системах правильнее будет сказать, что он принадлежит классу). «Владение» объектом/классом означает, что вы обращаетесь к методу через объект/класс; например, в Java, если вы хотите вызвать метод "open ()", принадлежащий объекту "door", вам нужно написать "door.open ()". 

Обычно методы также получают некоторые дополнительные атрибуты, описывающие их поведение в объекте/классе, например: видимость (связанная с объектно-ориентированной концепцией инкапсуляции), которая определяет, из каких объектов (или классов) метод может быть вызван.

Во многих объектно-ориентированных языках все «функции» принадлежат некоторому объекту (или классу), поэтому в этих языках нет функций, которые не являются методами.

15
Mike Tunnicliffe

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

ВCязыке используется термин функция. Java & C # люди сказали бы, что это метод (и функция в этом случае определяется внутри класса/объекта).

A C++ программист может назвать это функцией или иногда методом (в зависимости от того, пишут ли они код на языке C++ процедурного стиля или делают объектно-ориентированный способ на C++, программист, работающий только на C/C++, скорее всего назовет его функцией, потому что термин «метод» реже используется в литературе по Си/Си ++).

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

result = mySum(num1, num2);


Вы бы вызвали метод, ссылаясь сначала на его объект, как,

result = MyCalc.mySum(num1,num2);
12
Abdullah Leghari

Функция - это математическая концепция. Например:

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, а данные, которые живут внутри него (Z.y), являются неявными параметрами для метода Z g().

12
Bradley Mazurek

Исторически сложилось так, что между методом «метод», который не возвращает значения, и «функцией» есть тонкое отличие. Каждый язык имеет свой собственный лексикон терминов со специальным значением. 

В "C" , Word "функция" означает подпрограмму программы .

В Java термин "функция" не имеет особого значения. Принимая во внимание, что «метод» означает одну из подпрограмм, которые формируют реализацию класса.

В C # это будет переводиться как:

public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function

Но на самом деле, я повторяю, что на самом деле нет никакой разницы в двух концепциях .. Если вы будете использовать термин «функция» в неформальных дискуссиях о Java, люди подумают, что вы имели в виду «метод», и продолжайте. Не используйте его в надлежащих документах или презентациях о Java, иначе вы будете выглядеть глупо.

12
Jaimin Patel

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

http://en.wikipedia.org/wiki/Method_(computer_science)

11
Statement

Методы класса действуют на экземпляр класса, называемый объектом. 

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"
   }
}
8
Statement

В языках OO, таких как Object Pascal или C++, «метод» - это функция, связанная с объектом. Так, например, объект «Собака» может иметь функцию «кора», и это будет считаться «Методом». Напротив, функция «StrLen» стоит отдельно (она предоставляет длину строки, предоставленной в качестве аргумента). Таким образом, это просто "функция". Javascript также технически объектно-ориентирован, но сталкивается со многими ограничениями по сравнению с полноценным языком, таким как C++, C # или Pascal. Тем не менее, это различие должно сохраняться.

Пара дополнительных фактов: C # полностью объектно-ориентирован, поэтому вы не можете создавать автономные «функции». В C # каждая функция связана с объектом и, таким образом, технически является «методом». Главное, что в C # мало кто называет их «методами» - они просто используют термин «функции», потому что не нужно проводить никаких различий.

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

8
Mark Brittingham

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

В то время как метод - это функция, которая используется для манипулирования данными объекта, к которому он принадлежит ... Технически, если у вас есть функция, которая не полностью связана с вашим классом, но была объявлена ​​в классе, она не является методом; Это называется плохой дизайн.

8
gian ebao

Поскольку вы упомянули 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! - вы начнете понимать их точку зрения. Также некоторые языки предоставляют методам специальный доступ к битам объекта. Но основным концептуальным отличием остается скрытый дополнительный параметр.)

8
Sam Stokes

для меня: функция метода и функция одинаковы, если я согласен с тем, что:

  • функция может возвращать значение
  • может ожидать параметры

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

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

new Employer().calculateSum( 8, 8 );

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

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

7
Dirk Schumacher

В приближении первого порядка метод (в ОО стиле C++) - это другое слово для функции-члена, то есть функция, являющаяся частью класса.

В таких языках, как C/C++, вы можете иметь функции, которые не являются членами класса; Вы не вызываете функцию, не связанную с классом, методом.

4
Captain Segfault

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

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

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

4
marcj

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

3
SamyCode

ИМХО, люди просто хотели изобрести новое Word для облегчения общения между программистами, когда они хотели ссылаться на функции внутри объектов. 

Если вы говорите о методах, вы имеете в виду функции внутри класса Если вы говорите о функциях, вы имеете в виду просто функции вне класса.

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

Функция - это код, который должен играть роль ( функция ) в выполнении чего-либо . Метод является методом для решения проблемы.

Это делает то же самое. Это то же самое. Если вы хотите быть очень точным и следовать соглашению, вы можете вызывать методы как функции внутри объектов.

3
Morfidon

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

Метод - это концепция объектно-ориентированного программирования где метод является членом класса, который в основном выполняет обработку для членов класса.

3
Akshay Khale

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

Метод - это функция, у которой есть определенный получатель, в терминах OOP, метод - это функция на экземпляре объекта.

2
f-society

Я не эксперт, но вот что я знаю:

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

  2. Метод - это термин OO, обычно он имеет указатель this в параметре функции. Вы не можете вызвать этот кусок кода, как C, вам нужно использовать объект для его вызова.

  3. Методы вызова также различны. Здесь вызовите значение, чтобы найти адрес этого куска кода. C/C++, время компоновки будет использовать символ функции для определения местоположения.

  4. Objecive-C отличается. Вызывать значение функции C, чтобы использовать структуру данных для поиска адреса. Это означает, что все известно во время выполнения.

2
Marvin

Вот некоторые объяснения метода и функции с использованием примеров JavaScript:

test(20, 50); - это функция определения и использования для выполнения некоторых шагов или возврата чего-либо, что может быть где-то сохранено/использовано.

Вы можете повторно использовать код: определите код один раз и используйте его много раз.

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

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test = something.test(); здесь test () может быть методом какого-либо объекта или пользовательским образом определяемым прототипом для встроенных объектов, вот более подробное объяснение:

Методы JavaScript - это действия, которые можно выполнять над объектами.

Метод JavaScript - это свойство, содержащее определение функции.

Встроенное свойство/метод для строк в JavaScript:

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

Пользовательский пример:

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

Вы можете определить свойства для String, Array и т.д., Например,

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        console.log(char + " does not appear in " + this);
    } else {
        console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

var something = "ThisIsSomeString"

// now use distance like this, run and check console log

something.distance("m");

Некоторые ссылки: Javascript Object Method , Функции , Дополнительная информация о прототипе

1
Lahar Shah

Разница между методами и функциями

Из чтения этот документ на Microsoft 

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

Таким образом, методы являются подмножеством функций. Каждый метод является функцией, но не каждая функция является методом, например, constructor нельзя сказать как method, но это функция.

1
Siraj

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

Метод - метод является независимым фрагментом кода, который вызывается со ссылкой на некоторый объект и определяется внутри класса.

0
Aditya Malviya

Класс - это набор некоторых данных и, при желании, функции с помощью конструктора.

При создании экземпляра (копирования, репликации) этого конкретного класса конструктор инициализирует класс и возвращает объект. 

Теперь класс становится объектом (без конструктора) & Функции известны как метод в контексте объекта.

Так в основном 

Класс <== new ==> Объект

Функция <== new ==> Метод

В Java обычно говорят, что имя конструктора совпадает с именем класса, но в действительности этот конструктор подобен блоку экземпляра и статическому блоку, но с определением пользователем возвращаемого типа (т. Е. Типа класса)

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

0
Subrat Kumar Palhar

В C++ иногда метод используется для отражения понятия функции-члена класса. Однако недавно я нашел утверждение в книге «Язык программирования C++, 4-е издание», на стр. 586 «Производные классы».

Виртуальная функция иногда называется методом.

Это немного сбивает с толку, но он сказал иногда , так что примерно это имеет смысл, создатель C++ склонен видеть методы, так как функции могут вызываться на объектах и ​​могут вести себя полиморфно.

0
Lance LI