Koks skirtumas tarp metodo ir funkcijos?

Ar kas nors gali pateikti paprastą metodų ir funkcijų paaiškinimą OOP kontekste?

1522
01 окт. willc2 yra nustatytas 01 Oct. 2008-10-01 02:45 '08, 2:45 val. 2008-10-01 02:45
@ 35 atsakymai
  • 1
  • 2

Funkcija - Tai kodas, kuris vadinamas pavadinimu. Tai gali būti perduodami operacijoms (pvz., Parametrams) ir, jei reikia, gali grąžinti duomenis (grąžinimo vertę). Visi į funkciją perduoti duomenys yra aiškiai perduodami.

Metodas yra kodas, pavadintas pavadinimu, susijusiu su objektu. Daugeliu atvejų funkcija yra identiška, išskyrus du pagrindinius skirtumus:

  • Šis metodas netiesiogiai perduoda objektą, kuriam jis buvo skirtas.
  • Šis metodas gali dirbti su duomenimis, esančiais klasėje (prisimindami, kad objektas yra klasės egzempliorius - klasė yra apibrėžimas, objektas yra šių duomenų pavyzdys).

(tai supaprastintas paaiškinimas, ignoruojant taikymo srities problemas ir tt)

1587 m
01 окт. atsakymas Andrew Edgecombe spalio 01 d 2008-10-01 03:00 '08 at 3:00 2008-10-01 03:00

Metodas yra ant objekto.
Funkcija nepriklauso nuo objekto.

„Java“ yra tik metodai.
C atveju yra tik funkcijos.

„C ++“ tai priklausys nuo to, ar esate klasėje.

892
01 окт. Atsakyti Aaron 01 spalis. 2008-10-01 02:51 '08 at 2:51 am 2008-10-01 02:51

„metodas“ yra į „funkciją“ orientuotas objektas. Tai beveik viskas, kas jam yra (t. Y. Nėra realaus skirtumo).

Deja, manau, kad daugelis čia pateiktų atsakymų išlieka arba skatina idėją, kad yra tam tikras sudėtingas, reikšmingas skirtumas.

Iš tiesų - ne tiek jam, bet ir kitiems žodžiams.

[paskutinis papildymas]


Iš tiesų, kadangi Brian Neal šio klausimo komentare nurodė, C ++ standartas niekada nenaudoja termino „metodas“, kai kalbama apie narių funkcijas. Kai kurie žmonės gali tai laikyti ženklu, kad C ++ nėra objekto kalba; vis dėlto norėčiau, kad tai būtų ženklas, kad gana protinga žmonių grupė nemanė, kad yra ypatinga priežastis naudoti kitą terminą.

181
01 окт. Michael Burr Oct 01 atsakymas 2008-10-01 02:48 '08 at 2:48 2008-10-01 02:48

Apskritai: metodai yra klasei priklausančios funkcijos, funkcijos gali būti bet kurioje kitoje kodo srityje, todėl galite nurodyti, kad visi metodai yra funkcijos, bet ne visos funkcijos yra metodai:

Paimkite šį python pavyzdį:

 class Door: def open(self): print 'hello stranger' def knock_door: a_door = Door() Door.open(a_door) knock_door() 

Toliau pateiktas pavyzdys parodo klasę, pavadintą „Durys“, turinčią metodą arba veiksmą, vadinamą „atvira“, kuri vadinama metodu, nes jis buvo paskelbtas klasėje. Yra dar viena kodo dalis su „def“ žemiau, kuri apibrėžia funkciją, tai yra funkcija, nes ji nėra paskelbta klasės viduje, ši funkcija vadina metodą, kurį mes apibrėžiame savo klasėje, kaip matote, ir pagaliau funkciją.

Kaip matote, galite skambinti funkcijai bet kur, bet jei norite skambinti metodu, turite perduoti naują tokio paties tipo objektą, kaip ir metodu deklaruota klasė (klasė. Metodas (objektas)), arba turite skambinti metodu objekto viduje (objektas.Metodas ()), bent jau pythone.

Pagalvokite apie metodus, kuriuos gali atlikti tik vienas subjektas, todėl, jei turite šunų klasę, prasminga turėti žievės funkciją tik šios klasės viduje, ir tai bus metodas, jei taip pat turite asmeninę klasę, kuri galėtų turėti prasmę rašyti funkciją „pašaras“, kuris nepriklauso jokiai klasei, nes gali būti perduodami ir žmonės, ir šunys, ir jūs galite vadinti šią funkciją, nes ji nepriklauso nė vienai klasei.

