Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

На самом деле - в этом нет ничего особенного, просто разные слова обозначают одно и то же.

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


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

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

Возьмем следующий пример python:

class Door:
  def open(self):
    print 'hello stranger'

def knock_door:
  a_door = Door()
  Door.open(a_door)

knock_door()

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

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

Думайте о методах как о вещах, которые может выполнять только одна сущность, поэтому, если у вас есть класс Dog, имело бы смысл иметь функцию bark только внутри этого класса, и это был бы метод, если у вас также есть класс Person, могло бы иметь смысл написать функцию "feed" для которой не принадлежит ни к какому классу, поскольку кормить можно как людей, так и собак, и вы могли бы вызвать эту функцию, поскольку она не принадлежит ни к какому конкретному классу.

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

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

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

  • Fпомазание → Free (Свободный означает не принадлежащий объекту или классу)
  • Mэтод → Member (Член объекта или класса)

Если вам захочется почитать, вот "Мое введение в методы 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 они называются method .

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

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

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

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

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

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

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

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

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

http://en.wikipedia.org/wiki/Method_ (компьютерная наука)

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

f(x,y) = sin(x) + cos(y)

говорит, что функция f() вернет значение sin первого параметра, добавленное к косинусу второго параметра.Это всего лишь математика.Так получилось, что sin() и cos () также являются функциями.Функция обладает еще одним свойством:все вызовы функции с одинаковыми параметрами должны возвращать один и тот же результат.

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

Итак, если у вас есть объект Z с методом g(x), вы можете увидеть следующее:

Z.g(x) = sin(x) + cos(Z.y)

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

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

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

A 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, иначе вы будете выглядеть глупо.

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

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 # называет их "методами" - они просто используют термин "функции", потому что здесь не нужно проводить никакого реального различия.

Наконец - просто чтобы никакие гуру Pascal не набросились на меня здесь - Pascal также проводит различие между "функциями" (которые возвращают значение) и "процедурами", которые этого не делают.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:единственное отличие - это имя первого параметра (в функции я назвал его "greeter", в методе я назвал его "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).

(Пуристы OO могут возразить, что метод - это нечто отличное от функции, и если вы освоите продвинутый Python, Ruby или Smalltalk!- ты начнешь понимать их точку зрения.Также некоторые языки предоставляют методам специальный доступ к битам объекта.Но главным концептуальным отличием по-прежнему является скрытый дополнительный параметр.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Из чтения этот док в Microsoft

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

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

Вот некоторое объяснение метода vs.функция с использованием примеров 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.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, Функции, Дополнительная информация о прототипе

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

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

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

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

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

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

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

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

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

Класс <==новый==>Объект

Функция <==новый==>Метод

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top