Какая разница между методом и функцией?
Может ли кто-нибудь предоставить простое объяснение методов и функций в контексте ООП?
Ответы
Ответ 1
Функция - это фрагмент кода, который вызывается по имени. Это может быть передано данных для работы (то есть параметров) и может при необходимости возвращать данные (возвращаемое значение). Все данные, переданные функции, явно передаются.
A метод - это фрагмент кода, вызываемый именем, связанным с объектом. В большинстве случаев он идентичен функции, за исключением двух ключевых отличий:
- Метод неявно передает объект, на который он был вызван.
- Метод способен работать с данными, содержащимися в классе (помня, что объект является экземпляром класса - класс является определением, объект является экземпляром этих данных).
(это упрощенное объяснение, игнорируя проблемы scope и т.д.)
Ответ 2
Метод находится на объекте.
Функция не зависит от объекта.
Для Java существуют только методы.
Для C существуют только функции.
Для С++ это будет зависеть от того, находитесь ли вы в классе.
Ответ 3
'method' - это объектно-ориентированное слово для 'function'. Это почти все, что есть для него (т.е. Никакой реальной разницы).
К сожалению, я думаю, что многие ответы здесь увековечивают или продвигают идею о том, что существует какая-то сложная, значимая разница.
Действительно - для него не так много, просто разные слова для одного и того же.
[последнее дополнение]
Фактически, поскольку Брайан Нил указал в комментарии к этому вопросу, стандарт С++ никогда использует термин "метод" при ссылке на функции-члены. Некоторые люди могут считать это признаком того, что С++ не является объектно-ориентированным языком; однако я предпочитаю считать это признаком того, что довольно умная группа людей не думала, что существует особая причина использовать другой термин.
Ответ 4
В общем: методы - это функции, принадлежащие классу, функции могут быть в любой другой области кода, поэтому вы можете указать, что все методы являются функциями, но не все функции являются методами:
Возьмем следующий пример python:
class Door:
def open(self):
print 'hello stranger'
def knock_door:
a_door = Door()
Door.open(a_door)
knock_door()
Приведенный пример показывает вам класс под названием "Дверь", который имеет метод или действие под названием "open", он называется методом, потому что он был объявлен внутри класса. Существует еще одна часть кода с "def" чуть ниже, которая определяет функцию, это функция, потому что она не объявлена внутри класса, эта функция вызывает метод, который мы определили внутри нашего класса, как вы можете видеть, и, наконец, функция само по себе.
Как вы можете видеть, вы можете вызывать функцию где угодно, но если вы хотите вызвать метод, вам нужно передать новый объект того же типа, что и класс, объявленный методом (класс .method(object)), или вы должны вызвать метод внутри объекта (object.Method()), по крайней мере, на python.
Подумайте о методах, которые могут выполнять только одна сущность, поэтому, если у вас есть класс Dog, имеет смысл иметь функцию коры только внутри этого класса, и это будет метод, если у вас также есть класс Person, который мог бы имеет смысл написать функцию "feed", которая не принадлежит ни к какому классу, поскольку могут быть переданы как люди, так и собаки, и вы можете назвать эту функцию, поскольку она не относится к какому-либо классу в частности.
Ответ 5
Простой способ запомнить:
- F unction → F ree (Свободные означает не принадлежность к объекту или классу)
- M ethod → M ember (член объекта или класса)
Ответ 6
Очень общее определение основного различия между Функция и Метод:
Функции определяются вне классов, а методы определены внутри и в части классов.
Ответ 7
Если вам хочется читать здесь, это "Мое введение в методы 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.
В конце это всего лишь концепция, в реализации они могут выглядеть одинаково, но в документации OO они называются методом.
Вот пример предыдущего объекта 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.
Ответ 8
В мире ОО эти два обычно используются для обозначения одного и того же.
С чистой точки зрения Math и CS функция всегда возвращает тот же результат при вызове с теми же аргументами (f (x, y) = (x + y)). Метод, с другой стороны, обычно связан с экземпляром класса. Опять же, большинство современных языков OO больше не используют термин "функция" по большей части. Многие статические методы могут быть похожими на функции, поскольку они обычно не имеют состояния (не всегда верно).
Ответ 9
Скажем, функция является блоком кода (обычно с его собственной областью, а иногда и с ее собственным закрытием), которая может принимать некоторые аргументы и также может возвращать результат.
Метод - это функция, принадлежащая объекту (в некоторых объектно-ориентированных системах правильнее сказать, что он принадлежит классу). Будучи "принадлежащим" объектом/классом, вы ссылаетесь на метод через объект/класс; например, на Java, если вы хотите вызвать метод "open()", принадлежащий "двери" объекта, вам нужно написать "door.open()".
Обычно методы также получают некоторые дополнительные атрибуты, описывающие их поведение в объекте/классе, например: видимость (связанная с объектно-ориентированной концепцией инкапсуляции), которая определяет, из каких объектов (или классов) метод может быть вызван.
Во многих объектно-ориентированных языках все "функции" относятся к некоторому объекту (или классу), поэтому на этих языках нет функций, которые не являются методами.
Ответ 10
Методы - это функции классов. В обычном жаргоне люди обмениваются методом и функционируют повсюду. В основном вы можете думать о них как о том же (не уверен, что глобальные функции называются методами).
http://en.wikipedia.org/wiki/Method_(computer_science)
Ответ 11
Функция - математическое понятие. Например:
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().
Ответ 12
Функция или метод - это именованный вызываемый фрагмент кода, который выполняет некоторые операции и необязательно возвращает значение.
В языке C используется функция term. Java и С# люди скажут это методом (и функция в этом случае определена внутри класса/объекта).
A Программист С++ может называть его функцией или иногда методом (в зависимости от того, записывают ли они процедурный код С++ или делают объектно-ориентированный путь С++, также скорее всего программист на C/С++ называть его функцией, потому что термин "метод" реже используется в литературе C/С++).
Вы используете функцию, просто называя это имя, как,
result = mySum(num1, num2);
Вы бы вызвали метод, сначала ссылаясь на его объект, например,
result = MyCalc.mySum(num1,num2);
Ответ 13
Исторически сложилось, что может быть тонкая разница, когда "метод" является тем, что не возвращает значение, и "функцией", которая делает. Каждый язык имеет свой собственный лексикон терминов со специальным значением.
В "C" слово "функция" означает программную процедуру.
В Java термин "функция не имеет особого значения. В то время как "метод" означает одну из подпрограмм, которые образуют реализацию класса.
В С#, который будет выглядеть следующим образом:
public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function
Но на самом деле, я повторяю, что в 2 понятиях нет никакой разницы.
Если вы используете термин "функция" в неофициальных дискуссиях о Java, люди предполагают, что вы подразумеваете "метод" и продолжаете. Не используйте его в соответствующих документах или презентациях о Java, иначе вы будете выглядеть глупо.
Ответ 14
Функция представляет собой набор логических элементов, которые могут использоваться для управления данными.
В то время как метод - это функция, которая используется для управления данными объекта, к которому он принадлежит.
Технически, если у вас есть функция, которая не полностью связана с вашим классом, но была объявлена в классе, это не метод; Он назвал плохой дизайн.
Ответ 15
Методы действия класса на экземпляр класса, называемого объектом.
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"
}
}
Ответ 16
В языках OO, таких как Object Pascal или С++, "метод" - это функция, связанная с объектом. Так, например, объект "Собака" может иметь функцию "коры", и это будет считаться "методом". Напротив, функция "StrLen" стоит одна (она предоставляет длину строки, предоставленной в качестве аргумента). Это, таким образом, просто "функция". Javascript технически объектно ориентирован, но имеет множество ограничений по сравнению с полномасштабным языком, таким как С++, С# или Pascal. Тем не менее, это различие все еще должно сохраняться.
Несколько дополнительных фактов: С# полностью объектно ориентирован, поэтому вы не можете создавать автономные "функции" . В С# каждая функция привязана к объекту и, таким образом, технически является "методом". Кикер состоит в том, что немногие люди в С# называют их "методами" - они просто используют термин "функции" , потому что не существует никакого реального различия.
Наконец - так, чтобы все гуру Паскаля не прыгали на меня здесь, - Паскаль также различает "функции" (которые возвращают значение) и "процедуры", которых нет. С# не делает это различие явно, хотя вы, конечно, можете выбрать значение или нет.
Ответ 17
Поскольку вы упомянули 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 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
. Это показывает единственную реальную разницу между методом и функцией: когда вы вызываете метод "on" объект, вызывая object.method(args)
, язык магически превращает его в method(object, args)
.
(Пуристы OO могут утверждать, что метод отличается от функции, и если вы попадаете в продвинутый Python или Ruby - или Smalltalk! - вы начнете видеть их точку. Также некоторые языки предоставляют методы специального доступа к битам но основная концептуальная разница по-прежнему остается скрытым дополнительным параметром.)
Ответ 18
для меня:
функция метода и функция совпадают, если я соглашусь с тем, что:
- функция может вернуть значение
- могут ожидать параметры
Как и любой фрагмент кода, у вас могут быть объекты, которые вы вставляете, и у вас может быть объект, который появляется в результате. Во время выполнения они могут изменить состояние объекта, но это не изменит их базовое функционирование для меня.
Может существовать определение, различающееся при вызове функций объектов или других кодов. Но разве это не что-то для словесных различий и почему люди меняют их? Примером примера вычисления я бы был осторожен. потому что я нанимаю сотрудников для выполнения своих расчетов:
new Employer().calculateSum( 8, 8 );
Таким образом, я могу полагаться на то, что работодатель несет ответственность за вычисления. Если он хочет больше денег, я освобожу его и позволю функции коллекционера утилизации ненужных сотрудников сделать все остальное и получить нового сотрудника.
Даже утверждая, что метод является функцией объектов, а функция не связана, вычисление не поможет мне. Сам дескриптор функции и, в идеале, документация по функциям подскажет мне, что ему нужно и что он может вернуть. Остальное, как и манипулирование каким-либо состоянием объекта, для меня не очень прозрачно. Я ожидаю, что как функции, так и методы будут доставлять и манипулировать тем, что они заявляют, не зная подробно, как они это делают.
Даже чистая вычислительная функция может изменить состояние консоли или добавить в файл журнала.
Ответ 19
Функция - это набор логики, который может использоваться для управления данными. В то время как метод - это функция, которая используется для управления данными объекта, к которому он принадлежит. Технически, если у вас есть функция, которая не полностью связана с вашим классом, но была объявлена в классе, это не метод; Он назвал плохой дизайн.
Ответ 20
Из моего понимания метод - это любая операция, которая может выполняться в классе. Это общий термин, используемый в программировании.
На многих языках методы представлены функциями и подпрограммами. Основное отличие, которое большинство языков использует для них, состоит в том, что функции могут возвращать значение обратно вызывающему, а подпрограмма может не работать. Однако многие современные языки имеют только функции, но они необязательно не возвращают никакого значения.
Например, скажем, вы хотите описать кошку, и вы хотели бы, чтобы она могла зевать. Вы должны создать класс Cat с помощью метода Yawn, который, скорее всего, будет функцией без возвращаемого значения.
Ответ 21
В первом приближении метод (в стиле O ++ С++) - это другое слово для функции-члена, то есть функция, являющаяся частью класса.
В таких языках, как C/С++, вы можете иметь функции, которые не являются членами класса; вы не вызываете функцию, не связанную с методом класса.
Ответ 22
Функция - это понятие, в основном принадлежащее Программируемое программирование, где функция является объектом, который может обрабатывать данные и возвращает значение
Метод - это концепция Object Oriented programming, где метод является членом класса, который в основном обрабатывает члены класса.
Ответ 23
Люди ИМХО просто хотели придумать новое слово для упрощения связи между программистами, когда они хотели ссылаться на функции внутри объектов.
Если вы говорите о методах, вы подразумеваете функции внутри класса.
Если вы говорите о функциях, вы имеете в виду просто функции вне класса.
Истина заключается в том, что оба слова используются для описания функций. Даже если вы ошибались, ничего плохого не происходит. Оба слова хорошо описывают то, что вы хотите достичь в своем коде.
Функция - это код, который должен играть роль (функцию) что-то делать.
Метод - это метод решения проблемы.
Он делает то же самое. Это одно и то же. Если вы хотите быть супер точным и соглашаетесь с соглашением, вы можете вызывать методы как функции внутри объектов.
Ответ 24
Пусть не усложняет, что должно быть очень простым ответом. Методы и функции - это одно и то же. Вы вызываете функцию функцией, когда она находится вне класса, и вы вызываете функцию методом, когда она написана внутри класса.
Ответ 25
Я не эксперт, но это то, что я знаю:
-
Функция - это термин языка C, это относится к фрагменту кода, и имя функции будет идентификатором для использования этой функции.
-
Метод - это термин OO, обычно он имеет этот указатель в параметре функции. Вы не можете вызвать этот кусок кода, например C, вам нужно использовать объект для его вызова.
-
Методы вызова также различны. Здесь вызывается смысл найти адрес этой части кода. C/С++, время связывания будет использовать символ функции для поиска.
-
Objecive-C отличается. Invoke означает функцию C, чтобы использовать структуру данных для поиска адреса. Это означает, что все известно во время выполнения.
Ответ 26
Функции и методы - это одно и то же
Некоторые программисты подумали, что лучше было бы вызвать функции внутри классов с другим именем. Они называли их методами.
Функции-члены внутри классов называются методами в некоторых языках программирования (например, Java).
Но если программа на С++ попросила вас провести различие между этими двумя терминами, и вы дадите ему следующие аргументы,
- Методы разные, поскольку они имеют модификаторы доступа.
- Методы разные, потому что они внутри классов.
- Методы неявно передают ссылку на объект, на который они были вызваны.
то вы, вероятно, сбиваете с толку его/ее. (большинство) программисты на C++ (обычно) не используют имя "метод", и в этом случае все вышеперечисленные аргументы ошибочны. Бьярне Страуструп даже не удосужился назвать "методы" функций членов в своей книге "Язык программирования на C++".
Если ребенок известен под именем "Джон" дома и "Петр" в школе, можно ли сказать, что Питер идет в школу, но Джон не делает?
Дифференциация между "функциями" и "методами" так же сложна, как дифференцирование "функций" и "функций".
Поверьте, что "функция" и "метод" представляют собой только два разных имени, вы будете в порядке.
Ответ 27
Я знаю, что многие другие уже ответили, но я нашел следующее - простой, но эффективный однострочный ответ. Хотя это не выглядит намного лучше, чем другие ответы здесь, но если вы внимательно прочитаете его, у него есть все, что вам нужно знать о методе vs function.
Метод - это функция, которая имеет определенный приемник, в терминах ООП, метод является функцией экземпляра объекта.
Ответ 28
Разница между методами и функциями
Из чтения этого документа на Microsoft
Члены, которые содержат исполняемый код, все вместе называются членами функции класса. В предыдущем разделе описаны методы, которые являются основным видом членов функции. В этом разделе описываются другие типы членов функции, поддерживаемые С#: конструкторы, свойства, индексы, события, операторы и финализаторы.
Итак, методы - это подмножество функций. Каждый метод является функцией, но не каждая функция является методом, например, constructor
не может считаться методом, но это функция.
Ответ 29
Функция - функция в независимом фрагменте кода, который включает в себя некоторую логику и должен вызываться независимо и определяться вне класса.
Метод - метод является независимым фрагментом кода, который вызывается со ссылкой на некоторый объект и определяется внутри класса.
Ответ 30
Ниже приведено объяснение метода против функции с использованием примеров 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 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");