83
01 окт. atsakymą pateikė Gustavo Rubio 01 okt. 2008-10-01 03:33 '08 at 3:33 2008-10-01 03:33

Labai bendras pagrindinių funkcijų ir metodo skirtumų apibrėžimas:

Funkcijos yra apibrėžtos už klasės, o metodai yra apibrėžti viduje ir iš dalies klasėse.

37
29 окт. Jorgesio atsakymas, spalio 29 d 2014-10-29 02:08 '14 at 2:08 2014-10-29 02:08

Lengva prisiminti:

  • F unkcija → „ F ree“ (nemokamos priemonės, nepriklausančios objektui ar klasei)
  • M metodas → M (objekto ar klasės narys)
29
08 окт. Duc Filan atsakymas, pateiktas spalio 8 d 2017-10-08 03:07 '17 at 3:07 2017-10-08 03:07

Jei norite skaityti čia, tai „Mano įvadas į OO metodus“

Objektinės paradigmos idėja yra „grasinti“ programinę įrangą, kurią sudaro ... geri „objektai“. Objektai realiame pasaulyje turi savybių, pavyzdžiui, jei turite Darbuotoją, darbuotojas turi vardą, darbuotojo ID, pareigas, padalinį ir kt. Ir taip toliau

Objektas taip pat žino, kaip elgtis su savo atributais ir atlikti kai kurias operacijas. Tarkime, jei norime žinoti, ką darbuotojas dabar daro, mes paklausime jo.

 employe whatAreYouDoing. 

Šis „whatAreYouDoing“ yra „pranešimas“, išsiųstas objektui. Objektas žino, kaip atsakyti į šiuos klausimus, teigia, kad jis turi „metodą“ problemai išspręsti.

Taigi, kaip objektai turėtų rodyti savo elgesį, vadinami metodais. Taigi, artefaktų metodai turi daryti kažką.

Kiti galimi metodai:

 employee whatIsYourName employee whatIsYourDepartmentsName 

ir kiti

Kita vertus, funkcijos yra būdai, kuriais programavimo kalba turi apskaičiuoti kai kuriuos duomenis, pavyzdžiui, galite turėti funkciją addValues ​​(8, 8), kuris grąžina 16

 // pseudo-code function addValues( int x, int y ) return x + y // call it result = addValues( 8,8 ) print result // output is 16... 

Kadangi pirmosios populiarios programavimo kalbos (pvz., Fortranas, c, pascal) nepriėmė OO paradigmos, jos tik nurodo šiuos šių objektų „artefaktus“.

pavyzdžiui, ankstesnė C funkcija:

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

Negalima teigti, kad objektas turi „funkciją“ atlikti tam tikrą veiksmą, nes funkcijos yra labiau susijusios su matematine medžiaga, o Darbuotojas turi mažai matematikos, tačiau jūs galite turėti metodų, kurie tiksliai atitinka funkcijas, pvz., „Java“ tai bus lygiavertė addValues ​​funkcija.

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

Atrodo pažįstamas? Taip yra dėl to, kad „Java“ šaknis yra C + + ir C ++.

Galų gale, tai tik koncepcija, jie gali atrodyti vienodi įgyvendinant, tačiau OO dokumentuose jie vadinami metodu.

Čia yra ankstesnio „Java“ darbuotojo objekto pavyzdys.

 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. 

Tada skirtumas yra „domene“, kur jis taikomas.

„AppleScript“ supranta „natūralios kalbos“ matphorą, kuris tam tikru momentu turėjo OO. Pavyzdžiui, „Smalltalk“. Tikiuosi, kad jums bus lengviau suprasti objektų metodus po to, kai jį perskaitysite.

PASTABA. Kodas neturėtų būti rengiamas, tik kaip pavyzdys. Nesivaržykite keisti pranešimą ir pridėti Python pavyzdį.

26
01 окт. atsakymas pateikiamas OscarRyz 01 okt. 2008-10-01 03:21 '08 3:21 am. 2008-10-01 03:21

OO pasaulyje šie du būdai dažniausiai reiškia tą patį.

