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

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

Ответы [ 31 ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

40 голосов
/ 29 октября 2014

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

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

38 голосов
/ 08 октября 2017

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

  • F unction → F ree (Свободные средства не принадлежат объекту или классу)
  • M ethod → ​​ M ember (член объекта или класса)
27 голосов
/ 01 октября 2008

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

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

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

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 ) 
{
   return x + y;
}

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

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

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

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

Вот пример ранее работающего объекта Java в 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.

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

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

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

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

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

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

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

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

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

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

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

...