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

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

44 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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


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

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

Возьмите следующий пример с 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 ) 
{
   return x + y;
}

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

public static int addValues( int x, int y ) {
    return x + 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()".

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

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

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

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

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

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

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

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

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

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

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

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's ().

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

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

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

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

result = mySum(num1, num2);


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

result = MyCalc.mySum(num1,num2);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TL;DR

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

Пример функции:


function sum(){
  console.log("sum")l
}

Пример метода:

const obj = {
a:1,
b:2,
sum(){
  }
}

Вот почему мы говорим, что ключевое слово this внутри функции не очень полезно, если мы не используем его с call, apply или bind ... потому что call, apply, bind вызовет эту функцию как метод внутри объекта ==> в основном это преобразует функцию в метод

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

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

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

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

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

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

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

Если вам интересно, читайте подробности ниже.

Я постараюсь быть кратким и буду использовать C++ в качестве примера, хотя то, что я говорю, применимо практически ко всем языкам.

  • Для вашего процессора и функции, и методы - это просто фрагменты кода. Период.
  • Таким образом, когда вызываются функции / методы, они могут принимать параметры

Хорошо, я сказал, что на самом деле нет никакой разницы. Давайте копнем глубже:

  • Есть 2 вида методов: статические и нестатические.
  • Статические методы похожи на обычные функции, но объявлены внутри класса, который действует просто как пространство имен.
  • Нестатические ("экземпляры") методы принимают скрытый указатель на "this". Это единственное отличие от обычной автономной функции.

Помимо динамической диспетчеризации, это означает, что это так просто:

class User {
    public string name; // I made it public intentionally

    public void printName() {
        cout << this.name << endl;
    }
};

эквивалентно

public getName(User & user) {
    cout << user.name << endl;
}

Итак, по сути, user->printName() просто синтаксический сахар для getName(user).

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

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

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

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

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

Общий ответ:

method имеет контекст объекта (это или ссылка на экземпляр класса),

function не имеет контекста (нулевого, глобального или статического).

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

  1. В JavaScript (ES 6) вы можете настроить контекст функции (this) по своему усмотрению, который обычно должен быть связан с контекстом экземпляра (this) объекта.

  2. В мире Java вы всегда слышите, что «только классы / объекты ООП, без функций» , но если вы внимательно посмотрите на static methodsв Java они действительно находятся в глобальном / нулевом контексте (или контексте классов, без создания экземпляров), поэтому просто функционируют без объекта. Учителя Java могли бы сказать вам, что functions were rudiment of C in C++ and dropped in Java, но вам это сказали для упрощения истории и избежания лишних вопросов новичков. Если вы видите в Java после версии 7, вы можете найти много элементов чисто функционального программирования (даже не из C, Lisp а из старого1988 года ) для упрощения параллельных вычислений, и это не стиль классов ООП .

  3. В мире C++ и D все сильнее, и вы разделили функции и объекты с помощью методов и полей . Но на практике вы снова видите функции without this и методы whith this (с контекстом объекта).

  4. В FreePascal / Lazarus и BorlandPascal / Delphi условия разделения функций и объектов (переменных и полей ) обычно аналогичны C++.

  5. Objective-C происходит из мира C, поэтому вы должны разделять функции C и объекты Objective-C с помощью дополнительных методов.

  6. C# очень похож на Java, но имеет много преимуществ C++.

Другие вопросы по тегам