Iš tikrųjų matematikos ir CS funkcija visada grąžina tą patį rezultatą, kai skambinama tais pačiais argumentais (f (x, y) = (x + y)). Kita vertus, metodas paprastai siejamas su klasės egzemplioriumi. Vėlgi, dauguma šiuolaikinių OO kalbų dažniausiai nenaudoja termino „funkcija“. Daugelis statinių metodų gali atrodyti kaip funkcijos, nes paprastai jų nėra (ne visada teisinga).

16
01 окт. Atsakymą pateikė TheSoftwareJedi 01 okt. 2008-10-01 02:56 '08 at 2:56 nuo 2008-10-01 02:56

Tarkime, kad funkcija yra kodo blokas (paprastai su savo taikymo sritimi, o kartais ir su savo uždarymu), kuris gali imtis tam tikrų argumentų ir taip pat gali grąžinti rezultatą.

Metodas yra objektui priklausanti funkcija (kai kuriose objekto sistemose yra teisingiau sakyti, kad ji priklauso klasei). Būdamas „priklausantis“ objektas / klasė, nurodote metodą per objektą / klasę; pavyzdžiui, „Java“, jei norite skambinti „atviram“ () („open“) metodui, kuris priklauso objektui „duris“, turite parašyti „door.open ()“.

Paprastai metodai taip pat gauna papildomų atributų, kurie apibūdina jų elgesį objekte / klasėje, pavyzdžiui: matomumas (susietas su objektais orientuota kapsulių samprata), kuris nustato, nuo kokių objektų (ar klasių) gali būti naudojamas metodas.

Daugelyje objektų orientuotų kalbų visos „funkcijos“ reiškia objektą (ar klasę), todėl šiomis kalbomis nėra jokių funkcijų.

14
01 окт. Atsakymas, kurį pateikė Mike Tunnicliffe Oct 01 2008-10-01 02:55 '08 at 2:55 am 2008-10-01 02:55

Funkcija arba metodas yra vadinamasis pakviestas fragmentas, kuris atlieka kai kurias operacijas ir nebūtinai grąžina vertę.

C atveju naudojama sąvoka „funkcija“. „Java“ ir „ C #“ žmonės pasakys šį metodą (ir funkcija šiuo atveju yra apibrėžta klasės / objekto viduje).

C ++ programuotojas gali jį pavadinti funkcija arba kartais metodas (priklausomai nuo to, ar jie rašo procesinį C + + kodą, ar į objektą orientuotą C + + kelią, taip pat tikėtina, kad C / C ++ programuotojas jį vadins funkcija, C / C ++ literatūroje dažniau vartojamas terminas „metodas“).

Jūs naudojate šią funkciją tiesiog pavadindami šį pavadinimą, pvz.,

 result = mySum(num1, num2); 


Jūs vadinate metodą, pirmiausia nurodydami jo objektą, pvz.

 result = MyCalc.mySum(num1,num2); 
11
06 февр. Abdullah Leghari atsakymas 06 vasario mėn. 2014-02-06 08:03 '14 at 8:03 2014-02-06 08:03

Istoriškai gali būti subtilus skirtumas, kai „metodas“ yra kažkas, kas negrąžina vertės ir „funkcija“. Kiekviena kalba turi savo terminų žodyną, turintį ypatingą reikšmę.

„C“ žodis „funkcija“ reiškia programos procedūrą .

Java“ sąvoka „funkcija neturi jokios specialios reikšmės. Nors „ metodas “ reiškia vieną iš subroutinų, sudarančių klasės įgyvendinimą.

C # , kuris atrodys taip:

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

Bet iš tiesų kartoju, kad dviejose sąvokose nėra skirtumo. Jei neoficialiose diskusijose apie „Java“ vartojate terminą „funkcija“, žmonės mano, kad tai reiškia „metodą“ ir tęskite. Nenaudokite jo atitinkamuose dokumentuose ar pristatymuose apie „Java“, priešingu atveju atrodys kvailas.

11
12 янв. Atsakymą pateikė Jaimin Patel 12 sausis 2016-01-12 05:13 '16 at 5:13 2016-01-12 05:13

Funkcija - matematinė koncepcija. Pavyzdžiui:

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

