В чем разница между методом и функцией? - PullRequest
1597 голосов
/ 01 октября 2008

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

Ответы [ 31 ]

12 голосов
/ 12 января 2016

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

В "C" слово "функция" означает подпрограмму .

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

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

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

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

12 голосов
/ 01 октября 2008

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

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

12 голосов
/ 06 февраля 2014

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

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

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

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

result = mySum(num1, num2);


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

result = MyCalc.mySum(num1,num2);
8 голосов
/ 03 декабря 2008

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

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

8 голосов
/ 01 октября 2008

Поскольку вы упомянули 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 голосов
/ 01 октября 2008

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

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

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

8 голосов
/ 01 октября 2008

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

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"
   }
}
7 голосов
/ 13 апреля 2012

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

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

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

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

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

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

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

4 голосов
/ 01 октября 2008

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

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

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

4 голосов
/ 01 октября 2008

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

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

...