Чи може хтось надати просте пояснення методів проти функцій у контексті OOP?
if(class(object)) { ... } else {stop()}
буде концептуально еквівалентна методу?
Чи може хтось надати просте пояснення методів проти функцій у контексті OOP?
if(class(object)) { ... } else {stop()}
буде концептуально еквівалентна методу?
Відповіді:
Функція являє собою фрагмент коду , який називається по імені. Можна передавати дані для роботи (тобто параметри), а також необов'язково повертати дані (повернене значення). Усі дані, передані функції, передаються явно.
Метод являє собою фрагмент коду , який називається по імені, пов'язане з об'єктом. У більшості аспектів він ідентичний функції, за винятком двох ключових відмінностей:
(це спрощене пояснення, ігнорування питань сфери застосування тощо)
Метод на об’єкті.
Функція не залежить від об'єкта.
Для Java та C # існують лише методи.
Для C існують лише функції.
Для C ++ та Python це залежатиме від того, ви чи ні в класі.
'метод' - це об'єктно-орієнтоване слово для функції . Це майже все, що там є (т. Е. Немає реальної різниці).
На жаль, я думаю, що багато відповідей тут увічнюють чи просувають думку про те, що є якась складна, змістовна різниця.
Дійсно - у цьому все не так вже й багато, просто різні слова для одного і того ж.
[пізнє додавання]
Насправді, як зазначив Брайан Ніл у коментарі до цього питання , стандарт C ++ ніколи не використовує термін "метод" при переході до функцій членів. Деякі люди можуть сприймати це як ознаку того, що C ++ насправді не є об'єктно-орієнтованою мовою; проте я вважаю за краще сприймати досить розумну групу людей, що не має особливо вагомих причин використовувати інший термін.
self
аргумент явний. І багато мов мають статичні методи, які не передаються екземпляром.
this
або self
, але ці конструкції зазвичай називають функціями, а не методами.
Взагалі: методи - це функції, що належать до класу, функції можуть бути в будь-якій іншій області коду, щоб ви могли констатувати, що всі методи є функціями, але не всі функції - це методи:
Візьмемо наступний приклад пітона:
class Door:
def open(self):
print 'hello stranger'
def knock_door:
a_door = Door()
Door.open(a_door)
knock_door()
Наведений приклад показує вам клас під назвою "Двері", який має метод або дію під назвою "відкрити", його називають методом, оскільки він був оголошений всередині класу. Існує ще одна частина коду з "def" трохи нижче, яка визначає функцію, це функція, оскільки вона не оголошена всередині класу, ця функція викликає метод, який ми визначили всередині нашого класу, як ви можете бачити, і нарешті функція виконується покликаний сам по собі.
Як ви бачите, ви можете викликати функцію куди завгодно, але якщо ви хочете викликати метод, вам потрібно передати новий об'єкт того ж типу, що і клас, декларується метод (Class.method (об'єкт)) або вам потрібно викликати метод всередині об'єкта (object.Method ()), принаймні в python.
Розгляньте методи як речі, які може зробити лише одна сутність, тому, якщо у вас є клас собаки, було б сенсом функціонувати кора лише всередині цього класу, і це був би метод, якщо у вас є також клас Особи, це може мати сенс написати функцію "feed", яка не належить до жодного класу, оскільки можна годувати і людей, і собак, і ви можете назвати цю функцію, оскільки вона не належить до жодного класу, зокрема.
Простий спосіб запам'ятати:
Якщо ви хочете прочитати тут, - "Моє знайомство з методами ОО"
Ідея об'єктно-орієнтованої парадигми полягає в тому, щоб "загрожувати" програмному забезпеченню, складеному з "добре" об'єктів. Об'єкти в реальному світі мають властивості, наприклад, якщо у вас є працівник, у працівника є прізвище, ідентифікатор працівника, посада, він належить до департаменту тощо.
Об'єкт також знає, як поводитися з його атрибутами і виконувати над ними деякі операції. Скажімо, якщо ми хочемо знати, що працівник робить зараз, ми б запитали його.
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.
Зрештою, це лише концепція, в реалізації вони можуть виглядати однаково, але в документації на ОО це називають методом.
Ось приклад раніше об'єкта 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 має уявлення про "природну мову" матфору, яку в певний момент мав ОО. Наприклад, Smalltalk. Сподіваюся, вам може бути розумно легше зрозуміти методи в об'єктах після прочитання цього.
ПРИМІТКА. Код не слід компілювати, а лише слугувати прикладом. Не соромтеся змінювати публікацію та додавати приклад Python.
У світі OO обидва вживаються для того, щоб означати одне і те ж.
З точки зору чистої математики та CS, функція завжди повертає той самий результат, коли викликається з однаковими аргументами (f (x, y) = (x + y)). Метод з іншого боку, як правило, асоціюється з екземпляром класу. Знову ж таки, більшість сучасних мов OO більше не використовують термін "функція". Багато статичних методів можуть бути дуже схожими на функції, оскільки вони, як правило, не мають стану (не завжди правдивого).
Скажімо, функція - це блок коду (як правило, з власною областю, а іноді і з власним закриттям), який може отримувати деякі аргументи, а також може повертати результат.
Метод - це функція, яка належить об'єкту (у деяких об'єктно-орієнтованих системах правильніше сказати, що ним належить клас). Бути "належним" об'єктом / класом означає, що ви посилаєтесь на метод через об'єкт / клас; Наприклад, у Java, якщо ви хочете викликати метод "open ()", що належить об'єкту "door", вам потрібно написати "door.open ()".
Зазвичай методи також отримують деякі додаткові атрибути, що описують їх поведінку в межах об'єкта / класу, наприклад: видимість (пов'язана з об'єктно-орієнтованою концепцією інкапсуляції), яка визначає, з яких об'єктів (або класів) може бути використаний метод.
У багатьох об'єктно-орієнтованих мовах всі "функції" належать до якогось об'єкта (або класу), тому в цих мовах немає функцій, які не є методами.
Методи - це функції занять. У звичайному жаргоні люди обмінюються методом і функціонують на всьому протязі. В основному ви можете думати про них як про одне і те ж (не впевнений, що глобальні функції називаються методами).
Функція - це математичне поняття. Наприклад:
f(x,y) = sin(x) + cos(y)
говорить, що функція f () поверне sin sin першого параметра, доданого до косинусу другого параметра. Це просто математика. Як це буває sin () і cos () - це також функції. Функція має ще одну властивість: усі виклики до функції з однаковими параметрами повинні повертати однаковий результат.
Метод, з іншого боку, - це функція, яка пов'язана з об'єктом об'єктно-орієнтованою мовою. Він має один неявний параметр: об'єкт, на який діє (і це стан).
Отже, якщо у вас є об'єкт Z методом g (x), ви можете побачити наступне:
Z.g(x) = sin(x) + cos(Z.y)
У цьому випадку передається параметр x, такий самий, як у прикладі функції раніше. Однак параметр cos () - це значення, яке живе всередині об'єкта Z. Z, а дані, що живуть всередині нього (Zy), - неявні параметри методу g ().
Функція або метод - це іменований фрагмент коду, який можна викликати, який виконує деякі операції і необов'язково повертає значення.
У мові С використовується термін функція. 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, інакше ви виглядатимете дурно.
method
... або я б це назвав procedure
і function
.
Функція - це набір логіки, за допомогою якої можна маніпулювати даними.
Хоча, Метод - це функція, яка використовується для маніпулювання даними об'єкта, де він належить. Так технічно, якщо у вас є функція, яка не повністю пов'язана з вашим класом, але була оголошена в класі, це не є методом; Це називається поганим дизайном.
Методи класу діють на екземпляр класу, який називається об'єктом.
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 # називає їх "методами" - вони просто використовують термін "функції", оскільки реального розрізнення не слід робити.
Нарешті - так що будь-який гуру Паскаля не перескакує на мене тут - Паскаль також розрізняє "функції" (які повертають значення) та "процедури", які цього не роблять. 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
: єдина відмінність - це назва першого параметра (у функції я назвав його «вітаю», у методі я назвав його «само»). Таким чином, я можу використовувати 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! - ви почнете бачити їхню точку. Також деякі мови надають методам спеціальний доступ до бітів об'єкта. Але Основна концептуальна відмінність все ще прихований додатковий параметр.)
для мене: функція методу і функції однакова, якщо я згоден, що:
Як і будь-який фрагмент коду, у вас можуть бути об'єкти, які ви вводите, і у вас може бути об'єкт, який виходить в результаті. Під час цього вони можуть змінити стан об'єкта, але це не змінить їх основного функціонування для мене.
Можливо, існує визначення, що відрізняється у виклику функцій об'єктів чи інших кодів. Але чи не це щось для словесних розбіжностей, і саме тому люди їх обмінюють? Згадується приклад обчислення, з яким я був би обережний. тому що я наймаю найманих працівників, щоб робити свої розрахунки:
new Employer().calculateSum( 8, 8 );
Роблячи це таким чином, я можу покластися на те, що роботодавець несе відповідальність за розрахунки. Якщо він хоче більше грошей, я звільняю його і дозволю функції збору сміття утилізувати невикористаних працівників, а решту і отримати нового працівника.
Навіть стверджуючи, що метод є функцією об'єктів, а функція не пов'язана з обчисленнями, мені не допоможе. Дескриптор функції сам, а в ідеалі документація функції підкаже мені, що йому потрібно і що може повернути. Решта, як маніпулювання станом якогось об'єкта, для мене не дуже прозорі. Я очікую, що і функції, і методи доставлять та маніпулюють тим, про що вони заявляють, не потребуючи детального знання, як вони це роблять. Навіть чиста обчислювальна функція може змінити стан консолі або долучити до журналу.
З мого розуміння, метод - це будь-яка операція, яку можна виконати на уроці. Це загальний термін, що використовується в програмуванні.
У багатьох мовах методи представлені функціями та підпрограмами. Основна відмінність, яку для цих мов використовують більшість мов, полягає в тому, що функції можуть повертати абоненту значення, а підпрограма може не робити. Однак багато сучасних мов мають лише функції, але вони необов'язково не можуть повернути жодного значення.
Наприклад, скажімо, ви хочете описати кішку, і ви хотіли б, щоб вона могла позіхати. Ви створили б клас Cat методом Яун, який, швидше за все, був би функцією без зворотного значення.
Для наближення першого порядку метод (у стилі O ++ стиль OO) - це інше слово для функції члена, тобто функції, що є частиною класу.
На таких мовах, як C / C ++, ви можете мати функції, які не є членами класу; ви не називаєте функцію, не пов'язану з класом, методом.
Функція - це концепція, що в основному належить до процедур орієнтованого програмування де функцією є сутність, яка може обробляти дані та повертати вам значення
Метод - це концепція об'єктно-орієнтованого програмування, де метод є членом класу, який здебільшого виконує обробку на членах класу.
Люди ІМХО просто хотіли вигадати нове слово для полегшення спілкування між програмістами, коли вони хотіли посилатися на функції всередині об’єктів.
Якщо ви говорите методи, ви маєте на увазі функції всередині класу. Якщо ви говорите функції, ви маєте на увазі просто функції поза класом.
Правда полягає в тому, що обидва слова використовуються для опису функцій. Навіть якщо ви неправильно використовували, нічого поганого не відбувається. Обидва слова добре описують, чого ви хочете досягти у своєму коді.
Функція - це код, який повинен грати роль ( функцію ) робити щось. Метод - це метод вирішення проблеми.
Це робить те саме. Це те саме. Якщо ви хочете бути дуже точними та йти разом з умовою, ви можете викликати методи як функції всередині об'єктів.
Я не експерт, але це те, що я знаю:
Функція - це термін мови С, він позначає фрагмент коду, а ім'я функції буде ідентифікатором для використання цієї функції.
Метод - термін OO, зазвичай він має цей покажчик у параметрі функції. Ви не можете викликати такий фрагмент коду, як C, для його виклику потрібно використовувати об'єкт.
Методи виклику також різні. Тут посилайтесь на значення, щоб знайти адресу цього фрагмента коду. C / C ++, час з'єднання буде використовувати символ функції для знаходження.
Objecive-C відрізняється. Викликати значення функції C для використання структури даних для пошуку адреси. Це означає, що все відомо в час виконання.
Я знаю, що багато інших вже відповіли, але я виявив, що це проста, але ефективна відповідь на один рядок. Хоча це виглядає не набагато краще, ніж відповіді інших, але якщо ви уважно прочитаєте, у ньому є все, що вам потрібно знати про метод проти функції.
Метод - це функція, яка має визначений приймач, в термінах OOP метод - це функція на екземплярі об'єкта.
З читання цього документа в Microsoft
Учасники, що містять виконуваний код, спільно називаються членами функції класу. У попередньому розділі описані методи, які є основним видом членів функції. У цьому розділі описані інші види членів функції, які підтримуються C #: конструктори, властивості, індексатори, події, оператори та фіналізатори.
Отже методи - це підмножина функцій. Кожен метод є функцією, але не кожна функція є методом, наприклад, constructor
не можна сказати як метод, але це функція.
Функція - функція в незалежному фрагменті коду, яка включає певну логіку і повинна бути викликана незалежно та визначена поза класом.
Метод - метод - це незалежний фрагмент коду, який викликається посиланням на якийсь об'єкт і визначається всередині класу.
Ось декілька пояснень методу проти функції з використанням прикладів 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();
тут тест () може бути методом якогось об'єкта або визначеним на замовлення прототипом для вбудованих об'єктів, ось додаткове пояснення:
Методи 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, 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");
Деякі посилання: Метод об’єкта Javascript , функції , додаткова інформація про прототип
TL; DR
Функція - це фрагмент коду, який потрібно запустити.
Метод - це функція всередині об'єкта.
Приклад функції:
function sum(){
console.log("sum")l
}
Приклад способу:
const obj = {
a:1,
b:2,
sum(){
}
}
Тому ми говоримо, що ключове слово "це" всередині функції не є дуже корисним, якщо ми не використовуємо його для виклику, застосування або прив'язки. перетворює функцію в метод
Вони часто взаємозамінні, але метод зазвичай посилається на підпрограму всередині класу, а функція зазвичай посилається на підпрограму поза класом. наприклад, у Ruby:
# function
def putSqr(a)
puts a ** 2
end
class Math2
# method
def putSqr(a)
puts a ** 2
end
end
У Java, де все (крім заяв про пакунки та імпорт) має бути всередині класу, люди майже завжди називають їх "методами".