sako, kad f () funkcija grąžins pirmojo parametro, pridėto prie antrojo parametro kosinui, nuodėmę. Tai tik matematika. Kadangi sin () ir cos () taip pat yra funkcijos. Funkcija turi skirtingą savybę: visi funkcijų skambučiai su tais pačiais parametrais turi grąžinti tą patį rezultatą.

Kita vertus, metodas yra funkcija, susijusi su objektu orientuota kalba. Jis turi vieną netiesioginį parametrą: paveiktą objektą (ir jo būseną).

Taigi, jei turite Z objektą su g (x) metodu, galite pamatyti:

 Zg(x) = sin(x) + cos(Zy) 

Tokiu atveju parametras x yra perduodamas, tas pats, kaip ankstesniame pavyzdyje. Tačiau parametras cos () yra vertė, kuri gyvena Z objekte, o jo viduje esantys duomenys (Zy) yra netiesioginiai Z g metodo parametrai ().

11
01 окт. atsakymas, kurį pateikė Bradley Mazurek, spalio 01 d 2008-10-01 03:54 '08 at 3:54 2008-10-01 03:54

Metodai yra klasių funkcijos. Paprastame žargone žmonės visur keičiasi metodu ir funkcija. Iš esmės jūs galite galvoti apie tuos pačius (nežinote, ar pasaulinės funkcijos vadinamos metodais).

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

10
01 окт. atsakymas duotas pareiškimas 01 okt. 2008-10-01 02:52 '08 at 2:52 am 2008-10-01 02:52

OO kalbomis, tokiomis kaip Object Pascal arba C ++, „metodas“ yra funkcija, susijusi su objektu. Pavyzdžiui, objektas „Šuo“ gali turėti „žievės“ funkciją, ir tai bus laikoma „metodu“. Priešingai, „StrLen“ funkcija yra viena (ji suteikia argumentų pateikiamos eilutės ilgį). Todėl tai tiesiog „funkcija“. „Javascript“ yra techniškai objektyvus, tačiau turi daug apribojimų, palyginti su visomis kalbomis, pvz., „C ++“, „C #“ arba „Pascal“. Tačiau šis skirtumas dar turi išlikti.

Kai kurie papildomi faktai: C # yra visiškai objekto objektas, todėl negalite sukurti autonominių „funkcijų“. C #, kiekviena funkcija yra susieta su objektu ir todėl techniškai yra „metodas“. Kicker yra tai, kad nedaugelis žmonių C # vadina juos „metodais“ - jie tiesiog naudoja terminą „funkcijos“, nes nėra jokio realaus skirtumo.

Galiausiai - taip, kad visi Paskalo guru čia nekyla, - Pascal taip pat atskiria „funkcijas“ (kurios grįžta vertė) ir „procedūros“, kurios nėra. C # nepadaro tokio skirtumo aiškiai, nors, žinoma, galite pasirinkti vertę arba ne.

7
01 окт. atsakymas, kurį pateikė Mark Brittingham, spalis 01 2008-10-01 02:59 '08, 02:59, 2008-10-01 02:59

Klasės veiksmų metodai klasės egzemplioriui, vadinamam objektu.

 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" } } 
7
01 окт. atsakymas duotas pareiškimas 01 okt. 2008-10-01 02:57 '08 at 2:57 2008-10-01 02:57

Kadangi paminėjote „Python“, žemiau pateiktoje iliustracijoje gali būti naudingas metodų ir objektų ryšys daugelyje šiuolaikinių objektų orientuotų kalbų. Trumpai tariant, tai, ką jie vadina "metodas", yra tik funkcija, kuri užima papildomą argumentą (kaip ir kiti atsakymai), bet Python daro jį aiškesnį nei dauguma kalbų.

 # 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") 

Dabar palyginkite funkciją greet_with_greeter ir metodą greet : vienintelis skirtumas yra pirmojo parametro pavadinimas (funkcijoje, kurią greet_with_greeter “, metode, kurį greet_with_greeter „aš“). Todėl greet metodą galiu naudoti tokiu pat būdu, kaip ir naudodamas „ greet_with_greeter funkciją (naudodamas „taškų“ sintaksę, kad galėčiau jį naudoti, kaip apibrėžiau klasėje):

 Greeter.greet(hello_greeter, "World") 

Taigi, aš veiksmingai pavertiau metodą į funkciją. Ar galiu perjungti funkciją į metodą? Na, kadangi „Python“ leidžia jums bendrauti su klasėmis po jų apibrėžimo, pabandykite:

 Greeter.greet2 = greet_with_greeter hello_greeter.greet2("World") 

Taip, funkcija „ greet_with_greeter dabar taip pat žinoma kaip greet2 metodas. Tai parodo vienintelį realų skirtumą tarp metodo ir funkcijos: kai skambinate į objektą metodu, skambinant object.method(args) , kalba stebuklingai ją paverčia method(object, args) .

(OO puristai gali teigti, kad metodas skiriasi nuo funkcijos, o jei pateksite į pažangiąją „Python“ ar „Ruby“ arba „Smalltalk!“ - pradėsite matyti savo tašką. pasirinktinis parametras.)

7
01 окт. Atsakymas Sam Stokes 01 spalis 2008-10-01 04:20 '08 at 4:20 2008-10-01 04:20

Funkcija yra loginių elementų rinkinys, kuriuo galima manipuliuoti duomenimis.

Nors metodas yra funkcija, naudojama valdyti objekto, kuriam jis priklauso, duomenis. Techniškai, jei turite funkciją, kuri nėra visiškai susijusi su jūsų klase, bet buvo paskelbta klasėje, tai nėra metodas; Jis vadino blogą dizainą.

7
03 дек. atsakymą pateikė gian ebao 03 dec. 2008-12-03 12:47 '08, 12:47, 2008-12-03 12:47

Funkcija yra logikos rinkinys, kuriuo galima manipuliuoti duomenimis. Nors metodas yra funkcija, naudojama valdyti objekto, kuriam jis priklauso, duomenis. Techniškai, jei turite funkciją, kuri nėra visiškai susijusi su jūsų klase, bet buvo paskelbta klasėje, tai nėra metodas; Jis vadino blogą dizainą.

7
25 февр. Debaprasad pateikiamas vasario 25 d 2014-02-25 07:40 '14 at 7:40 2014-02-25 07:40

man: metodo ir funkcijos funkcija sutampa, jei sutinku su tuo, kad:

  • funkcija gali grąžinti vertę
  • gali tikėtis parametrų

Kaip ir bet kuris kodas, galite įterpti objektus, todėl gali būti rodomas objektas. Runtime jie gali pakeisti objekto būseną, tačiau tai nepakeis jų pagrindinio veikimo.

Gali būti apibrėžimas, kuris skiriasi, kai skambina objektų ar kitų kodų funkcijos. Bet ar tai nėra kažkas verbalinių skirtumų ir kodėl žmonės juos keičia? Kaip pavyzdį skaičiavimo pavyzdžiui, būčiau atsargus. nes samdyti darbuotojus atlikti savo skaičiavimus:

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

Taigi galiu pasikliauti tuo, kad už skaičiavimus yra atsakingas darbdavys. Jei jis nori daugiau pinigų, aš jį išlaisvinsiu ir leisiu perkrauti nereikalingus darbuotojus likusiam ir gauti naują darbuotoją.

Net teigdamas, kad metodas yra objektų funkcija, o funkcija nėra susijusi, skaičiavimas man nepadės. Pats funkcijų deskriptorius ir idealiu atveju funkcijų dokumentai man pasakys, ko jam reikia ir ką jis gali sugrįžti. Likusi dalis, kaip manipuliavimas su tam tikra objekto būsena, man nėra labai skaidri. Tikiuosi, kad tiek funkcijos, tiek metodai suteiks ir manipuliuoja tai, ką jie nurodo, nežinant išsamiai, kaip jie tai daro. Net gryna skaičiavimo funkcija gali pakeisti konsolės būseną arba pridėti prie žurnalo failo.

6
13 апр. Dirk Schumacher atsakymas, pateiktas balandžio 13 d 2012-04-13 12:50 '12 12:50 val. 2012-04-13 12:50

Mano supratimu, metodas yra bet kokia operacija, kurią galima atlikti klasėje. Tai yra bendras terminas, naudojamas programuojant.

Daugelyje kalbų metodai yra pavaizduoti funkcijomis ir pogrupiais. Pagrindinis skirtumas, kurį daugelis kalbų vartoja jiems, yra ta, kad funkcijos gali grąžinti vertę atgal skambinančiajam ir subroutinas gali neveikti. Tačiau daugelis šiuolaikinių kalbų turi tik funkcijas, tačiau jos nebūtinai turi jokios reikšmės.